2007年6月18日月曜日

(FreeBSD) xorg7.2に移行してみたときのトラブルいくつか 〜 startxで起動するとxauthがおかしい等

FreeBSDのportsでXorgのバージョンが7.2になってしばらくたちましたが、テスト用環境でわりと問題なく動いているようにみえたので、思い切って、日常使っている環境もアップデートしてみました。



以下は、そのときに出会ったトラブルのいくつかです。

■ pcidataがないとかいわれてXサーバが起動しない



(EE) Failed to load module "pcidata" (module does not exist, 0)



と表示されて、Xサーバが起動しないもの。



これは/usr/ports/UPDATINGをよく読んでアップデート作業をしていれば、ありえないトラブルなんですが、xorg.confのModulePathが間違っているのが原因です。
ただしくは以下のようなかんじ。



ModulePath   "/usr/local/lib/xorg/modules"



xorg-7.2になったときに、ファイルが/usr/X11R6/以下から/usr/local以下へ移動したのですが、modulesは、ちょっとだけ違うディレクトリに移動してしまったため、xorg.confを手で書き換えないとだめみたいです。



ついでに、FontPathなど/usr/X11R6のままになっているものも、書き直しておきましょう。





■ いつまでたってもxtermなどのウインドウが表示されない


startx
xinitコマンドでXを起動したとき、Xサーバは起動し、デフォルトのバックグラウンドイメージである灰色っぽい画面になるものの、そのまま・・・



ログファイルやコンソールに、以下のようなメッセージが残ります。



AUDIT: Sun Jun 17 12:20:41 2007: 65719 X: client 1 rejected from local host (uid 1001)



$HOME/.Xauthorityというファイルが関係しているのですが、関連ネタがこのあとあるので、詳しくはあとで。とりあえず、$HOME/.Xauthority を削除すれば、正常にxtermなどが開くようになります。でも、これはあんまり正しくない解決方法。



■ startx、xinitした場合、xauthがうまくいかない。xdmからのログインならOK



というわけで、$HOME/.Xauthorityを削除すると、ちゃんと使えるように見えるのですが、xauth listコマンドでみると、まったくのからっぽで、magic cookieがまったく作られていません。

xdm
を使って、Xのグラフィカルなログイン画面からログインした場合は、ログイン後にxauth listを実行すれば、こんな風に、いろいろなエントリが自動的に作られています。



hoge:0  MIT-MAGIC-COOKIE-1  ふがふが
[fe80:3::1]:0  MIT-MAGIC-COOKIE-1  ふがふが
hoge/unix:0  MIT-MAGIC-COOKIE-1  ふがふが
hoge:0  XDM-AUTHORIZATION-1  ふんふん
[fe80:3::1]:0  XDM-AUTHORIZATION-1  ふんふん
hoge/unix:0  XDM-AUTHORIZATION-1  ふんふん



なにが違うんだろう?と思って、ps axwwを実行してXサーバに指定されているオプションを見比べてみました。



startxした場合



44704  v2  S      0:03.43 X :0 (Xorg)



xdmを使った場合



68550  ??  Ss     0:02.56 /usr/local/bin/X :0 -auth /usr/local/lib/X11/xdm/authdir/authfiles/A:0-?????? (Xorg)



なるほど、どうやら、-authオプションが必要らしいです。そういえば、昔は、$HOME/.xserverauthなんとかというファイルが、自動的に作られていたようなきがしますが、今はありません。そのあたりに問題の鍵が!?

/usr/local/bin/startx
を見てみますと…



if [ x"$xserverauthfile" != x ]; then
    rm -f $xserverauthfile
fi



というなんとなく気になる記述があります。削除はしますが、作成してないですねぇ。



pkg_which /usr/local/bin/startxすると



xinit-1.0.3



とか言われるので、



# cd /usr/ports/x11/xinit/; make patch



とか実行しちゃって、ソースを見てしまいます。FreeBSDらしい解決方法ですねぇ(笑)。



startxのもととなったファイルはstartx.cppらしいのですが、どうやら、以下の部分が問題の鍵となるようです。



