クライアント用のファイルシステムの作成

system-config-netbootの設定を行なう前に、クライアント用のファイルシステムを作成し、"/tftpboot/任意のディレクトリ/root"に置いておく。(ここではFedora 8をクライアント用に使ったので、/tftpboot/f8/rootというディレクトリの下に置く。)また、後述するnetbootで利用するsnapshotディレクトリも作る。(ここでは/tftpboot/f8/snapshotというディレクトリになる。)

一番簡単なのは、現在稼動しているDHCPクライアントなどのマシンを雛形マシンとしてルートファイルをコピーする方法だろう。手頃なマシンがあれば良いが、無ければ仮想マシンを一台仕立てて、不必要なオプションを削ってディスクレス用のファイルシステムとして構成するのが便利だ。今回、ディスクレスマシンはリモートデスクトップのコンソールとして使うのが目的なので、OSとして要求される機能は最小限で良いし、また仮想記憶無しで動かしたかったので、思い切って不必要機能を削って雛形を作った。

なお、雛形となるLinuxには「busybox-anaconda」というパッケージをインストールして置く必要がある。「アプリケーションの追加と削除」もしくはyumコマンドでインストールしておく。(busybox-anacondaの関連メモ「3種類のbusyboxは何が違うのか?」)

[root@fedora8 ~]# yum install busybox-anaconda

雛形のファイルシステムが用意できたら、ネットワークを経由してファイルをコピーして来る。方法は幾つかあるが、rsyncを使う方法はお手軽かも知れない。まず、rootとsnapshotというディレクトリを作っておく。

[root@vmserver ~]# mkdir /tftpboot/f8
[root@vmserver ~]# mkdir /tftpboot/f8/root
[root@vmserver ~]# mkdir /tftpboot/f8/snapshot

入れ物(/tftpboot/f8/root)が用意できたら、そこへルートファイルシステムをコピーする。

[root@vmserver ~]# rsync -v -a -e ssh \
	--exclude='/proc/*' --exclude='/sys/*' --exclude='/dev/*' --exclude='/media/*' --exclude='/tmp/*' \
	雛形マシンのIPアドレス:/ /tftpboot/f8/root/
root@雛形マシンのIPアドレス's password:
receiving file list ... done
	:
	:
sent 1566535 bytes  received 1691035675 bytes  3699676.96 bytes/sec
total size is 1685756852  speedup is 1.00

rsyncコマンドを使うと操作は簡単だが、後述するとおり、SELinuxのコンテキストをコピーできず、/tftpbootのサブディレクトリにコピーするために全てのファイルファイルが"tftpdir_t"のラベルになってしまう。

[root@vmserver ~]# ls -Z /tftpboot/f8/root
drwxr-xr-x  root root system_u:object_r:tftpdir_t:s0   bin
drwxr-xr-x  root root system_u:object_r:tftpdir_t:s0   boot
	:
	:
drwxr-xr-x  root root system_u:object_r:tftpdir_t:s0   usr
drwxr-xr-x  root root system_u:object_r:tftpdir_t:s0   var

SELinuxのコンテキストもオリジナルと同様にコピーする場合はdumpコマンドとrestoreコマンドを使う方法がある。

[root@vmserver ~]# cd /tftpboot/f8/root
[root@vmserver f8]# ssh 雛形マシンのIPアドレス \(cd / \; dump -0 -b 1024 -f - . \) | restore -rv -b 1024 -f -
Verify tape and initialize maps
Input is from a local file/pipe
root@雛形マシンのIPアドレス's password:
  DUMP: Date of this level 0 dump: Tue Jan 29 09:01:25 2008
	:
	:
Set directory mode, owner, and times.
Check the symbol table.
Check pointing the restore
[root@vmserver f8]# rm restoresymtable
rm: remove regular file `restoresymtable'? y
[root@vmserver f8]#

ここでdumpする時に「/」からの相対パスになるようにしている。restoreする先が「/」ではなく「/tftpboot/f8/root/」だからだ。restoreする時に書き出すルートディレクトリを変更することができるかどうか確認する時間がなかったので、この様な方法で安全策をとった。

dump&restoreでコピーした場合は、SELinuxのコンテキストも再現される。

[root@vmserver ~]# ls -Z /tftpboot/f8/root/
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:usr_t:s0       usr
drwxr-xr-x  root root system_u:object_r:var_t:s0       var

反面、dump&resotreではコピーファイルの選択ができず、全てのファイルをコピーして来てしまうので、コピー後に不必要なファイルを消去して置く方が良い。(ただし、/proc/* /sys/* /dev/*に関してはコピーされないので、/tmpや/varの下の不要なファイルのみを消せば良い。)また、クライアントのカーネルが起動する過程で/dev/consoleだけは予め作ってある必要があるので、consoleを作成しておく。

[root@vmserver ~]# cd /tftpboot/f8/root
[root@vmserver root]# rm .[^.]* .??*
rm: remove regular empty file `.autofsck'? y
[root@vmserver root]# rm -rf tmp/.[^.]* tmp/.??* tmp/*

[root@vmserver root]# mknod ./dev/console c 5 1
[root@vmserver root]# chmod 600 ./dev/console
[root@vmserver root]# chcon -t console_device_t ./dev/console

クライアントのファイルシステムを1つのファイルにまとめる

運用方針にも依るが /tftpbootは一般的にルート・ファイルシステムに属し、またルート・ファイルシステムはそれ程大きな容量のHDDパーティションに置かれることは少ないのではないだろうか。しかし、PXEブートによるディスクレス・クライアントは/tftpbootの配下にもう一つクライアント用のファイルシステムを飲み込むことになり、サーバのルート・ファイルシステムを圧迫する。
それを回避するには、例えば、/tftpboot/f8 を /home/tftpboot/f8 などにシンボリックリンクする方法もあるが、管理なども考えると、クライアント用のファイルシステムを1つのイメージファイルにまとめておいて/tftpboot/f8へマウントする方法がお勧めである。この方法であればクライアントのファイルシステムの本体は、サーバ上の任意のディレクトリ(ファイルシステム)に置くことができ、かつクライアントのバックアップもイメージファイルのコピーで済んでしまう。

[root@vmserver ~]# : 先ずファイルシステムを格納するファイルを作る
[root@vmserver ~]# dd if=/dev/zero of=/home/f8_diskless.img bs=2400M count=1
0+1 records in
0+1 records out
2147479552 bytes (2.1 GB) copied, 85.5222 s, 25.1 MB/s
[root@vmserver ~]# ls -l /home/f8_diskless.img
 -rw-r--r-- 1 root root 2147479552 2008-01-29 08:42 /home/f8_diskless.img

[root@vmserver ~]# : 次にファイルシステムとしてmkfsをかける
[root@vmserver ~]# mkfs -t ext3 /home/f8_diskless.img
mke2fs 1.40.2 (12-Jul-2007)
/home/f8_diskless.img is not a block special device.
Proceed anyway? (y,n) y
	:
	:

[root@vmserver ~]# : 作成したファイルシステムをマウントしてroot/とsnapshot/を作る
[root@vmserver ~]# mkdir /tftpboot/f8
[root@vmserver ~]# mount -o loop /home/f8_diskless.img /tftpboot/f8
[root@vmserver ~]# ls /tftpboot/f8
lost+found
[root@vmserver ~]# mkdir /tftpboot/f8/root
[root@vmserver ~]# mkdir /tftpboot/f8/snapshot
[root@vmserver ~]# ls /tftpboot/f8/
lost+found  root  snapshot

あとは、rsyncなりdumo&resotreなりでファイルをコピーしてくればいい。