トラブルシュート

本来、カスタマイズの前にトラブルシュートをするべきだが、クライアント用OSの設定を変える必要があったので、先に最適化などのカスタマイズを行なった。

先ずはカーネルのブート途中でPanicで止まってしまうところから修正を始めた。

ブートの途中で止まる

Linuxカーネルがブートする途中で幾つかエラーメッセージを出してくる。例えば/dev/consoleがないというメッセージを出しpanicで止まったりする。原因は2つ。

  1. NFSがサーバ側のファイヤーウォールでブロックされてしまう。
  2. SELinuxのコンテクストが正しく読めていない。

NFSに関しては、標準ではmountdの持ちうけポート番号が動的に代わるので、ファイヤーウォールを越えられないらしい。対応策としてはファイヤーウォールを止めるというのが一般的らしいが、それもいかがなものかと。もう一つの方法はポート番号を固定して使う方法だ。これによってファイヤーウォールの例外ポートして指定できる。GNOMENFS管理ツールなどで簡単に指定できる。私の場合は次のようにした。

rpc.lockd(TCP) 44928
rpc.lockd(UDP) 32770
rpc.mountd(TCP) 59385
rpc.statd(TCP) 54011

これが正しいポート番号かは怪しいが、一応、動いている。

NFSが出来るようになれば、ログインのところまでたどり着くことができた。ただし、SELinuxのコンテキストが正しく認識されないために、エラーメッセージが大量にでる。

コマンドラインでもログインできない

最初Xが立ち上がらなかったためコマンドラインのログイン・プロンプトが出たが、ユーザ名とパスワードを入れると一瞬(0.3秒くらい?)メッセージが出て、またログインプロンプトに戻る。メッセージが読めない。

これもSELinuxの影響だったようだ。(メッセージが読めないので推測だが。)クライアントのSELinuxの設定をPXEサーバ側でpermissive以下にしたら直った。

原因はどうやらSELinuxのコンテキストが正しく認識されていないようだ。ベースとなるマシン(VMware仮想マシン)からファイルをコピーする際にはdump & restoreを使ってコンテキストもコピーしているし、PXEサーバ側でイメージファイルをマウントしてから各ファイルのタイプを確認しても正しかった。

 # ls -aZ /home/TFTPboot/f8/root/
 drwxr-xr-x  root root system_u:object_r:root_t:s0      .
 drwxr-xr-x  root root system_u:object_r:tftpdir_t:s0   ..
 drwxrwxr-x  root root system_u:object_r:default_t:s0   #
 -rw-r--r--  root root system_u:object_r:root_t:s0      .autorelabel
 drwxr-xr-x  root root system_u:object_r:bin_t:s0       bin
 drwxr-xr-x  root root system_u:object_r:boot_t:s0      boot
 drwxr-xr-x  root root system_u:object_r:root_t:s0      dev
 drwxr-xr-x  root root system_u:object_r:etc_t:s0       etc
 drwxr-xr-x  root root system_u:object_r:home_root_t:s0 home
 drwxr-xr-x  root root system_u:object_r:lib_t:s0       lib
 drwx------  root root system_u:object_r:lost_found_t:s0 lost+found
 drwxr-xr-x  root root system_u:object_r:mnt_t:s0       media
 drwxr-xr-x  root root system_u:object_r:mnt_t:s0       mnt
 drwxrwxr-x  root root system_u:object_r:default_t:s0   net
 drwxrwxr-x  root root system_u:object_r:default_t:s0   .oldroot
 drwxr-xr-x  root root system_u:object_r:usr_t:s0       opt
 drwxr-xr-x  root root system_u:object_r:root_t:s0      proc
 drwxr-x---  root root system_u:object_r:user_home_dir_t:s0 root
 drwxr-xr-x  root root system_u:object_r:bin_t:s0       sbin
 drwxr-xr-x  root root system_u:object_r:root_t:s0      selinux
 drwxrwxr-x  root root system_u:object_r:default_t:s0   .snapshot
 drwxr-xr-x  root root system_u:object_r:var_t:s0       srv
 drwxr-xr-x  root root system_u:object_r:root_t:s0      sys
 drwxrwxrwt  root root system_u:object_r:tmp_t:s0       tmp
 drwxr-xr-x  root root system_u:object_r:usr_t:s0       usr
 drwxr-xr-x  root root system_u:object_r:var_t:s0       var

