ライブUbuntuをネットワークブートする − ディスクレスサーバ構築

サーバのOSをFedoraからUbuntuに替えたのでFedoraで使っていたディスクレス・クライアントをサポートするサーバ(以下、ディスクレスサーバ)の機能をUbuntuに実装しようとしたのだが、どうもUbuntuFedoraの様なディスクレスサーバ向けの管理ツールとかが見当たらなかった(探し方が悪いのかも知れないが。)仕方ないので、PXEベース(HDCP+TFTP+NFS)で自力で構築してみた。

ところが、Ubuntu DesktopのライブCD環境のベースとなっているcasper*1を使うと拍子抜けする程簡単に実現できてしまった。PXEを使ってライブCDをネットワークブートできる、ということはCD/DVDの無いマシンにUbuntuをインストールできることは勿論、HDDすら持たないマシンに対してはUbuntuのライブ環境をそのままディスクレスPCとして利用できると言う事になる。Ubuntuはライブ環境とインストール環境が一体となっているので、ディスクレスの実現にとっては大変便利だ。

実装は本当に簡単。

1. DHCPサーバのインストールと設定
2. TFTPサーバのインストールと設定
3. syslinuxのインストールと設定
4. NFSサーバのインストールと設定

以上で作業終了である。

あと用意するのはUbuntu DesktopのライブCDのイメージ(ISOファイル)。確認したのは8.10のみだが、casperベースであれば8.04でも8.10でも構わないと思う。

私が確認した環境はサーバがUbuntu Server 8.04 LTS、クライアントがUbuntu Desktop 8.10である。casperはクライアント側で使う仕組みなので、以下の方法では、サーバ側はUbuntu以外のOSでもディスクレスサーバと構築できるはず(論理的には。未確認)。極端な話、Windows ServerでもUbuntuディスクレスを簡単に構成できるのではないか。

PXEブートを使うためにはDHCP、TFTP、syslinux(pxelinux)が必要だが、その辺のカラクリについては書き出すと長くなるので“PXEによるディスクレス・クライアント(総集編)”あたりを参照してほしい。

以下の説明ではrootで作業することがほとんどなので、予め“sudo -s”しておく。(いちいちsudoは付けずに話を進める。)

登場者は以下の通り:

サーバ Server for diskless clients
OS Ubuntu Server 8.04 LTS amd64
ホスト名 server-1
IPアドレス 192.168.1.1
クライアント Diskless Client
OS Ubuntu Desktop 8.10 i386
ホスト名 diskless-200
IPアドレス DHCPにて固定で192.168.1.200

DHCPサーバのインストールと設定

“dhcp3-server”というパッケージをインストールする。

# apt-get install dhcp3-server

DHCPサーバの設定ファイル“/etc/dhcp3/dhcpd.conf”を変更する。これは環境によって変わるが、次のような設定をファイルの最後に追加すれば大体OKだと思う。

allow unknown-clients;

subnet 192.168.1.0 netmask 255.255.255.0 {
	range 192.168.1.128 192.168.1.254;
	option broadcast-address 192.168.1.255;
	option domain-name-servers 192.168.1.2;
	option domain-name "localnet";		# Domain name
	option routers 192.168.1.2;
}

host diskless-200 {
	hardware ethernet	23:45:69:BF:3C:53;		# Ethernet MAC address
	fixed-address	diskless-200;		# Hostname or IP address
	next-server	192.168.1.1;		# should be IP address
	filename		"pxelinux.0";
}

この例では 192.168.1.0/24 のネットワークに対してアドレスを割り振るDHCPサーバ例である。後半の項目がディスクレスクライアントに対するものだが、“hardware ethernet”はクライアントのイーサネットアドレスを記述する。“fixed-address”、“next-server”はクライアントとサーバのIPアドレスを入れる。ただし、/etc/hostsやDNSでちゃんと管理されている環境であれば fixed-address はホスト名でもOK。(マシンのIPを変更した時にアチコチ修正しなくてもいいので、出来るだけホスト名での記述の方が良いと思う。)
なお、このLANのドメイン名は“localnet”にしたので、使う環境にあわせて“localdomain”などに変更する必要もある。(名前については“ネットワークの名前を考えてみた”参照)

サービスを再起動する。

# /etc/init.d/dhcp3-server restart

ここまでの設定でディスクレスクライアントを起動すると


TFTPサーバのインストールと設定

“tftpd-hpa”というパッケージのTFTPをインストールする。atftpでも大丈夫だが、普通の“tftp”パッケージではNG。(予めファイルサイズを取得するtsizeオプションが使えないため。)

# apt-get install tftpd-hpa

tftpd-hpaの起動方法は2つ。1つはinetdにより必要な時にだけ起動する方法。もう一つはtftpd-hpa自身がデーモンとして常駐する方法。今のPCはメモリもフンダンにあるので常駐で良いと思う。ちゃんと起動しているか確認できるという利点もある。その場合、設定ファイル /etc/default/tftpd-hpa を次のように変更する(RUN_DAEMONを“yes”に)。

