FreeBSD 8.3 diskless構築、その3

ディスクレスクライアント用ファイルツリーを構築する

ディスク容量節約と管理の手間を最小にするために、サーバーとクライアントで共有可能なファイルは手間が掛からない範囲で共有する。
具体的には、

  • /usr
  • /home

サーバーのものをそのまま公開し、これ以外のディレクトリは、

  • /diskless (名称は自由。/pxeboot や /clients などでもいい)

の中に、カスタマイズして構築する。NFSサーバー上のこの/diskless がディスクレスクライアント側の ルート / となる。
結果的に、/etc/exports の中身は以下のようになる。

</etc/exports>
 /usr -alldirs -network 192.168.1.0 -mask 255.255.255.0
 /home -maproot=0 -alldirs -network 192.168.1.0 -mask 255.255.255.0
 /diskless -maproot=0 -alldirs -network 192.168.1.0 -mask 255.255.255.0

/usr と /home は特にこれ以上操作は不要だが、/diskless 以下をどう管理するかは事前に考察が必要となる。
全て手動で管理するか、NFSサーバールート直下に /conf というディレクトリを作った後、この下にマスターファイルを構築し、clone_root コマンドでメンテナンスするかという選択を行う事にするか。この辺の説明は /etc/rc.initdiskless ファイルと前回のメモ(その2)で触れたclone_rootコマンドのコメントを読めばいい。
/diskless/conf を全て手動で管理する場合は、パスワードファイルやデバイスファイルなどを全て手作業でコマンド発行する事になるので抜けがないように作業しなくてはならない。
clone_root コマンドを使えば、/diskless 以下を管理する作業をほぼ全て行ってくれるが、一部手動で作業しなくてはならない部分もあるみたい。/conf の下に必要なファイルを手動で作成し、メンテナンス終わったら、”clone_root update” を実行して /diskless 以下に本番ファイルをコピーする作業の流れになる。初回はいいが、ちょっとした作業にも毎回 clone_root を発行する必要があり、途中から /diskless 以下を直接管理したくなるところ。私は我慢して、clone_rootコマンドを使う事を選択した。

/conf の下は、clone_root コマンドにより /diskless/conf にミラーコピーされるので、以下は /conf に行う作業だけ記述することにする。

まず、/conf は /etc/rc.initdiskless に詳しい説明があるように、メモリディスクを生成するためと、ディスクレスクライアントに読み込まれるファイルを個別にコントロールするためにある。

メモリディスク

ディスクレスクライアントでは、サーバー側の /, /var, /tmp, /etc をそのままでは共有出来ないためメモリディスクを利用する。起動時に構築されるメモリディスクに サーバーから /conf 以下のファイルがコピーされ、さらに /usr と /home がマウントされファイルシステムが完成する。

テンプレートファイル

サーバーの/conf 以下に定められたルールでファイルを置くと、ディスクレスクライアントのオリジナルファイルシステムを上書きする形でファイルが現れる。
例えば、サーバーに /diskless/etc/hosts と /conf/base/etc/hosts という二つのファイルがあるとすると、クライアントの /etc/hosts は後者の/conf/base/etc/hosts が見えることになる。
更に、クライアント毎に異なるファイルを持たせるためには、/conf の下にクライアントIPアドレスのディレクトリを作成する。/conf/192.168.1.41/etc/rc.conf というファイルを作成すると、192.168.1.41 のディスクレスクライアントが起動する時、/diskless/etc/rc.conf ではなく、/conf/192.168.1.41/etc/rc.conf が使用されるので、クライアント毎に異なるスイッチ設定を行う事が出来る。

設定が終わったら、HOMEディレクトリにコピーしておいた clone_root を実行するが、その前にスクリプト中の DESTを /diskless に変更しておく。

 # cd
 # ./clone_root all

これで、コンテンツのコピーが終了。

ということで、長々と書いてきたが、私の場合の /diskless と /conf の構造は次のようになっている。とりあえず3台のクライアントを使えるようにしていると途中。/diskless に関しては表示が長くなるので第一階層のみ。/diskless/boot に関しては clone_root がうまく働かないので、手動で準備する必要がある。

/diskless
|-- bin
|-- boot (別途作業が必要)
|-- cdrom
|-- compat -> usr/compat
|-- conf
|-- dev
|-- etc
|-- home
|-- lib
|-- libexec
|-- mnt
|-- proc
|-- root
|-- sbin
|-- sys -> usr/src/sys
|-- tmp
|-- usr
`-- var

メモ記述時点で記憶に頼って書いているが、確か tmp ディレクトリはclone_rootではリンクになっていたため、ディスクレスブートが途中で停止していた。実体ディレクトリにしたところ起動の問題が解消された。/conf に関しては階層が深くて、木構造が崩れて表示されるので、絶対パス表示にしてみた。

/conf
/conf/192.168.1.41
/conf/192.168.1.41/etc
/conf/192.168.1.41/etc/rc.conf
/conf/192.168.1.41/etc/rc.local
/conf/192.168.1.41/root
/conf/192.168.1.41/var
/conf/192.168.1.41/var/db
/conf/192.168.1.42
/conf/192.168.1.42/etc
/conf/192.168.1.42/etc/rc.conf
/conf/192.168.1.43
/conf/192.168.1.43/etc
/conf/192.168.1.43/etc/rc.conf
/conf/192.168.1.43/var
/conf/192.168.1.43/var/db
/conf/base
/conf/base/etc
/conf/base/etc/diskless_remount
/conf/base/etc/md_size
/conf/base/root
/conf/base/var
/conf/base/var/log
/conf/base/var/log/auth.log
/conf/base/var/log/console.log
/conf/base/var/log/cron
/conf/base/var/log/debug.log
/conf/base/var/log/local7.log
/conf/base/var/log/lpd-errs
/conf/base/var/log/maillog
/conf/base/var/log/messages
/conf/base/var/log/ppp.log
/conf/base/var/log/security
/conf/base/var/log/userlog
/conf/base/var/log/xferlog
/conf/base/var/md_size
/conf/default
/conf/default/etc
/conf/default/etc/fstab
/conf/default/etc/rc.conf

/diskless/boot の作り方に関しては次回

コメントを残す