それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

PXE boot でCD-ROMレスインストール

Debian仮想マシン作るのに、いちいちUSBメモリのBootableディスクを用意するのも・・な

インストールをPXEブートで行う。

起動する順序はこんな感じ。

  1. マシンがPXEブートする
  2. マシンはDHCP でPXE要求する
  3. DHCP でIP割り当ててTFTPdにアクセス
  4. pxelinux.0/cfg を入手して起動を始める
  5. インストーラーを起動する

図にするとこんな感じ。

pxe2

実際に設定する。

今回使用したのは、以下のとおり

  • dhcpd - dd-wrt を使う
  • tftpd - ローカルのdebian
  • インストールイメージ - debian のnetbootイメージ

dhcpd の設定。

コレは簡単 PXE - DD-WRT Wiki を参考にして

pxe3

  • Use DNSMasq for DHCP にチェック
  • Use DNSMasq for DNS にチェック

Services-> DNSMasq -> Additional DNSMasq Options に次を追加

dhcp-boot=pxelinux.0,atom,192.168.20.110
  • pxelinux.0 はイメージ名
  • atom はtftpd ホスト名
  • 192.168.20.110 はtftpdのIPアドレス

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ブートで起動するように設定して

pxe4

起動する。

pxe1

やったね、PXEで起動したよ!

これでインストールが楽ちんですね。

USBブートディスクを作らずに済みそうです。

liveCD とかも起動したい。

installler だけじゃ、物足りなくなる。だったらLiveCDもシンクライアントで起動したくなるよね。

LiveCDもパパっと選べたら楽しくなりそう。我が家にはPCが山ほどあるのでちょっとした実験にOSを入れなおすのは手間なんですよね。

LiveCD を動かすのも、ほとんど同じ

pxe7

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-kernel-server
  • debian live cd のイメージ

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を読みに行って。。。

pxe5

無事起動する

pxe6

拍子抜けするくらいに簡単。

順番を守って、ちゃんと設定すれば拍子抜けするくらいに簡単にLinuxは起動する。

こんなに簡単に実験環境を作れるなら、もっと使いやすくなると思う。

活用も色々

ディスクレスで起動するので、インストールが簡単になる。

メニューも作れば、memtestをすぐ起動したり、Live CDでリカバリできるし。USBブートディスク作るよりも楽ですね。

シンクライアントとして、完全なディスクレスのOSを作れば、Linuxをルータとして使っててもハードディスクが壊れた!っていう恐怖からも開放されます。NFS冗長化しておけばいいわけですしね。

PXEは使えそう

LXCでコンテナで起動するってのもあるけれど、OSそのものを選んで起動できるってのはやっぱり便利だと思いました。

参考資料

4.5. TFTP ネットブート用ファイルの準備

PXE-bootでDebian lennyをインストール - 絶品ゆどうふのタレ

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

PXEブートの応用 - 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

関連資料

PXEブートをためしたので - それマグで!