Következő Előző Tartalom

13. Több fejes framebufferek használata

A dokumentáció ezen része Frederick A. Niles-nek köszönhető, aki fenntartja az itt megjelenő információk jogát.

13.1 Bevezetés

E dokumentáció fő célja, hogy bevezessen a kétfejes Linux konfiguráció futtatás rejtelmeibe. Bár ez a folyamat nagyon egyszerű, több probléma felléphet, amik aztán balul üthetnek ki.

A példa, amire koncentrálok, egy X szerver futtatása lesz a második monitoron. Ezt szépnek találom, mivel sokan találhatnak régi, nagy 19-21 inches fix frekvenciájú monitorokat, amiket kidobnak az emberek, mert nem tudják használni. Így elindíthatod a rendszered egy kis multisync monitorral, és használhatod X alatt a szép nagy monitort.

Kérlek értsd meg, hogy a két fejes támogatás jelenleg fejlesztés alatt áll, így gyorsan változik ez az információ. Ebben a dokumentációban bármi lehet már most elavult, vagy egyszerűen helytelen már most, amikor ezt olvasod.

** FIGYELEM ** Ez a dokumentáció az XFree86 4.0 kiadása előtt készült. Ha az XFree86 4.0 megjelenése után olvasod ezt, már sokminden megváltozott. Próbáld meg beszerezni e dokumentáció újabb változatát.

13.2 Visszajelzés

A dokumentációval kapcsolatos visszajelzéseket természetesen örömmel fogadjuk. A vissyajelzéseitek nélkül nem is létezhetne ez a dokumentáció. Így kérlek, minden hozzáfűznivalót, megjegyzést, kritikát küldj a következő címre: Frederick.A.Niles@gsfc.nasa.gov.

13.3 Közreműködők

A következő emberek működtek közre e mini-HOGYAN elkészítésében.

* Petr Vandrovec vandrove@vc.cvut.cz

* Andreas Ehliar ehliar@lysator.liu.se (x2x)

* Marco Bizzarri m.bizzarri@icube.it (több X szerver)

13.4 Lemondás a szabványokról

Semmi kötelezettséget nem fogadunk el e dokumentáció tartalmával kapcsolatban. Az elképzeléseket, példákat és egyéb részeit saját felelősségedre használhatod. Mivel ez egy újdonsült dokumentáció, tartalmazhat hibákat és elírásokat, amik tönkretehetik a rendszered. Használd ezért különleges körültekintéssel és bár ez elég szokatlan, nem vállalok semmi felelősséget, mely e dokumentáció használatának következményeiből eredne.

13.5 Copyright Információk

A dokumentáció ezen részét (c)1999 Frederick Niles másolásjog védi, és a következő feltételek mellett terjeszthető:

* A Linux HOWTO dokumentációk egészben, vagy részeiben reprodukálhatók terjeszthetők, akármilyen fizikai vagy elektronikus médián, amíg ez a copyright figyelmeztetés változatlanul szerepel az összes másolaton. Kereskedelmi terjesztés engedélyezett és bátorított, bár a szerző szeretne értesülni az ily módon terjesztett példányokról.

* Minden fordítás, leszármazott munkák, vagy összegyűjtött munkák bármely Linux HOWTO dokumentáció esetén e copyright figyelmeztetéssel együtt kell, hogy terjesztődjenek. Így, nem készíthetsz egy Linux HOWTO-ból leszármaztatott munkát, és nem vethetsz ki rá terjesztés beli korlátozást. Kivételt lehet kérni bizonyos körülmények között e szabályok alól, vedd fel a kapcsolatot a Linux HOWTO koordinátorral a lent szereplő címen.

* Ha kérdésed van, vedd fel a kapcsolatot a Linux HOWTO koodinátorral, a linux-howto@sunsite.unc.edu címen

13.6 Milyen hardver támogatott?

A legtöbb videokártya feltételezi, hogy ő az egyetlen a rendszerben és állandó címmel elsődleges megjelenítő kártyának van beállítva. Van azonban néhány kivétel:

* Matrox kártyák: Ez magába foglalja a Matrox Millennium, Matrox Millennium II, Matrox Mystique, Matrox Mystique 220, Matrox Productiva G100, Matrox Mystique G200, Matrox Millennium G200 és Matrox Marvel G200 video kártyákat.

* MDA: Ide soroljuk a monokróm Hercules grafikus adaptereket több mással egyetemben. Ez csak szöveges második fej támogatást nyújt.

Megjegyzés: csak a második kártyának kell a fentiek valamelyikének lennie.

13.7 Kereskedelmi támogatás