#if defined(HAS_COOKIE_MAKER) && defined(MK_COOKIE)
XCOMM set up default Xauth info for this machine
case `uname` in
Linux*)
    if [ -z "`hostname --version 2>&1 | grep GNU`" ]; then
        hostname=`hostname -f`
    else
        hostname=`hostname`
    fi
    ;;
*)
    hostname=`hostname`
    ;;
esac

authdisplay=${display:-:0}
mcookie=`MK_COOKIE`
dummy=0

XCOMM create a file with auth information for the server. ':0' is a dummy.
xserverauthfile=$HOME/.serverauth.$$
xauth -q -f $xserverauthfile << EOF
add :$dummy . $mcookie
EOF
serverargs=${serverargs}" -auth "${xserverauthfile}



$HOME/.serverauth.* ファイルを作成する処理が、もともとはあったはずなのですが、#ifdefでガードされている範囲内にあって、どうやら、if条件が成立せずコメントアウトされてしまったようです。



configureスクリプトを斜め読みしてみると、mcookieというコマンドがあれば、うまくいったような雰囲気です。



・・・mcookie? なんかそういうコマンド、昔はあったような気がします。でも、今はどこにも見当たらないですね。どこいっちゃったのでしょうか。



いやもしかすると、$HOME/bin/mcookieというのが、あったような気がする。あれ?どうだったっけかなぁ。



とりあえず今回の調査はここで終了。
xdmを使えば何とかなってるので、xdmを使うことにしました。たぶん、xdmは自分でX -auth 〜で指定するファイルを作ってるんじゃないでしょうか。




■ フォントがみつからないと言われてしまう (1)



これはほとんどの人は見ない症状だと思います。こんな感じで、いろんなXクライアントが、ことごとく、フォントを見つけられなくなりました。



% emacs
No fonts match `*-Fixed-Medium-R-Normal-*-16 -*-ISO8859*-*'



わかりにくいですが、フォントサイズを意味する16のあとに、なぜか1文字のスペースが入っています。



これは私が使っているXのリソース定義ファイル($HOME/.Xresources、$HOME/.Xdefaults)に問題があるのが原因でした。このファイル、10数年前に人からもらったものを、ときどき手直ししつつ使い続けてきたものです。



Xのリソース定義ファイルを、xrdbコマンドで読み込みますが、xrdbコマンドは、読み込み時に、Cプリプロセッサ(cpp)をフィルタとして使って読み込みます。そのため、Xのリソース定義ファイルに、#defineなどのプリプロセッサ命令が使えます。



以下は$HOME/.Xresourcesからの抜粋ですが、こんなことが書いてありました。



# define FONTSIZE0    16



# define FONTASCII0    *-Fixed-Medium-R-Normal-*-FONTSIZE0-*-ISO8859*-*



KTerm*VT100*font            : FONTASCII0
emacs*font                : FONTASCII0



cpp ~/.Xresources を実行してみたら、



*-Fixed-Medium-R-Normal-*-16 -*-ISO8859*-*



というようにFONTASCII0がマクロ展開されたとき、スペースが1文字入ってました。
-とかの記号の手前にマクロが入っていると、親切というかおせっかいというか、勝手に空白が挿入されているようです。



というわけで、これはxorg-7.2の問題ではなくて、cppの問題だと思うのですが、なぜxorg-6.9のときは大丈夫だったんでしょうか? それはそれで謎です。



とりあえず、マクロを使うのをやめました。



こういうXリソース定義の書き方は、昔、いろんな種類のXサーバを使うのときに、各サーバごとに環境を微調整してやるためのトリックだったのですが、もういらないかな、って思います。



(2007/6/22 追加)
■ フォントがみつからないと言われてしまう (2)



もう1つ、フォントが見つからないといわれるケースがありました。実は、さっきのは無関係で、こっちだけの問題なのかも?!



やっぱり、Xのリソース定義が問題だったのですが・・・



% emacs
No fonts match `*-Fixed-Medium-R-Normal-*--16-*-ISO8859*-*'



という感じで、emacsが起動しません。