ところがNFSを通してクライアントが読むとタイプが変わってしまっている。SELinuxをpermissiveにして立ち上げてみると次のようになっている。

 # ls -aZ /
 drwxr-xr-x  root root system_u:object_r:nfs_t:s0       .
 drwxr-xr-x  root root system_u:object_r:nfs_t:s0       ..
 drwxrwxr-x  root root system_u:object_r:nfs_t:s0       #
 -rw-r--r--  root root system_u:object_r:nfs_t:s0       .autofsck
 drwxr-xr-x  root root system_u:object_r:nfs_t:s0       bin
 drwxr-xr-x  root root system_u:object_r:nfs_t:s0       boot
 drwxr-xr-x  root root system_u:object_r:tmpfs_t:s0     dev
 drwxr-xr-x  root root system_u:object_r:nfs_t:s0       etc
 drwxr-xr-x  root root system_u:object_r:nfs_t:s0       home
 drwxr-xr-x  root root system_u:object_r:nfs_t:s0       lib
 drwx------  root root system_u:object_r:nfs_t:s0       lost+found
 drwxr-xr-x  root root system_u:object_r:nfs_t:s0       media
 drwxr-xr-x  root root system_u:object_r:nfs_t:s0       mnt
 drwxr-xr-x  root root system_u:object_r:autofs_t:s0    net
 drwxrwxr-x  root root system_u:object_r:nfs_t:s0       .oldroot
 drwxr-xr-x  root root system_u:object_r:nfs_t:s0       opt
 dr-xr-xr-x  root root system_u:object_r:proc_t:s0      proc
 drwxr-x---  root root system_u:object_r:nfs_t:s0       root
 drwxr-xr-x  root root system_u:object_r:nfs_t:s0       sbin
 drwxr-xr-x  root root system_u:object_r:security_t:s0  selinux
 drwxr-xr-x  root root system_u:object_r:nfs_t:s0       .snapshot
 drwxr-xr-x  root root system_u:object_r:nfs_t:s0       srv
 drwxr-xr-x  root root system_u:object_r:sysfs_t:s0     sys
 drwxrwxrwt  root root system_u:object_r:tmp_t:s0       tmp
 drwxr-xr-x  root root system_u:object_r:nfs_t:s0       usr
 drwxr-xr-x  root root system_u:object_r:nfs_t:s0       var

さて、どうしたものか。一番安直な方法はSELinuxをdisableにすることだ。(permissiveでも動作はするが、エラーメッセージの数が異様に多くなる。)クライアントの環境でSELinuxをdisableにするには、PXEサーバ(というかファイルサーバ)側で/home/TFTPboot/f8/root/etc/selinux/configファイルを変更してから、クライアントを立ち上げる。

今のところNFSサーバのファイルのコンテキストを透過的にクライアントで見る方法が分からない。NSAの2005年のシンポジューム資料では、

Interoperability with Normal NFS

Client needs to specify whether to use SELinux or normal NFS.
Modified mount to add “selinux” option and NFS_MOUNT_SELINUX flag

Server must recognize the difference between a SELinux and normal NFS request.
SELinux NFS uses a different RPC program number (100006 instead of 100003)
Modified RPC layer to handle more than one program number

とあるが、selinuxオプションを持ったmountコマンドもなければプログラム番号100006のRPCもない。2005年から随分経っているけど。NFSではSELinuxは使えない、ってことか?

それから、クライアント側のSELinuxをpermissive以下にしただけでは解決しない。サーバ側で、ftfpdやnfsdなどのデーモンがアクセスできないファイルがあるからだ。これを修正するためにはローカル・ポリシーを追加しなければならない。現在、サーバ側で追加しているローカル・ポリシーは以下の通り。

# cat vmserver.te
module vmserver 1.0;

require {
        type home_root_t;
        type lvm_control_t;
        type tftpd_t;
        type nfsd_t;
        type nfs_t;
        class chr_file write;
        class file {getattr read};
        class dir search;
}

#============= tftpd_t ==============
allow tftpd_t home_root_t:dir search;

#============= nfsd_t ==============
allow nfsd_t lvm_control_t:chr_file write;

#============= tftpd_t ==============
allow tftpd_t nfs_t:file {getattr read};

これを「tftpのルートディレクトリが変更できない?」にあるようにシステムに登録する。

Xウィンドウが立ち上がらない

これは単純な話し。/etc/X11/xorg.confに書かれていた"ビデオカード"が「VMware」だったからだ。一旦、クライアントでログインして、/etc/X11/xorg.confをクライアントが使っている"ビデオカード"に変更すれば無事にXウィンドウが立ち上がる。

/etc/X11はsnapshotの対象ディレクトリなので、その下のファイルに変更があればクライアントごとに保存される。

その他

automountデーモンの起動のところで止まってしまうが、キーボードを叩けば次に進む。
調べてみると/etc/auto.masterの中で標準で/net、/miscがマウントの対象になるような設定になっていた。しかし、ディスククライアントの環境では/はread onlyになっているため、ディレクトリを作れずに固まっていたようだ。/etc/auto.masterを変える方法もあるが、ディスククライアントではautomount自身を使う必要がないのでサービスを停止する。

ただし、クライアントからGNOMEのサービス設定ツールなどを使っては変更できないので、PXEサーバ側の/etc/rc[0-6].dの下のンボリックリンクの名前を変える。具体的には /tftpboot/f8/root/etc/rc[0-6].dの各ディレクトリにおいて、

# mv S28autofs K72autofs

と名前を変える。