Ez a mini-HOGYAN elsősorban szabad szoftverhez készült. Azonban létezik néhány kereskedelmi X szerver, ami rendelkezik több-fejes támogatással. Ezek közé tartozik a Metro Link (www.metrolink.com) Metro-X szervere és az Xi Graphics (www.xig.com) Accelerated-X szervere.

13.8 Az összes cucc beszerzése.

A következő patch-ekre és programokra lesz szükséged:

* "fbset" program próbáld itt: http://www.cs.kuleuven.ac.be/ geert/bin/ (megjegyzés: ez a program a RedHat 6.0-al jön)

* "fbaddon" Matrox dual head patch-ek Linux kernelhez próbáld itt: ftp://platan.vc.cvut.cz/pub/linux/matrox-latest/

* "con2fb" program próbáld itt: ftp://platan.vc.cvut.cz/pub/linux/matrox-latest/

* X11 frame buffer szerver, XF86_FBDev. Ez az XFree86 3.3.1 szabványos része

13.9 Kezdjünk bele

Az első dolog, amit tenned kell, hogy alkalmazod a Linux forrás másolatára az "fbaddon" patch-et. Ezután be kell konfigurálnod a kernelt, majd bekapcsolni a frame buffer támogatást. Ha Matrox kártyád van, kapcsold be a Matrox általánosított gyorsított meghajtó támogatását és a kártyádnak megfelelő típust is add meg. Ne kapcsold be a VESA framebuffer támogatást. Csak ütközést okoz. Kapcsold be (természetesen) a többfejes támogatást. Készítsd el a kernelt és indítsd újra a rendszert.

Most fel kell telepítened az "fbset" programot és gondosan át kell olvasnod az összes vele kapcsolatos dokumentációt, hogy hogyan adhatod meg a beállításokat. Erősen javasolt az "/etc/fb.modes" állomány használata, ha már eldöntötted, milyen beállításokat használsz. Az fbset program tartalmaz egy Perl szkriptet, amivel átalakíthatod az XF86Config állományodat fb.modes beállításokká. Az A és B függelékben csatoltam a saját octave/Bourne parancsértelmező szkriptemet, hogy átalakíthasd az XF86Config állományodat.

Hozzá kell szoknod a framebuffer eszköz használatához a monitorodon, meg kell értened minden olyan dolgot, amire a ugyan első pillantásra nincs szükséged a többfejes támogatáshoz, de később rengeteg fejfájást takaríthat meg neked.

Arra fogok öszpontosítano a magyarázatomban, hogy a második monitoron elinduljon egy X, utána bármi más konfiguráció beállítása nyilvánvaló részhalmaza lesz a már elvégzett eljárásoknak.

Mozduljunk egy konzollal odébb...

Fordítsd le a "con2fb" programot. Ha argumentum nélkül futtatod, a következő használati utasítást kapod:

"usage: con2fb fbdev console".

Így a példa utasítás "con2fb /dev/fb1 /dev/tty6" lesz, hogy áthelyezd a hatodik virtuális konzolt a második monitorra. Használd a CTRL-ALT-F6 billentyűzet kombinációt a konzolra váltáshoz, és lám, tényleg a második monitoron tűnik fel.

Az "fbset" program használata a második monitor beállításához

Csak annak a monitornak a beállításait változtatja meg az "fbset" program, amelyik képernyőn futtatod. Ezért óvatosan kell bánnod az "-fb" kapcsolóval a második monitoron. Bizonyos esetekben ha nem teszel semmi mást, legalább a virtuális függőleges felbontást szeretnéd az aktuális függőleges felbontássá tenni.

pl. "fbset -fb /dev/fb1 -vyres 600"

Ez rettenetesen lelassítaná a szöveges üzemmódot, de az X visszataszító lenne e nélkül.

Az X beállítása framebuffer támogatására.

A framebuffer.txt állomány ezt nálam sokkal jobban elmagyarázza, de azért álljon itt két nagyon fontos pont.

Győződj meg róla, hogy átállítottad az "X" láncot, hogy az "XF86_FBDev"-re mutasson.

Ezután hozzá kell adnod egy monitor szekciót az XF86Config állományodban a framebuffer eszköz számára. Íme egy példa:

# A framebuffer szerver

Section "Screen"
    Driver      "fbdev"
    Device      "Millennium"
    Monitor     "NEC MultiSync 5FGp"
    Subsection "Display"
        Depth       8
        Modes       "default"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       16
        Modes       "default"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       24
        Modes       "default"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       32
        Modes       "default"
        ViewPort    0 0
    EndSubsection
