hideden.hatenablog.com

はてなぶろぐー。URLなげー。

ThinkPad X61でLinuxまとめ (Santa Rosa 965GMでLinux)

nowa画像とか張りづらいのでこっちにメモ。Rubyをメインで使い出してから放置してたけど、久々にログインしたら結構変わっててびっくり。

面倒なので数日前にnowaに書いたのをベースに。


Ubuntu FeistyをThinkPad X61に入れたらBerylでうにうに動かなくて(ホワイトアウトする)気合いでGentoo入れたメモ。

結果からするともしかしたら別にGentooじゃなくてもよかった。結果的にカーネルモジュール+Xorgドライバの再コンパイルで動作したのでUbuntuコンパイルすりゃよかったかも。

Gentoo入れる

まず、emergeで入るものは入れてしまう。とりあえずまだ新しいハードなので、クリティカルそうな
部分に関しては~x86キーワードで出来るだけ新しいのを取ってくる。

sys-kernel/gentoo-sources       ~x86
x11-drivers/xf86-video-i810     ~x86
x11-base/xorg-server            ~x86

Kernelに関しては2.6.20でもいいかもしれない。まぁ試行錯誤の過程で2.6.21-gentoo-r3にしちゃったからいいや。grub設定めんどいし。

xf86-video-i810は、本家のほうでは名前が変わって現在xf86-video-intelになっている。この設定にすることで1.7.4→2.0.0になるのでこれ重要。1.7.4では965GMを未サポート。2.0.0は多少問題ありつつもサポートしている。

とりあえずこのままInstall。

USE="symlink" emerge gentoo-sources
emerge -auvD gnome xscreensaver

なんとなくGnome。とりあえず依存解決でXorg-serverが入るならなんでも。USEフラグは適当に

USE="unicode cjk nls X xorg dri opengl sdl alsa gnome gtk acpi 
aac emacs perl ruby pcre samba fbcon mmx sse sse2 ssl zlib bzip2 jpeg 
png firefox cdr dvd truetype sdl sqlite oss -ipv6 -qt -qt3 -qt4 -arts -kde"
LINGUAS="ja"
VIDEO_CARDS="i810 vesa fbdev"

とかに。このUSEフラグってシステムがGentooの素敵なところであり、毎回悩ませられる面倒な部分だと思う。便利なんだけどいまいち何指定するのがベストかわからん。emacsとか指定した上でemacs22を入れると依存解決でemacs21を入れだすのとかちょっと面倒。バージョン共存で入れてくれるけど。VIDEO_CARDSは指定しておかないといろんなドライバー入れられて汚れるので要指定。

次にKernel構築。まだ詳しくハードについて調べてないので最適なOptionであるかどうかは別として、とりあえず起動させることを優先する。genkernelを使用して作成してもいいかもしれない。X61SATAなので、AHCIを入れておかないとBoot時にHDDを認識できなくて起動しなくなる。ちなみにUbuntu FeistyだとこれがOFFなのか、起動しない。BIOSにてSATAAHCI→COMPATIBLEにするとFeistyでも起動する。若干RandomReadとかの性能が遅くなるようなことをどっかの記事で見たが、実用上はこれでも特に問題は無かった。が、せっかくなのでONにしてAHCIで運用することをお勧めする。Ubuntu GutsyのTest版ではちゃんとAHCIで認識していたので、Ubuntuで無難に行くなら秋にリリースされるGutsyまではCOMPATIBLEでもいいかも。

DRM周りのKernelオプションは、以下のように。

Processor type and features
       -> MTRR (Memory Type Range Register) support [*]
Device Driver
       -> Character devices
               -> /dev/agpgart (AGP Support) [M]
               -> Intel 440LX/BX/GX, I8xx and E7x05 chipset support [M]
       -> Direct Rendering Manager (XFree86 4......) [M]
               -> i915 driver [M]

FrameBuffer等も有効にしておくと起動時に画面が見やすくていい。GDMでログインする場合は必須かも。ここで[*]じゃなく[M]になってるのは理由があるのでぜひモジュールでコンパイルすること。

intel-agpを自動でロードするようにする。

echo "intel-agp" >> /etc/modules.autoload.d/kernel-2.6

ここまでで再起動してX起動してglxinfoで見てみても残念ながらDRI off。まぁここまでだとUbuntuからKernelのバージョンとXorgのバージョンとintelドライバのバージョンが新しくなった程度なのでしょうがないか。

hideden-x61 ~ # dmesg | grep drm
[drm] Initialized drm 1.1.0 20060810
hideden-x61 ~ # ls /proc/dri/
hideden-x61 ~ #

DRMモジュールは読み込まれてるけど、デバイスファイルができてない。どうやら認識されていないらしい。Xorg-Serverのログを見ると/proc/dri/card0が無いとか騒いでる。