% xrdb -q | grep emacs
emacs*font:     *-Fixed-Medium-R-Normal-*--16-*-ISO8859*-*
emacs*kfont:    *-Fixed-Medium-R-Normal-*--16-*-JISX0208*-*



となるので、なるほど、リソースの問題っぽい。だいたい、これはいつの時代の設定なのかと。kfontなんてリソース、今でも見るのでしょうか?



で、なんでかな、とフォントのパターンマッチングをいろいろと試してみました。



% xlsfonts '*-Fixed-Medium-R-Normal-*--16-*-ISO8859-1'
xlsfonts: pattern "*-Fixed-Medium-R-Normal-*--16-*-ISO8859-1" unmatched

% xlsfonts '*-Fixed-Medium-R-Normal-*--16-*-*-ISO8859-1'
xlsfonts: pattern "*-Fixed-Medium-R-Normal-*--16-*-*-ISO8859-1" unmatched

% xlsfonts '*-Fixed-Medium-R-Normal-*--16-*-*-*-*-*-ISO8859-1'
xlsfonts: pattern "*-Fixed-Medium-R-Normal-*--16-*-*-*-*-*-ISO8859-1" unmatched

% xlsfonts '*-Fixed-Medium-R-Normal-*--16-*-*-*-*-*-ISO8859-1'
xlsfonts: pattern "*-Fixed-Medium-R-Normal-*--16-*-*-*-*-*-ISO8859-1" unmatched



・・・ここまできて、ようやく気がつきました!



% xlsfonts '*-Fixed-Medium-R-Normal--16-*-ISO8859-1'
-sony-fixed-medium-r-normal--16-120-100-100-c-80-iso8859-1
-sony-fixed-medium-r-normal--16-120-100-100-c-80-iso8859-1
-sony-fixed-medium-r-normal--16-150-75-75-c-80-iso8859-1
-sony-fixed-medium-r-normal--16-150-75-75-c-80-iso8859-1



フォントサイズの手前、「--」(ハイフン2個)の左側のところに入ってる「-*-」が、1個余分じゃないですか・・・
なぜ、今まで動いてたんだろう???




■ Ctrl + Alt + F1などでコンソール画面に戻れない



セキュリティのために、そういう機能が無効化されてるのかなぁ、と思ってたら、そういうわけではないみたいでした。xorg.conの中で



Option "XkbRules"  "xfree86"



と書いてあった部分を



Option "XkbRules"  "xorg"

に変更したら、Ctrl + Alt + F1で、テキスト・コンソール画面に切り替えられるようになりました。xorgcfgで新たにxorg.confを作成したら、そう書いてあったので気がつきました。




(2007/7/6 追加)



could not open default font 'fixed'と表示されてXサーバがすぐ終了してしまう



5~6台くらいxorg7.2へportupgradeしたのですが、その中で、ただ1台だけ、xinit、startx、xorgcfgコマンドを実行した直後、一瞬Xサーバが起動したような雰囲気がするものの、すぐに終了して

Fatal server error:
could not open default font 'fixed'

というエラーメッセージを表示して終わりで、Xサーバが起動しないマシンがありました。



FreeBSDのメーリングリストfreebsd-currentにも、同様の症状を訴えてる人がいて、フォントをいくつかportupgrade -fで強制再インストールしたら直った、という報告がでてました。



http://docs.freebsd.org/cgi/mid.cgi?20070527215727.GD67158



・・・で、portupgradeする前に、ちょっとファイルを調べてみることに。フォント名がfixedといってるので、miscディレクトリでしょう。



% ls -la /usr/local/lib/X11/fonts/misc/fonts.dir
-rw-r--r--  1 root  wheel  2  5 21 11:03 /usr/local/lib/X11/fonts/misc/fonts.dir
% cat /usr/local/lib/X11/fonts/misc/fonts.dir
0



fonts.dirが、実質、からっぽですね・・・ ls -l してみると



