Wątek dedykuję początkującym użytkownikom mającym problemy z działaniem serwera Xorg lub wcześniejszych wersji X Window, w szczególności problemy z samym uruchomieniem, zmianą rozdzielczości lub sprzętową akceleracją 3D. Pomysł jego napisania wziął się z konieczności powtarzania użytkownikom tych samych informacji. Chciałbym te informacje tu zgromadzić.
Niemal zawsze warto zajrzeć do pliku z konfiguracją narzuconą serwerowi podczas uruchamiania. Zazwyczaj jest to
/etc/X11/xorg.conf. Można o nim przeczytać w
man xorg.conf. W sieci i innych źródłach może trafić się podręcznik napisany dla innej wersji serwera, zatem najlepiej otworzyć manual z paczki własnego systemu. Począwszy od którejś wersji, serwer Xorg szuka też plików o nazwach *.conf w katalogu /etc/X11/xorg.conf.d (przynajmniej domyślnie).
Skarbnicą wiedzy bywa dziennik, do którego serwer Xorg zapisuje mnóstwo komunikatów, także tych o błędach. Na ogół jest to plik
/var/log/Xorg.0.log.
Spróbuj zadać sobie trud znalezienia w tym dzienniku informacji związanej z problemem. Jeśli nie czujesz się na siłach, wklej oba wyżej wymienione pliki, by zatrudnić do tego kogoś z nas.
Ponieważ oba pliki mogą być bardzo długie i wymagają nieraz więcej wytężania wzroku niż zwykły tekst, proszę wklejać zawartości plików z znaczniki
CODE, który wyróżni ich większą maszynową czcionką i opakuje w ramkę.
To oczywiście nie wyczerpuje wielu problemów, ale w sporej ilości przypadków jest punktem wyjścia do dalszego poszukiwania.
Jeśli spotkamy również w /var/log pliki z "1", "2", zamiast "0", to prawdopodobnie są to dzienniki (logi) z wcześniejszych uruchomień serwera - niekoniecznie jednak z ostatnich. Dla przykładu, w moim Debianie dziennik z przedostatniego uruchomienia ma nazwę Xorg.0.log.old.
Nowe wersje serwera Xorg zmierzają w kierunku coraz większej autodetekcji sprzętu i autokonfiguracji. Wiele wpisów w xorg.conf, które kiedyś były obowiązkowe, teraz przestają być wymagane, chyba że mamy problem lub chcemy sami coś narzucić serwerowi.
W przypadku problemów ze sprzętową akceleracją 3D warto sprawdzić kilka następujących rzeczy.
Dla części sprzętu sprawdzamy czy do jądra załadowane muszą być sterowniki AGP dla konkretnego czipsetu. Polecenia
lspci i
lsmod są tu przydatne. Nie wiem na razie, czego wymaga jądro dla sprzętowej akceleracji 3D na szynie PCI Express.
Podobnie jak jądro, Xorg też próbuje ładować sobie kilka kodów (również zwanych modułami) związanych z akceleracją 3D. Są to co najmniej "dri" i "glx", dołączane zazwyczaj jako część paczki z serwerem. W starszych wersjach Xorg należało samodzielnie zadeklarować ich użycie:
W nowszych (od wersji 1.3) serwer powinien domyślnie załadować je sam, a wymusić brak załadowania możemy przez zamianę "Load" na "Disable".
Pozostaje jeszcze do załadowania kawałek kodu tworzony niezależnie od Xorg, służący zazwyczaj do wykonywania poleceń OpenGL. W przypadku otwartych sterowników instalujemy bibliotekę Mesa, jeśli tylko wspiera poprawnie naszą kartę graficzną.
W przypadku zamkniętych sterowników sytuacja może się trochę różnić. Zawierają one zarówno kod dla jądra, jak i biblioteki GL.
Paczka Mesy posiada polecenie
glxinfo, które pozwala sprawdzić czy sprzętowa akceleracja 3D działa.
linux $ glxinfo | grep -E 'direct rendering|OpenGL version string|OpenGL renderer string'
direct rendering: Yes
OpenGL renderer string: Mesa DRI R200 20060602 AGP 4x x86/MMX+/3DNow!+/SSE TCL
OpenGL version string: 1.3 Mesa 7.0.4
W zamkniętych sterownikach Radeona można skorzystać z polecenia fglrxinfo.
Polecenie
xrandr pokazuje rozdzielczości wraz z odświeżaniem dostępne w danej sesji serwera Xorg. W niektórych wersjach ich liczba mogła być ograniczona przez wpisy
"Modes" w sekcji Screen, podsekcji Display pliku xorg.conf. Jeśli poprawnie działa nam nowsza wersja serwera, a w szczególności poprawnie pobiera dane o dostępnych trybach z pamięci
EDID monitora, możemy spróbować obyć się bez wpisu Modes (zakomentowując go choćby, tzn. stawiając znak
# na początku linii).
Poleceniem xrandr z parametrem
-s i rozdzielczością wybraną z dostępnych możemy też przełączyć rozdzielczość czy orientację obrazu. Zachęcam do przeczytania
man xrandr.
Uwaga: polecenie xrandr (czy może ściślej: rozszerzenie RandR) nie pokaże pełnego zakresu rozdzielczości i odświeżań monitora, jeśli wcześniej użyte dane zostały wykryte (--) błędnie lub wzięte z wartości domyślnych (==). Czasem w konfigu wystarczy ręcznie ustawić te parametry do wartości znanych nam z technicznej specyfikacji monitora. Odświeżanie poziome (w kHz) i pionowe (w Hz) monitora określamy parametrami
HorizSync i
VertRefresh. Niekiedy przyjdzie nam też dodawać ręcznie pojedyncze tryby monitora w sekcji Monitor, a potem użyć ich w sekcji Screen. Oto przykładowa sekcja Monitor z wymuszonymi ustawieniami:
Section "Monitor"
Identifier "SM"
DisplaySize 352 264
HorizSync 30 - 96
VertRefresh 50 - 160
#setka
ModeLine "1024x768_85.00-setka" 94.50 1024 1072 1168 1376 768 769 772 808 +hsync +vsync
EndSection
i Screen, jeśli dodawaliśmy Modeline.
Section "Screen"
Identifier "Default Screen"
Device "ATI Technologies, Inc. Radeon RV250 If [Radeon 9000]"
Monitor "SyncMaster"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1024x768_85.00-setka" # "1280x1024_85.00"
EndSubSection
EndSection
W nowszych wersjach serwera Xorg (na pewno już w wersji 1.5) możemy wyłączyć sobie kilka zbiorów trybów do osobnych sekcji
Modes.
Section "Modes"
Identifier "tryb1"
ModeLine "1024x768_85.00" 94.50 1024 1096 1192 1376 768 769 772 808 +hsync +vsync
Modeline "1280x1024_85.00" 157.50 1280 1344 1504 1728 1024 1025 1028 1072 +hsync +vsync
EndSection
Section "Modes"
Identifier "tryb2"
# 720x400 @ 85.00 Hz (GTF) hsync: 35.78 kHz; pclk: 32.64 MHz
Modeline "720x400_85.00" 32.64 720 744 816 912 400 401 404 421 -HSync +Vsync
EndSection
Serwer Xorg zrobi z jednego z tych zbiorów użytek (tzn. doda do listy dopstępnych trybów) dopiero wtedy, gdy w wybranej sekcji powiemy mu to w linijce
UseModes:
Section "Monitor"
Identifier "SM"
UseModes "tryb1"
Option "PreferredMode" "1024x768_85.00"
EndSection
Ktoś może zadać pytanie: skąd wytrzasnąłem ten ciąg liczb w Modeline? Ciąg taki można wygenerować za pomocą
gtf,
cvt lub innego kalkulatora do tego zadania:
~ $ gtf 1024 768 100
# 1024x768 @ 100.00 Hz (GTF) hsync: 81.40 kHz; pclk: 113.31 MHz
Modeline "1024x768_100.00" 113.31 1024 1096 1208 1392 768 769 772 814 -HSync +Vsync
~ $ cvt 1024 768 100
# 1024x768 99.97 Hz (CVT) hsync: 81.58 kHz; pclk: 112.25 MHz
Modeline "1024x768_100.00" 112.25 1024 1096 1200 1376 768 771 775 816 -hsync +vsync
Podajemy rozdzielczość w pikselach i odświeżanie, otrzymujemy wpis dla xorg.conf. Zauważmy, że dane te same, a wyniki nieco się różnią. Najlepiej sprawdzić po prostu, który daje lepszy efekt na naszym monitorze.
Uwaga: opis dodawania trybów może wymagać poszerzenia ze względu na aktualności w ostatnich wersjach Xorg. Podobnie z RandR: polecenie xrandr posiada parametr --addmode. Sam jednak nie używałem go, więc na razie wspominam tylko o jego istnieniu - może ktoś z Was prędzej zrobi eksperyment lub użyje tego słowa jako klucza w wyszukiwarce.
Chciałbym zwrócić uwagę na jeden detal w sekcji Monitor:
DisplaySize. Opisuje on wymiary ekranu w mm. Wymuszając własne, możemy doprecyzować ilość pikseli na cal w pionie i poziomie. Sprawdzić możemy to później np. za pomocą
xdpyinfo:
$ xdpyinfo | grep -E 'dimensions|resolution'
dimensions: 1024x768 pixels (312x234 millimeters)
resolution: 83x83 dots per inch
W razie jakichś merytorycznych błędów czy niedoskonałości proszę o komentarz.