EndSection

A "default" üzemmódokat használom, mivel nem hiszem, hogy bármely más érték működne a Matrox framebuffer esetében.

Próbáld meg elindítani az X szervert a második monitoron.

Állítsd a FRAMEBUFFER változót a második framebufferre.

"export FRAMEBUFFER=/dev/fb1"

vagy

"setenv FRAMEBUFFER /dev/fb1"

Úgy kell elindítanod az X szervert, hogy egyaránt egyezzen a kiválasztott színmélység és ugyanazon a monitoron jelenjen meg, ahonnan az X szervert indítottad.

pl. "startx -- :0 -bpp 16 vt06"

Ez a példa elindítja a "nulladik" X szervert a hatos virtuális konzolon 16 bites színnel. Használd az ":1"-et a másik X szerver indításához másik framebufferen, így egyszerre két X szervered futhat.

13.10 Összefoglalás

A második monitoron való X szerver futtatásának fontosabb lépései a következő pontokban foglalható össze:

* Szerezz kernel patch-et, fbset, és con2fb programokat.

* Patch-eld meg a kernelt, konfiguráld, építsd újra és indítsd újra a gépet.

* Add hozzá az XF86_FBDev szekciót az XF86Config állományhoz és állítsd be az X láncot.

Minden esetben, amikor újraindítod a géped:

* Helyezz át egy konzolt. pl. "con2fb /dev/fb1 /dev/tty6"

* Állítsd be a paramétereket pl. "fbset -fb /dev/fb1 1280x1024"

* Állítsd be a FRAMEBUFFER változót. pl. "export FRAMEBUFFER=/dev/fb1"

* Indítsd el az X szervert. pl. "startx -- -bpp 16 vt06"

Automatizálhatod ezt minden egyes újraindítás alkalmával parancsértelmező alias használatával. Alias-nak kell lennie és nem parancsértelmező szkriptnek, mivel fel kell insmernie az aktuális konzol számát. Ez az én C-parancsértelmező alias-om, ami az X-et a második, rögzített frekvenciájú monitoromon indítja:

alias startxfb = "
setenv FRAMEBUFFER /dev/fb\!*;    # beállítja a környezeti változót a parancs argumentumára.
con2fb $FRAMEBUFFER /dev/$tty;    # Elmozdítja az fb-t az aktuális tty-re.
fbset -fb $FRAMEBUFFER 1280x1024@62;  # Kedvenc az /etc/fb.modes-ból.
startx -- :\!* -bpp 16 vt0`echo $tty | cut -dy f 2`' # X ezen a tty-n.
"

A .cshrc állományomban ez mind ugyanabban a sorban található együtt, a megjegyzések nélkül, de a könnyebb olvashatóság érdekében sortörést tettem bele, valamint megjegyzéseket szúrtam be magyarázat gyanánt. A framebuffer sorszámát argumentumként átadom neki és már indul is az X.

Nem vagyok biztos benne, hogy hogyan kell ugyanezt az alias-t bash alatt elkészíteni. Nem tudom, hogyan kell meghatározni az aktuális tty-t, vagy hogyan kell az argumentumokat átadni a bash-nek. Ha valaki elmondaná, beszúrnám ide. Habár használhatod a "tty" utasítást, hogy megtudd az aktuális VT nevét és egyszerűen két külön alias-t adsz mindkét X szervernek.

13.11 Egyéb megjegyzések és problémák

* Az "fbset" és a "startx" egyaránt ugyanarról a framebuffer-ről kell, hogy fussanak. Ez a súlyos korlátozás gátat szab a szkriptekből történő automatizálásnak.

* Az XFree86 4.0-ben "megfelelő" több-fejes támogatás lesz, de a 3.3.1 nem rendelkezik ezzel. Futtathatsz két külön szervert 3.3.1-el, és használhatod az x2x-et, hogy kapcsolgass közöttük, habár... (lásd a következő pontot)

* Az inaktív framebuffer a használata utolsó képkockáját tartalmazza, nem fog frissülni.

* A monitor, ami nincs kiválasztva, nem őrzi meg az állapotát, ha nem aktív (De azért általában megteszi.).

* Geert Uytterhoeven (a framebuffer karbantartója) és Linus Torvalds nem értenek egyet a jelenlegi "framebuffer per VT" többfejes konzol támogatás változtatásban (pl. fbaddon), így lehet, hogy soha nem lesz a kernel fa fő csapása ez a téma. (Ezt harmadkézből hallottam, és elképzelhető, hogy semmi sem igaz belőle.)