-r--r--r--  1 root  wheel    20  5 21 11:02 10x20-ISO8859-1.pcf.gz
-r--r--r--  1 root  wheel    20  5 21 11:02 10x20-ISO8859-10.pcf.gz
-r--r--r--  1 root  wheel    20  5 21 11:02 10x20-ISO8859-11.pcf.gz
-r--r--r--  1 root  wheel    20  5 21 11:02 10x20-ISO8859-13.pcf.gz
-r--r--r--  1 root  wheel    20  5 21 11:02 10x20-ISO8859-14.pcf.gz
-r--r--r--  1 root  wheel    20  5 21 11:02 10x20-ISO8859-15.pcf.gz
-r--r--r--  1 root  wheel    20  5 21 11:02 10x20-ISO8859-16.pcf.gz
~略~



なんすか、この20バイトのgzipファイルだらけな状況は!?



# gzcat  /usr/local/lib/X11/fonts/misc/10x20-ISO8859-1.pcf.gz



つまり、中身、からっぽなわけです。だから、fonts.dirも0だったわけですね。



pcfフォントを作成するコマンド(bdftopcfかな)が、たまたまうまく動かなかったとかでしょうか? 今となってはもう再現できないので、原因はよくわかりません。



メーリングリストに載っていた情報によれば、



portupgrade -f font-misc-misc font-cursor-misc



したら直ったそうです。しかし、私が見たホストの場合は、ほかにも、サイズが20バイトになってしまっているフォントがたくさんインストールされていて、たとえば、



font-sony-misc-1.0.0
font-schumacher-misc-1.0.0
font-arabic-misc-1.0.0
font-mutt-misc-1.0.0



なども、portupgrade -f うんたらが、必要でした。



ちなみに、portupgrade -f font-cursor-misc する前のとき、つまり、font-cursor-miscがぶっ壊れているときは、



Fatal server error:
could not open default cursor font 'cursor'



というエラーメッセージが出ます。





結局、Xサーバが起動しない理由は、フォントファイルが壊れていたためだったんですが、このマシンでは、もう1つエラーメッセージが出ていて、



(EE) R128(0): [agp] Out of memory (-12)



みたいなものでした。これ、別に致命的なエラーではないみたいで、何もしてないけど、Xサーバは起動します。通常、サーバとして運用しているマシンなので、Xは立ち上げていないので、このOut of memoryは、xorg7.2になってはじめて出るようになったのか、xorg7.2より前でも出てたのか、よくわかりません。



ログファイルから、該当する近辺をコピペして残しておきます。



(==) R128(0): Write-combining range (0xf5e00000,0x4000) was already clear
(==) R128(0): Write-combining range (0xf0000000,0x1000000)
(==) R128(0): Write-combining range (0xa0000,0x10000) was already clear
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is 8, (OK)
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is 8, (OK)
drmOpenByBusid: Searching for BusID pci:0000:01:00.0
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is 8, (OK)
drmOpenByBusid: drmOpenMinor returns 8
drmOpenByBusid: drmGetBusid reports pci:0000:01:00.0
(II) R128(0): [drm] DRM interface version 1.2
(II) R128(0): [drm] created "r128" driver at busid "pci:0000:01:00.0"
(II) R128(0): [drm] added 8192 byte SAREA at 0xc51fe000
(II) R128(0): [drm] mapped SAREA 0xc51fe000 to 0x28503000
(II) R128(0): [drm] framebuffer handle = 0xf0000000
(II) R128(0): [drm] added 1 reserved context for kernel
(II) R128(0): [agp] Mode 0x1f000a11 [AGP 0x0000/0x0000; Card 0x1002/0x534d]

(EE) R128(0): [agp] Out of memory (-12)
(WW) R128(0): [agp] AGP failed to initialize -- falling back to PCI mode.
(WW) R128(0): [agp] Make sure you have the agpgart kernel module loaded.

