1台ならともかく、複数台となるとけっこうインストールは面倒なものである。
Redhat系ならkickstartというしくみがあり、 これを利用すればくり返しの作業がほとんど無くて済む。 しかし、できるだけ無人でおこなおうとすると、 かなりの工夫やノウハウが必要となる。
今回、Dell OptiPlex GX240を対象に、Redhat Linux 7.2を 簡単にLinuxをインストールする仕組みを検討した。
具体的にはWOLとPXEとGRUB、キックスタートを使う方法である。
クライアントは、PXEが利用できることと、 ディスクにパーティションのとられていない空き領域が必要である。 サーバはDHCP, TFTP, NFSのサーバであることが必要である。
PXEはインテルが提唱するネットワークを利用したブートの機構である。
Dell OptiPlex GX240では、BIOSの設定を
とすることにより、平時はHDDから起動し、 WOLパケットを受信したときだけネットワークブートをおこなうようにできる。
PXEの正規の機構では、[DHCP]→[PXE-DHCP]→[MTFTP]→と 進むようなのだが、 MTFTPもPXE-DHCPもここでは転がっていなかったので、 [DHCP]→[TFTP]の様に進ませる。
具体的には、DHCPのサーバが"dhcp-class-identifier"オプションに "PXEClient"と言う文字列をいれた返事を出さなければ、 PXEはTFTPを利用することになる。
dhcpd.conf(dhcpd-1.3系統用)は
server-identifier flyaway; server-name "Linux Install Server"; option domain-name "xxxxx.pu-toyama.ac.jp"; option domain-name-servers 133.55.xxx.yyy; option routers 133.55.xxx.254; subnet 133.55.xxx.0 netmask 255.255.255.0 { } host client002 { hardware ethernet 00:06:5b:uu:vv:ww; fixed-address 133.55.xxx.zzz; option vendor-encapsulated-options 06:01:0a:ff; filename "pxegrub"; option option-150 "(nd)/grub-002.conf"; }
の様に、MACアドレス1つに付き、 固定IPアドレス1つの設定を書くことにする。
(もしRedHat9等でISCのDHCP Ver.3の系統を使うときは こっちを見ると良い)
また、tftp-serverをインストールし、/etc/xinetd.d/tftpファイルを 次のようにして、tftpサーバが起動するようにする。
service tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /tftpboot disable = no }
結局、BIOSを設定しDHCPとTFTPのサーバを利用すれば、 ネットワークから読み込まれたプログラムを 起動できるようになる。
PXEGRUBとは、PXEで利用するために作成されたGRUBである。
GRUBは現在GNUが開発しているPC用のブートローダである。 まだ、正式版は出ていないが、多様なファイルシステムを理解し、 インタラクティブにも自動的にもブートができるため、 LILOよりもいろいろなことに使える。
PXEGRUBは以下のファイルから生成する。
展開して、パッチを当てて、
"./configure --enable-diskless --enable-3c90x --disable-ffs --disable-minix --disable-reiserfs --disable-vstafs --disable-jfs --disable-xfs --disable-serial --disable-auto-linux-mem-opt"
とする。最期のオプションは付けなくとも、 コマンドラインでもパッチでも何とからなるけど、 ともかくGRUBからLinuxにmemオプションを渡させてしまうと、 ブートが不可能となるので注意。
後はmakeすると、stage2ディレクトリにpxegrubができている。
ブートの制御を行うファイル"grub-002.conf"は次のように書くとよい。
timeout 0 title inst kernel (nd)/vmlinuz ks=nfs:xxx.yyy.zzz.www:/tftpboot/ks-002.cfg initrd (nd)/initrd.img
ただし、xxx.yyy.zzz.wwwはIPアドレスである。 NFSを使わないのなら、それなりに書き方を変えること。
これで、ネットワークのみ使用して、遠隔から ブートの制御ができるようになる。 例えば、このgrub-002.confをローカルのgrub.confと同じように書けば、 同じようにブートする。
redhat7.2には、bootnet.imgというフロッピーイメージがある。 フロッピーにいれるなり、loopを使うなりして、 このイメージから、カーネルvmlinuzとラムディスクイメージinitrd.imgを 取りだす。
また、ks-002.cfgはこんな感じである。
このキックスタートのファイルはそこそこカスタマイズされているので、 注意して欲しい。
対応するNFSサーバも用意すること。 キックスタートファイル中で指定された場所に、 RPMディレクトリbaseディレクトリを下位にもつ"RedHat"ディレクトリが あることが必要である。
RedHat/RPM/の下のrpmファイルを変更した場合、 anaconda-runtimeパッケージに含まれるgenhdlistコマンドを 使用して、Redhat/comp/hdlist等を書き換える 必要が出て来ることに注意。
これで、遠隔起動されたインストール用カーネルで、 ネットワークインストールができるようになった。
もう一度ファイルをどこに置くのかなど整理する。
/tftpbootディレクトリに、
を置き、/tftpbootディレクトリがtftp経由でもNFS経由でも 読み出せるように設定する。
dhcpd.confを適切に設定し、dhcpdサーバを起動する。
以上である。
きちんと設定できたら、 WOLのパケットを送るプログラムを利用して、 クライアント機をブートする。
十数秒程度まつと、自動的にインストールが始まり、 8分程度で終了し再起動する。
その後はLinuxがブートするので、 リモートログインしてシャットダウンすれば良いだろう。