* Ha "megszeged a szabályokat" és az X szervert másik monitorról indítod ("startx" futtatása), a gép csúnyán össze fog omlani a billentyűzet és az egér bemenetének összekeveredésével.

* A framebuffer.txt dokumentáció a kernel forrásban elmagyarázza, hogy az XF86Config állomány Modeline beállítását közvetlenül is használhatod az X szerver futtatásához. A Matrox framebuffer használata úgy látszik arra kényszeríti az X szervert, hogy szabaduljon meg mindezektől. így egy időben csak egy ("default") beállításod lehet (ugyanaz, mint szöveges üzemmódban).

* Az XF86_FBDev nem gyorsított. Habár létezik patch a gyorsított Matrox támogatásra a http://www.in-berlin.de/User/kraxel/xfree86/ címen.

Az "ötös init szint" (azaz az xdm/gdm) működésre bírása

Még nem találtam rá megoldást, hogy hogyan lehetne ötös init szintben elindítani a gépet két monitoros konfigurációval (és tulajdonképpen a szerver megvan a második monitoron vagy mindkettőn). Míg elég egyszerűnek tűnik egy új sor hozzáadása a gdm/xdm Xservers állományához, az a megkötés, hogy ugyanarról a framebuffer-ről kell indítanod az X szervert, megakadályozza a nyilvánvaló megoldást a működésben. Ha valaki talál rá megoldást, kérem, küldje el E-mail-ben nekem és beillesztem ide.

Az x2x program használata.

Létezik egy aranyos kis program, az x2x, ami X szerverek között kapcsolgat neked, ha a képernyő széléhez érsz. A program legutóbbi ismert honlapja a http://ftp.digital.com/pub/DEC/SRC/x2x/ címen volt. Ez egy opcionális Debian csomag is egyúttal. Még nem próbáltam, de több felhasználó sikeres használatot jelzett.

Egyéb hasznos utasítások

Ezek létező Linux utasítások, amik megérdemlik, hogy az ember emlékezzen rájuk, amikor többfejes konfigurációval küzd (különösen, ha szkripteket ír).

* A "chvt" lehetővé teszi a virtuális terminálok közötti váltást.

* Az "openvt" új virtuális terminálon (VT)indít programot.

* A "tty" visszaadja az aktuális terminál nevét.

A. Függelék - Octave cvtmode.m szkript

(jegyezzük meg a bpp beállítást)

#!/usr/bin/octave -q
bpp = 16;
DCF = sscanf(argv(1,:), "%f");
HR  = sscanf(argv(2,:), "%f");
SH1 = sscanf(argv(3,:), "%f");
SH2 = sscanf(argv(4,:), "%f");
HFL = sscanf(argv(5,:), "%f");
VR  = sscanf(argv(6,:), "%f");
SV1 = sscanf(argv(7,:), "%f");
SV2 = sscanf(argv(8,:), "%f"); 
VFL = sscanf(argv(9,:), "%f");
pixclock = 1000000 / DCF;
left_margin = HFL - SH2;
right_margin = SH1 - HR;
hsync_len = SH2 - SH1;

# 3) függőleges idők:
upper_margin = VFL - SV2;
lower_margin = SV1 - VR;
vsync_len = SV2 - SV1;

RR = DCF / (HFL * VFL) *1e6;
HSF = DCF / HFL * 1e3;

printf("mode \"%dx%d\"\n",HR,VR);
printf("   # D: %3.2f MHz, H: %3.2f kHz, V: %2.2f Hz\n", DCF, HSF, RR);
printf("   geometria %d %d %d %d %d\n", HR, VR, HR, VR, bpp);
printf("   idők %d %d %d %d %d %d %d\n", ...
                                 pixclock, left_margin, right_margin, ...
                                 upper_margin, lower_margin, ...
                                 hsync_len, vsync_len);
printf("endmode\n");

B. Függelék - Borne Shell szkript "cvtfile"

(Ez hívja meg az octave szkriptet, a "cvtmode"-t)

#!/bin/sh

# Shell szkript, mely átalakítja az XF86Config állományt fb.modes állománnyá.
# A cvtmode.m octave szkriptet használja

if [ -z $1 ]; then
  FILE=/etc/X11/XF86Config
else
  FILE=$1
fi

i=1
LEN=`grep Modeline $FILE | wc -l`
while expr $i \< $LEN > /dev/null ;
do
  CURLINE=`grep Modeline $FILE | cut -d'"' -f 3-20 | head -$i | tail -1 `
  ./cvtmode.m $CURLINE
  echo " "
  i=`expr $i + 1`
done


Következő Előző Tartalom