(II) R128(0): [pci] 8192 kB allocated with handle 0x00000000
(II) R128(0): [pci] ring handle = 0xc59ea000
(II) R128(0): [pci] Ring mapped at 0x295f0000
(II) R128(0): [pci] Ring contents 0x00000000
(II) R128(0): [pci] ring read ptr handle = 0xc5aeb000
(II) R128(0): [pci] Ring read ptr mapped at 0x28505000
(II) R128(0): [pci] Ring read ptr contents 0x00000000
(II) R128(0): [pci] vertex/indirect buffers handle = 0xc5aec000
(II) R128(0): [pci] Vertex/indirect buffers mapped at 0x296f1000
(II) R128(0): [pci] Vertex/indirect buffers contents 0x00000000
(II) R128(0): [drm] register handle = 0xf5e00000
(II) R128(0): [dri] Visual configs initialized
(II) R128(0): CCE in BM mode
(II) R128(0): Using 8 MB AGP aperture
(II) R128(0): Using 1 MB for the ring buffer
(II) R128(0): Using 2 MB for vertex/indirect buffers
(II) R128(0): Using 5 MB for AGP textures
(II) R128(0): Memory manager initialized to (0,0) (800,2457)
(II) R128(0): Reserved area from (0,600) to (800,602)
(II) R128(0): Largest offscreen area available: 800 x 1855
(II) R128(0): Reserved back buffer from (0,602) to (800,1202)
(II) R128(0): Reserved depth buffer from (0,1202) to (800,1803)
(II) R128(0): Reserved depth span from (0,1802) offset 0x57fd00
(II) R128(0): Reserved 8704 kb for textures at offset 0x77f880
(II) R128(0): Using XFree86 Acceleration Architecture (XAA)
        Screen to screen bit blits
        Solid filled rectangles
        8x8 mono pattern filled rectangles
        Indirect CPU to Screen color expansion
        Solid Lines
        Dashed Lines
        Offscreen Pixmaps
        Setting up tile and stipple cache:
                30 128x128 slots
(II) R128(0): Acceleration enabled
(==) R128(0): Backing store disabled
(==) R128(0): Silken mouse enabled
(II) R128(0): Using hardware cursor (scanline 7212)
(II) R128(0): Largest offscreen area available: 800 x 651
(II) R128(0): X context handle = 0x3
(II) R128(0): [drm] installed DRM signal handler
(II) R128(0): [DRI] installation complete
(II) R128(0): [drm] Added 128 16384 byte vertex/indirect buffers
(II) R128(0): [drm] Mapped 128 vertex/indirect buffers
(II) R128(0): [drm] dma control initialized, using IRQ 16
(II) R128(0): Direct rendering enabled
(==) RandR enabled
(II) Initializing built-in extension MIT-SHM
(II) Initializing built-in extension XInputExtension
(II) Initializing built-in extension XTEST
(II) Initializing built-in extension XKEYBOARD
(II) Initializing built-in extension XC-APPGROUP
(II) Initializing built-in extension XAccessControlExtension
(II) Initializing built-in extension SECURITY
(II) Initializing built-in extension XINERAMA
(II) Initializing built-in extension XFIXES
(II) Initializing built-in extension XFree86-Bigfont
(II) Initializing built-in extension RENDER
(II) Initializing built-in extension RANDR
(II) Initializing built-in extension COMPOSITE
(II) Initializing built-in extension DAMAGE
(II) Initializing built-in extension XEVIE





(2007/7/24 追記)



最近のports/x11/xinit、xinit-1.0.4_1からだと思いますが、startxコマンドが直っていて、サーバ側のxauthの用意がされるようになっています。



こんな具合に、/dev/randomから、マジッククッキーを生成しています。



mcookie=`dd if=/dev/random bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"`
if x"$mcookie" = x; then
                echo "Couldn't create cookie"
                exit 1
fi



ところが!!! これ、if文の書き方、まちがってますね(爆)。testコマンド( [ )が抜けてます。



--- startx~    Tue Jul 17 13:18:15 2007
+++ startx    Tue Jul 24 12:04:31 2007
@@ -127,7 +127,7 @@
mcookie=`dd if=/dev/random bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"`
-if x"$mcookie" = x; then
+if [ x"$mcookie" = x ] ; then
                 echo "Couldn't create cookie"
                 exit 1
fi


(2007/7/24 オマケ)



なんとなく、見なかったことにしているのですが、xorg 7.2になって、2台ほど、Xサーバがまともに動かないマシンがあります。どちらもATIなチップを使ってるんですが。まだよくわかってません。



0 件のコメント:

コメントを投稿