#Defaults for tftpd-hpa
RUN_DAEMON="yes"
OPTIONS="-l -s /var/lib/tftpboot"

tftpd-hpaは標準で/var/lib/tftpbootをTFTPのルートディレクトリとして使う。今回はこのまま実験した。ただ、パスが深くて不便なので次のようにシンボリックリンクを張っておいた。(以下、省略して“/tftpboot”とだけ書くが実際は/var/lib/tftpbootが対象となる。)

# ln -s /var/lib/tftpboot /tftpboot

設定が終わったらサービスを再起動しておく。

# /etc/init.d/tftpd-hpa restart

ここまでの設定でディスクレスクライアントを起動すると


syslinuxのインストールと設定

PXENBP(Network Bootstrap Program)である pxelinux.0 をインストールする。pxelinux.0 は“syslinux”パッケージに含まれている。

# apt-get install syslinux

syslinuxをインストールすると /usr/lib/syslinux/ に色々なファイルがダウンロードされるが必要なのはその中の pxelinux.0 だけ。これを /tftpbootへコピーする。

# cp /usr/lib/syslinux/pxelinux.0 /tftpboot

/usr/lib/syslinux/にあるファイルを上手く使えばネットワークブート時にメニューを出したりできるが、今回は本質ではないので省略した。(応用については“PXEブートの応用”を参照。)

次にpxelinux.0でどのカーネルやどのinitrdをダウンロードするか指示するための設定ファイル /tftpboot/pxelinux.cfg/default を作成する。直接、defaultというファイルを作らずに“default.ubuntu-8.10-i386”という名前で作成して default からシンボリックしておく。(pxelinuxはクライアントのIPアドレス毎にも設定を変えることができる。“PXEサーバの設定:その他の設定”を参照。)

# mkdir /tftpboot/pxelinux.cfg
# vi /tftpboot/pxelinux.cfg/default.ubuntu-8.10-i386
	:
	:
# ln -s default.ubuntu-8.10-i386 /tftpboot/pxelinux.cfg/default

default.ubuntu-8.10-i386 の内容は以下のようにした。

default live
label live
	kernel	/ubuntu-8.10-i386/casper/vmlinuz
	append initrd=/ubuntu-8.10-i386/casper/initrd.gz file=/ubuntu-8.10-i386/preseed/ubuntu.seed boot=casper netboot=nfs nfsroot=192.168.1.1:/tftpboot/ubuntu-8.10-i386 quiet splash --

この様な設定にしたのは、次のような環境にしたため。
クライアントのファイルシステムを (/var/lib)/tftpboot/ubuntu-8.10-i386/ というディレクトリに置いてく。これは pxelinuxのコンフィグファイルをクライアント毎に用意することで、異なるUbuntuのバージョン、異なるアーキテクチャi386/amd64)のディスクレスを同時にサポートできる。そのためにOSのバージョン+アーキテクチャの名前のディレクトリを作って、その下に格納するようにした。

ここまでの設定でディスクレスクライアントを起動すると

/tftpboot/ubuntu-8.10-i386 の下にUbuntuのライブCDに入っている casper というディレクトリと preseedというディレクトリをコピーして来る。が、私の場合はこのディレクトリにライブCDのISOファイルをマウントして使っている。
コピーして使う場合:

# cp -r /cdrom/casper /cdrom/preseed /tftpboot/ubuntu-8.10-i386

マウントして使う場合:

# mount -o loop,ro /..../ubuntu-8.10-desktop-i386.iso /tftpboot/ubuntu-8.10-i386

ここまでの状態で、Ubuntuカーネルがネットワークで起動するところまで行く筈である。一旦、クライアントの電源を入れて確認してみる。
しかし、またデスクトップまでは行きつかない。それにはNFSの機能が必要となる。
ここまでの設定でディスクレスクライアントを起動すると


NFSサーバのインストールと設定

nfs-kernel-server”というパッケージをインストールする。

# apt-get install nfs-kernel-server

/etc/exportsを設定してクライアントからマウント出来るようにする。

/tftpboot/ubuntu-8.10-i386       *(ro,all_squash,no_subtree_check,crossmnt)

特定のクライアントだけにアクセスを許すのであれば“*”の代わりにクライアントのホスト名を記述るが、内容はUbuntuのCDのなのでRead Onlyで広く開放してもいいと思う。
最後にNFSサーバを再起動する。

# /etc/init.d/nfs-kernel-server restart

以上で設定は終了となる。クライアントがUbuntuのライブ環境で立ち上がるはずである。


ディスクレス(もちろんCD/DVDレス)のマシンで動いているライブUbuntu

*1:Run a "live" preinstalled system from read-only media:読出し専用メディアに予めインストールされた“ライブ”システムを実行する