Linuxとpxegrub

インストールは面倒

1台ならともかく、複数台となるとけっこうインストールは面倒なものである。

Redhat系ならkickstartというしくみがあり、 これを利用すればくり返しの作業がほとんど無くて済む。 しかし、できるだけ無人でおこなおうとすると、 かなりの工夫やノウハウが必要となる。

今回、Dell OptiPlex GX240を対象に、Redhat Linux 7.2を 簡単にLinuxをインストールする仕組みを検討した。

具体的にはWOLとPXEとGRUB、キックスタートを使う方法である。

クライアントは、PXEが利用できることと、 ディスクにパーティションのとられていない空き領域が必要である。 サーバはDHCP, TFTP, NFSのサーバであることが必要である。

PXE

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

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がブートするので、 リモートログインしてシャットダウンすれば良いだろう。