PXE Bootによるネットワークブート環境を持っておくと、HDDを乗せないディスクレスクライアントを用意したり、ディスクドライブ無しでUbuntuなどのインストールができて便利です。
なお、ネットワークブート環境を構築したのは、10インチノートPCであるN10Jcを、Ubuntu14.04-32bitで動作確認するためです。
(N10Jcは、EeePC的ノートPCでありながら、nVidiaのGPUを搭載している珍しい機体です。
一方で搭載CPUが比較的初期のAtom N270であり、32bit版OSしか動作しないため、他PCを64bit環境で統一していると、現在では運用が少しめんどうな機体でもあります。)
こちらが、PXEでディスクレス起動するゲストPCになります。
PXEサーバとなるホストPCは、普通の64bitシステムです。(Ubuntu15.04-amd64)
こちらのブログのSadayuki Furuhashi氏が書いたpxe-pdhcpを使用します。
http://frsyuki.hatenablog.com/entry/20070926/p1
基本の手順は、11.04での設定・手順を紹介しているこちらから。
http://kimamahitori.blog.shinobi.jp/Entry/317/
UbuntuディスクISOのマウントなどはこちらを参考にしました。
http://blog.akagi.jp/archives/3391.html
なお、こちらで紹介されているのはサーバUbuntu版で、今回ネットワークブートさせたデスクトップ版とはディスク内の構成が違う模様です。
今回はデスクトップ版(LiveCD)の設定・起動方法を扱います。
ネットワークブートの設定手順
tftp
最初にpxeのディレクトリを作成します。書き込み権限を付けておいたほうが、あとの作業が楽です。
mkdir /pxe
sudo chmod a+rw /pxe
ftpサーバを導入します。
sudo apt-get install -y inetutils-inetd tftpd-hpa -y
設定ファイルを編集します。
sudo vim /etc/default/tftpd-hpa
以下の内容に書き換え。
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/pxe"
#TFTP_ADDRESS="[::]:69"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure -vvv"
RUN_DAEMON="yes"
再起動して設定を反映します。
sudo service tftpd-hpa restart
nfs
nfsサーバを導入します。sudo apt-get install nfs-kernel-server -y
設定ファイルを書き換えます。
sudo vim /etc/exports
以下の内容を追記(設定はひとつにつき一行に書いて折り返さない)。
/pxe/images/ubuntu-14.04-amd64 *(no_root_squash,ro,async,insecure)
/pxe/images/ubuntu-14.04-i386 *(no_root_squash,ro,async,insecure)
nfsサーバを再起動して設定を反映します
sudo service nfs-kernel-server restart
Ubuntu Disc Image
ftpでブートメニューが読まれた後に要求される、起動したいUbuntu(Linux) のディスクイメージを、nfs上に展開します。
下記の空ディレクトリを作成します。
mkdir -p /pxe/images/ubuntu-14.04-amd64
mkdir -p /pxe/images/ubuntu-14.04-i386
ディレクトリにマウントします。
sudo mount -r -t iso9660 -o loop ~/ubuntu-14.04.1-desktop-i386.iso /pxe/images/ubuntu-14.04-i386/
sudo mount -r -t iso9660 -o loop ~/ubuntu-14.04-desktop-amd64.iso /pxe/images/ubuntu-14.04-amd64/
pxelinux.cfg/default (bootmenu)
クライアントPCがPXE機能で読み込む、ブートメニューや必要なバイナリを、ftp上に展開します。ネットワークブート・メニュー表示に必要なバイナリを、以下から取得・配置します。
バイナリを取得
wget http://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-4.04.tar.gz
解凍し、中のファイルを以下のパスに配置します。
/pxe/menu.c32
/pxe/pxelinux.0
ネットワークブートのブートメニューを以下に設定ファイルとして配置します。
vim /pxe/pxelinux.cfg/default
設定ファイルの内容は以下 (IPアドレスは環境により適切に読み替えます。)
# /pxe/pxelinux.cfg/default
DEFAULT menu.c32
PROMPT 1
NOESCAPE 0
ALLOWOPTIONS 0
TIMEOUT 100
MENU TITLE PXE Boot Menu
LABEL Ubuntu 14.04 amd64
kernel images/ubuntu-14.04-amd64/casper/vmlinuz.efi
append boot=casper netboot=nfs nfsroot=192.168.1.21:/pxe/images/ubuntu-14.04-amd64 initrd=images/ubuntu-14.04-amd64/casper/initrd.lz -- splashd
LABEL Ubuntu 14.04 i386
kernel images/ubuntu-14.04-i386/casper/vmlinuz
append boot=casper netboot=nfs nfsroot=192.168.1.21:/pxe/images/ubuntu-14.04-i386 initrd=images/ubuntu-14.04-i386/casper/initrd.lz -- splashd
LABEL Ubuntu 14.04 amd64(non splash)
kernel images/ubuntu-14.04-amd64/casper/vmlinuz.efi
append boot=casper netboot=nfs nfsroot=192.168.1.21:/pxe/images/ubuntu-14.04-amd64 initrd=images/ubuntu-14.04-amd64/casper/initrd.lz
pxe-pdhcp
Sadayuki Furuhashi氏が作成したpxe-pdhcpをソースで取得し、ビルドして使用します。今回はroot直下に/pxe-pdhcpディレクトリとしてソースとバイナリを展開しました。
sudo make /pxe-pdhcp
chmod a+rw /pxe-pdhcp
cd /pxe-pdhcp
git clone https://github.com/frsyuki/pxe-pdhcp
なお、いくつかのブログでバッファオーバーフロー警告に対するコード修正が紹介されていますが、今回はしなくても動作したので、とりあえずコードを書き換えていません。
ビルドします。
make
実行します。(IPアドレスは環境により適切に読み替えます。)
sudo /pxe-pdhcp/pxe-pdhcp -l 0.0.0.0 -b 255.255.255.255 -t 192.168.1.21 -d pxelinux.0
クライアントPCからネットワークブートを実行
PXEサーバ(pxe-pdhcp)が起動している状態でクライアントPCからネットワークブート操作を行うことで、ネットワークブート可能です。クライアントPCのネットワークブート方法は、マシンにより異なるので、サイト・マニュアル・グーグル検索を活用してください。
BIOS/EFIの設定画面で、PXEを有効にする必要があるかと思います。
とりあえず、一般的にはBIOS/EFI設定画面に行くなら、起動画面でDeleteキー押下かと思います。
また、ESC/F2キーなどでブートセレクタを呼び出せるPCもあります。
ブートセレクタにPXE(Network boot)が無い場合、BIOS/EFIの設定でPXEが無効になっているかもしれません。
ちなみに今回クライアントPCとして使用したN10Jcの場合は、
F2:BIOS設定
ESC:ブートメニュー
でした。
その他
手順中に、2箇所ほど、PXEサーバのIPアドレスを指定する個所があります。(特にネットワークブートメニューのnfsroot設定)
そのため、PXEサーバマシンはIPアドレスを固定設定にすると、今後の利用が楽になります。
Ubuntuのディスク内容をNFS上に置く必要がありますが、毎度ISOファイルをマウントするのが面倒であれば、コピーして配置してしまうと楽になります。