DRMモジュールのバージョンが去年の8月になってるので、この段階じゃさすがに965GMは認識しないだろうっと言うことで最新版を入れることにする。なにやらgitで公開されてるので、とりあえずgitを入れる。

emerge -auvD dev-util/git

その後ダウンロードしてコンパイル

cd /usr/local/src
git-clone git://anongit.freedesktop.org/git/mesa/drm
cd drm/linux-core
make DRM_MODULES="i915"

これでdrm.koとi915.koが出来る。カーネルバージョンあがるたびにやんなきゃいけないのがめんどくさいからあとでなんとかしよう。なんかebuildありそげだけど。~x86つけたx11-drmがそれっぽいけど、ちょっとバージョン古いのかこれじゃ動かなかった。要調査。

で、出来たカーネルモジュールを上書きコピー。UbuntuなんかでもKernelソースを入れた後にコンパイルしてモジュール差し替えればいいかも。dist-upgradeしたときにもう一回コンパイルしなきゃいけないのは同じか。このあたり、GutsyのKernelではもともと認識してた気がするので、Ubuntuな人はそっちをチャレンジしてみるのもいいかもしれない。

cp *.ko /lib/modules/2.6.21-gentoo-r3/kernel/drivers/char/drm/

その後、モジュールをロードしなおしてみる。再起動とかでもかまわないけど。

rmmod i915
rmmod drm
modprobe i915

dmesg | grep drm
[drm] Module unloaded
[drm] Initialized drm 1.1.0 20060810
[drm] Initialized i915 1.9.0 20070209 on minor 0
[drm] Used old pci detect: framebuffer loaded

i915モジュールが新しくなったおかげで無事認識したようだ。

Xorg -configure

で作ったxorg.confでそのまま起動。で、glxinfoを。

# glxinfo | grep direct
direct rendering: Yes

おー。ちなみにglxinfoやglxgearはx11-apps/mesa-progsってebuildでInstallできる。普通こういうのもともと入ってるから、んなコマンドねーよ!って怒られると何入れていいのかちょっと悩む。Ubuntuだとそのコマンドは****ってパッケージに入ってると思うよ!入れなよ!って言ってくれる。あれ親切でうれしいからGentooでも実装して・・・くれないよな。。

Section "DRI"
    Mode 0666
EndSection

ってxorg.confに書いておかないとrootしかDRI使えなかったりするらしい。Gentooの流儀的にはvideoグループに所属させて・・・とかなんだろうけど面倒だから無視。

ここまででglxgearとかは劇的に改善する。が、いくつか問題がある。

  • 画面のリフレッシュレートが30Hzになる
  • 画面がなんか滲む

さて、これを解決しないと話にならない。これだったらBerylあきらめてvesaのほうがいい。

画面のリフレッシュレートが30Hzになる問題


こうなる。困る。これはちょっと困る。xrandrを入れて調べてみる。

# xrandr
Screen 0: minimum 320 x 200, current 1024 x 768, maximum 1024 x 1024
VGA disconnected (normal left inverted right)
LVDS connected 1024x768+0+0 (normal left inverted right) 246mm x 185mm
   1024x768       50.0*+   60.0     40.0  
   800x600        60.3  
   640x480        60.0     59.9  
TV connected 1024x768+0+0 (normal left inverted right) 0mm x 0mm
   1024x768       30.0* 
   800x600        30.0  
   848x480        30.0  
   640x480        30.0  

はい出た。謎のTV connected。965GMには945GM以前と違ってTVOut機能があるらしい。X61にそんな端子はどこにも無いので単純にチップ的に持ってるだけなんだろうけど、こいつのせいで30Hzになってるらしい。

いろいろ試行錯誤したが、単純にこのTVOutをオプションでOFFにすることはできなかった。ドライバソースとXorg-serverのソース読んでこの結論に至る(っつーかできねーよ!!って怒ってxorg.confでOFFにするのを諦める)までに数時間かかった。案外ドライバのソースはぐだぐだだった。まぁWindows版のIntelドライバも結構あれだし。

無理やり解決するには、

Section "Monitor"
      DisplaySize  250 180
      Identifier   "LCD"
      VendorName   "LEN"
      ModelName    "4000"
      Option       "DPMS" "true"
      HorizSync    30-100
      VertRefresh  58-65
      Modeline     "1024x768"  65.00  1024 1048 1184 1344  768 771 777 806 -hsync -vsync
EndSection

Section "Monitor"
      DisplaySize  250 180
      Identifier   "TV-Out"
      VendorName   "LEN"
      ModelName    "4000"
      Option       "DPMS" "true"
      HorizSync    30-100
      VertRefresh  58-65
      Modeline     "1024x768"  65.00  1024 1048 1184 1344  768 771 777 806 -hsync -vsync
EndSection

