トラブルシュート
本来、カスタマイズの前にトラブルシュートをするべきだが、クライアント用OSの設定を変える必要があったので、先に最適化などのカスタマイズを行なった。
先ずはカーネルのブート途中でPanicで止まってしまうところから修正を始めた。
ブートの途中で止まる
Linuxカーネルがブートする途中で幾つかエラーメッセージを出してくる。例えば/dev/consoleがないというメッセージを出しpanicで止まったりする。原因は2つ。
NFSに関しては、標準ではmountdの持ちうけポート番号が動的に代わるので、ファイヤーウォールを越えられないらしい。対応策としてはファイヤーウォールを止めるというのが一般的らしいが、それもいかがなものかと。もう一つの方法はポート番号を固定して使う方法だ。これによってファイヤーウォールの例外ポートして指定できる。GNOMEのNFS管理ツールなどで簡単に指定できる。私の場合は次のようにした。
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 flagServer 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
と名前を変える。