Debianの仮想マシン作るのに、いちいちUSBメモリのBootableディスクを用意するのも・・な
インストールをPXEブートで行う。
起動する順序はこんな感じ。
図にするとこんな感じ。
実際に設定する。
今回使用したのは、以下のとおり
dhcpd の設定。
コレは簡単 PXE - DD-WRT Wiki を参考にして
Services-> DNSMasq -> Additional DNSMasq Options に次を追加
dhcp-boot=pxelinux.0,atom,192.168.20.110
tftpd の設定
今回使用したのは、debian squeeze の atftpd
tfptd のインストール
sudo aptitude install atftpd
tftpd の設定
/etc/rlinetd.d/tftp_udp
# This file was automatically generated by inetd2rlinetd # Generated from: tftp dgram udp4 wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /srv/tftp service "tftp_udp" { enabled yes; protocol udp; family ipv4; port "tftp"; user "nobody"; exec "/usr/sbin/in.tftpd --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /var/tftpd"; server "/usr/sbin/tcpd"; wait yes; }
この exec のところをで、tftpd が使うディレクリを指定する
sudo mkdir -p /var/tftpd sudo chmod g+rwx /var/tfptd cd /var/tftpd/
設定できたらinet.dを再起動
sudo service rlinetd restart
今使ってるsqueezeは inetd に rlinetdが使われていた。
あとは、Mac のクライアントから、tftpd をチェックする
takuya@mac_osx:~/Desktop$ tftp 192.168.xxx.xxx tftp> put a.jpg Sent 14448 bytes in 0.1 seconds tftp> get a.jpg Received 14448 bytes in 0.1 seconds tftp>
ファイルが正しくput/get できたら、tftpdの準備完了
debian のpxeboot イメージの準備
今回は squeeze の pxeboot イメージを用意した
rikenのサーバーからdebian を取得する、ターゲットはここ。
ftp://ftp.riken.jp/14/debian/debian/dists/squeeze/main/installer-i386/current/images/netboot/
tftpd のフォルダに入って
cd /var/tftpd/ wget ftp://ftp.riken.jp/14/debian/debian/dists/squeeze/main/installer-i386/current/images/netboot/netboot.tar.gz tar zxvf netboot.tar.gz
展開するとこんな感じ。
takuya@debian01:/var/tftpd$ tree -L 1 . ├── a.jpg ├── debian-installer ├── netboot.tar.gz ├── pxelinux.0 -> debian-installer/i386/pxelinux.0 ├── pxelinux.cfg -> debian-installer/i386/pxelinux.cfg └── version.info
このファイルが設定通りに問題なくtfptd経由で読み出せるか、mac からチェック
takuya@mac_osx:~/Desktop$ tftp 192.168.2.9 tftp> get pxelinux.0 Received 27202 bytes in 0.1 seconds tftp>
準備完了。
あとは仮想マシンで実験。マシンをPXEブートで起動するように設定して
起動する。
やったね、PXEで起動したよ!
これでインストールが楽ちんですね。
USBブートディスクを作らずに済みそうです。
liveCD とかも起動したい。
installler だけじゃ、物足りなくなる。だったらLiveCDもシンクライアントで起動したくなるよね。
LiveCDもパパっと選べたら楽しくなりそう。我が家にはPCが山ほどあるのでちょっとした実験にOSを入れなおすのは手間なんですよね。
LiveCD を動かすのも、ほとんど同じ
LiveCDを動かすのもnetboot install を動かすのも大差ない。
LiveCDやOSをディスクレスで起動するなら、ディスクをネットワーク上に用意する必要がある。今回はtftpd上のLiveCDを、そのままをNFS-server に共有してNFSをマウントしてファイルシステムを使う。
tftpd と nfs-server がそれぞれが/var/tfpd/debian-live/ディレクトリを共有しているように設定した。
基本要素の準備
takuya@atom:/var/tftpd$ tree -L 2 . . ├── debian-live ├── pxelinux.0 └── pxelinux.cfg ├── debian-live.cfg └── default -> debian-live.
- pxelinux.0 これは、debian のPXEブートイメージを
- pxelinux.cfg は mkdir で作成
- pxelinux.cfg/default は今回作成する。
- debian-live/ はここにDebianのLiveCDの中身を置く
準備するもの
nfs サーバーは、PXEブート後にLiveCDの中身にアクセスにNFSを使ったNFSブートをするので、必要
debian live cd はその中身を丸コピーして利用する
Live CD の準備
Gnome Desktop のLive CD をDebian Liveのプロジェクトからもらってくる。
wget http://cdimage.debian.org/debian-cd/current-live/i386/iso-hybrid/debian-live-7.6.0-i386-gnome-desktop.iso
ディスクの中身を取り出す。
マウントして、cp (rsync)で取り出す
sudo mount debian-live-7.6.0-i386-gnome-desktop.iso /mnt rsync -av --progress --partial /mnt/ /var/tftpd/debian-live chmod -R u+rw /var/tftpd/debian-live
Live CDの中身を確認する
takuya@atom:/var/tftpd/debian-live$ tree -L 2 . . (略 ├── isolinux │ ├── advanced.cfg │ ├── boot.cat │ ├── hdt.c32 │ ├── install.cfg │ ├── isolinux.bin │ ├── isolinux.cfg │ ├── live.cfg │ ├── menu.cfg │ ├── splash.png │ ├── stdmenu.cfg │ └── vesamenu.c32 ├── live │ ├── filesystem.packages │ ├── filesystem.packages-remove │ ├── filesystem.squashfs │ ├── initrd1.img │ ├── initrd2.img │ ├── memtest │ ├── vmlinuz1 │ └── vmlinuz2 (略) 11 directories, 30 files
今回使うのは、PXEブート後に、起動するLinuxカーネル isolinux/ と ライブCDの本体 live/の2つ
LiveCD のブート手順を確認する
takuya@atom:/var/tftpd/debian-live$ cat isolinux/live.cfg label live-486 menu label ^Live (486) menu default linux /live/vmlinuz1 initrd /live/initrd1.img append boot=live config quiet splash (略)
いくつかあるけれど、ブートメニューに関しては後で考えるので、まずはdefault の起動設定を確認しておく
debian のLive CD は
- /live/vmlinuz1
- /live/initrd1.img
の2つを使うことがわかる。
pxe boot の起動設定を作る
ここまで、確認したディレクトリをtftpd から見えるPathで作っておく。
pxelinux.cfg/default
default live label live linux /debian-live/live/vmlinuz1 initrd /debian-live/live/initrd1.img append # 次で作る
/var/tftpdのルートを確認
takuya@atom:/var/tftpd$ tree -L 1 . . ├── debian-installer ├── debian-live ├── netboot.tar.gz ├── pxelinux.0 └── pxelinux.cfg
ここが tftpd のroot になるので、 /debian-live/live/vmlinuz1, /debian-live/live/initrd1.imgで大丈夫だとわかる。
nfs の準備
ファイルシステムはNFS でマウントさせる必要があるので。nfs を準備する
NFSのエクスポートは次のとおりに編集できる
sudo vim /etc/exports
/etc/exports の中身追加して、nfs 経由で debian-live ディレクトリにアクセス可能にする。
/var/tftpd/debian-live *(ro,insecure,no_root_squash,async,no_subtree_check)
設定を反映させる
sudo service nfs-kernel-server reload
NFS の設定反映を確認する
sudo mount -t nfs 192.168.20.19:/var/tftpd/debian-live /mnt ls /mnt/live sudo umount /mnt
これでNFSの準備が整った。
NFS の設定を起動設定 pxelinux.cfg/default に追記する
pxelinux.cfg/default
default live label live linux /debian-live/live/vmlinuz1 initrd /debian-live/live/initrd1.img append boot=live config netboot=nfs nfsroot=192.168.20.19:/var/tftpd/debian-live quiet splash
これで準備完了
仮想マシンで確認する
PXEブートを有効にした仮想マシンで、起動してみる。
PXEブートが始まって。NFSを読みに行って。。。
無事起動する
拍子抜けするくらいに簡単。
順番を守って、ちゃんと設定すれば拍子抜けするくらいに簡単にLinuxは起動する。
こんなに簡単に実験環境を作れるなら、もっと使いやすくなると思う。
活用も色々
ディスクレスで起動するので、インストールが簡単になる。
メニューも作れば、memtestをすぐ起動したり、Live CDでリカバリできるし。USBブートディスク作るよりも楽ですね。
シンクライアントとして、完全なディスクレスのOSを作れば、Linuxをルータとして使っててもハードディスクが壊れた!っていう恐怖からも開放されます。NFSを冗長化しておけばいいわけですしね。
PXEは使えそう
LXCでコンテナで起動するってのもあるけれど、OSそのものを選んで起動できるってのはやっぱり便利だと思いました。
参考資料
PXE-bootでDebian lennyをインストール - 絶品ゆどうふのタレ
ライブUbuntuをネットワークブートする − ディスクレスサーバ構築 - adsaria mood
Index of /debian-cd/current-live/i386/iso-hybrid
http://www.debian-administration.org/article/478/Setting_up_a_server_for_PXE_network_booting.ja
How to convert a LiveCD into a vmlinuz and initrd to PXE Boot Load Slowly - Ask Ubuntu
Mac Os X: Mount NFS Share / Set an NFS Client
Debian 6.0 Live イメージを PXE 経由でブート - daily dayflower