Section "Device"
      Identifier "965GM GMA X3100"
      Driver "intel"
      VendorName  "Intel Corporation"
      BoardName   "Mobile Integrated Graphics Controller"
      BusID       "PCI:0:2:0"      
      Option "Monitor-LVDS" "LCD"
      Option "Monitor-TV" "TV-Out"
      Option "NoDDC" "true"
EndSection

という感じでUndocumentな"Monitor-xxx"オプションを使用し、NoDDCでモード自動検出をOFFにした上でTV側にも液晶と同じ設定をコピーしたモニタを指定すると使えるモードが無い!ってエラーとともに『Output TV is not disconnected but no modes available.』だとかなんとか言ってOFFになる。が、このままだとxrandrが使えなくなる。根本的な解決にはならない。

液晶が滲む問題

写真で見たほうが早い。どちらもデジカメは固定して撮影。

上がvesaドライバ、下がintelドライバ。ピンボケではなく、画面のほうが滲んでいる。実機で見るともっとわかりやすい。

全般的にアンチエイリアスがかかったようなすっきりしない画面になる。これまたすごく目が疲れる。アンチエイリアスかかったフォントはもっとひどい。

解決策

結局xf86-video-intelドライバのソースを改変して解決した。

Bugzillaには結構あがっているようで、そのうち修正されるかもしれないのでそれまでの暫定処置。
まず、オリジナルのソースを取得して解凍する。

wget http://xorg.freedesktop.org//releases/individual/driver/xf86-video-intel-2.0.0.tar.bz2
tar jxf xf86-video-intel-2.0.0.tar.bz2

src/i830_tv.c
src/i830_lvds.c
の2つを修正する。

diff -r a/src/i830_lvds.c b/src/i830_lvds.c
230,232c230
<     pfit_control = (PFIT_ENABLE |
<                   VERT_AUTO_SCALE | HORIZ_AUTO_SCALE |
<                   VERT_INTERP_BILINEAR | HORIZ_INTERP_BILINEAR);
---
>     pfit_control = 0;

diff -r a/src/i830_tv.c b/src/i830_tv.c
1632c1632
<     if ((INREG(TV_CTL) & TV_FUSE_STATE_MASK) == TV_FUSE_STATE_DISABLED)
---
>     /* if ((INREG(TV_CTL) & TV_FUSE_STATE_MASK) == TV_FUSE_STATE_DISABLED) */

i830_tv.cの方は1632行目のTVフラグ判断をコメントアウトして強制return。フラグが何であろうとTVは無視するようにする。
i830_lvds.cのほうは230行目のpfit_controlを0にする。本来は解像度が実際のディスプレイと違う場合に拡大する処理を指定するところだが、拡大が不要にもかかわらず拡大処理実行され、画面がぼやけてたらしい。解像度を変更する予定は無いので(液晶だしね)、この機能自体を無効にする。

makeしてもいいが、将来のことを考えてオレオレebuildを作成する。

 /etc/make.conf内に
PORTDIR_OVERLAY="/usr/local/portage"

# mkdir -p /usr/local/portage/x11-drivers/xf86-video-i810
# cd /usr/local/portage/x11-drivers/xf86-video-i810
# cp /usr/portage/x11-drivers/xf86-video-i810/xf86-video-i810-2.0.0.ebuild ./xf86-video-i810-2.0.0-r1.ebuild
ソースの場所をパッチ後のソースアーカイブを適当な場所にUploadしたURLに書き換えて・・・
# ebuild xf86-video-i810-2.0.0-r1.ebuild digest
# emerge -auvD xf86-video-i810

バージョンとかつけ方わからんから適当で。まぁとりあえずローカルでの話なのであまり細かく気にしなくてもいいかもしれない。(だめかもしれない)自己責任で。
digest生成時にwgetで取得してる様子が無ければローカルにあるパッケージのキャッシュを見てるので

rm /usr/portage/distfiles/xf86-video-intel-2.0.0.tar.bz2

として削除してから再実行する。その際、Manifestファイルも消しておくこと。
ちなみに、こうやってdigestを手動で生成することは、そのパッケージの安全性については自己責任で管理するってことを意味する。まぁそもそもLinux自体が自己責任な気がするけど。

Ubuntuの場合は

$ cd /usr/local/src/
$ sudo apt-get source xserver-xorg-video-intel
$ cd xserver-xorg-video-intel-*

ソースを修正

$ dpkg-buildpackage -rfakeroot -uc -b
$ cd ..
$ sudo dpkg -i xserver-xorg-video-intel*.deb 
$ sudo aptitude hold xserver-xorg-video-intel # バージョン固定

って感じに.debを生成すれば後々正式に対応された場合にさくっと消したり出来る。

これで晴れてX61Linuxライフを満喫できるかも。後は音とサスペンドまわりか。。。なげーなー。


設定ファイルは以下。Kernelとかまだいまいち。
Kernel .config
xorg.xonf