絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

PXE-bootでDebian lennyをインストール

先日、家で愛用していた無音サーバのHDDが、逝った。ハード的に。嫌な音がしてた。


で、保証期間内だったから修理に出したけど、まぁ当然のごとくHDD交換になった。
まぁそれはいいんだわ。
別に大事なデータはいってたわけじゃないし、幸いにもまわりに釣られて開発中のライブラリをopenpearにぶち込むとか言う事をしていたために、自分リポジトリが消えたことによる損失も最小限に抑えることができた。*1


問題は、OSからしてクリーンになって戻ってきてること。
無音サーバ、って名前からしてもう気付いてるとおもうけど、余計な装置は無いんだ。うちには外付けの装置なんか何もないもんだから、以前は会社にあったUSB-CDROMとかでインスコ*2したんだけど、さすがにもうメンドイ。しかもこの連休ですよ。*3


PCを何台も手元に揃えておきながら、このザマか!お前はたかだかCDROMドライブ一個無いだけで何もできない愚か者なのか!
と、喧嘩を売られたような気がしたので、PXE-bootを使ったOSインストールに挑戦してみることにした。


ま、そんなわけで詳細は以下。

事前に用意しておくもの

1. 母艦サーバ

PXE-bootを行うには、最初に母艦になるDHCPサーバを立てる必要がある。
幸いうちには何台かサーバがあったので、今回はそのうちの一台に必要な設定を行って、クライアントと1対1で繋げる事にした。
わざわざ1対1でつなげたのは、ルータのDHCP機能を切り替えたり、といった作業はナンセンスだなぁと思ったので。
ぶっちゃけDHCPの細かい仕組みとか深く知らないし、インスコしてる間に他のPCでネット見れないオチになるとマンドクセいし。
1対1にするだけならLANの線つなぎかえるだけじゃーん。というゆとり発想。クロスケーブルとか気にしてない。


なお、今回は母艦にDebian lennyを使用した*4
Redhat系ならこの辺の記事が詳細に書いてあったりしていい。

2. クライアントのMacアドレスとPXE-boot設定

後で紹介する母艦の設定の際、PXE-bootを行う対象となるクライアントのMacアドレスが必要となる*5


Macアドレスの調べ方だが、クライアント起動時にPXE-bootのためにDHCP問い合わせが行われる際、その起動画面ログに表示されていたりするので、それをメモったりするのがが手っ取り早い。
また、そもそもBIOSでPXE-bootがOFFにされているような場合もあるので、そのあたりの設定も事前にBIOSをいじって有効にしておく必要がある。
大体見ておくべきBIOS設定としては
・LANのPXE-boot設定項目(LANのROMを使うか?みたいな設定項目)
・ドライブの起動順(Legacy LAN とかPXE-bootとかの名前が多いっぽい)
MBRがあったら起動順すっ飛ばすようにする設定(たまにある)
あたりだろう。

母艦サーバの設定

PXE-bootに必要なものは、以下の3つ
・dhcp3-server(debパッケージ)
・atftpd(debパッケージ)
・netboot.tar.gz

dhcp3-serverはPXE-bootするクライアントが問い合わせするDHCPサーバ。atftpdはその際にブートROMとなるkernelイメージ等を提供するのに利用される。
netboot玉は ftp://ftp.riken.jp/11/debian/debian/dists/lenny/main/installer-i386/20090123/images/netboot/ などの各ディストリのツリー内においてあるので、それを頂いてくる。
このtar玉には、kernelイメージとかinitrdとかネットインストールに必要な最低限の物と設定をパッケージにして作ってくれてあるもの。
自前で用意してもいいけど、大変便利なのでぜひ使うといい。これは、tftpサーバが読み出す場所においておくことになる。

1. パッケージのインストール

ということで、以下のような手順でインスコ

% sudo apt-get install dhcp3-server
% sudo apt-get install atftpd
% wget ftp://ftp.riken.jp/11/debian/debian/dists/lenny/main/installer-i386/20090123/images/netboot/netboot.tar.gz

tftpサーバがPXE-bootの際、デフォルトで読み出す場所は/var/lib/tftpbootになる*6ので、このtar玉はそこに展開する。

% cd  /var/lib/tftpboot
% sudo tar xvzf ~/netboot.tar.gz

tarをsudoすんなよとかは今は瑣末な問題なのでスルー。

2. DHCPサーバの設定

多分このあたりからはrootでやったほうが話が早い。っていうかメンドクてそうやった。
次にdhcpサーバの設定をする。
/etc/dhcp3/dhcpd.confをいじっていく。今回は1対1なのでぶっちゃけけっこう適当でおkだったりする。
ざっくりやったことのポイントをまとめると

上1番目はコメントアウトをするしないなので説明は特にしない。authoritativeは無かったら

authoritative;

とだけ書けばOK。これは、自分が本物のDHCPサーバだよ!と言う設定。
subnetとhostは、以下のようになるが、それぞれ環境によって適宜変えてほしい。

subnet 192.168.1.0 netmask 255.255.255.0{
    option routers 192.168.1.10;
    option broadcast-address 192.168.1.255;
}
host clienthoge {
    hardware ethernet xx:xx:xx:xx:xx:xx;
    fixed-address 192.168.1.100;
    filename "pxelinux.0";
}

subnetの項目中、routersには母艦のIP(自分で/etc/network/interfacesなどで割り当てるとよい)を指定。他は空気読んで。
hostの項目は、hardwareにクライアントのMacアドレス、fixed-addressに割り振りたいIPとpxelinx.0(/var/lib/ftpbootにあるファイル)を指定。

これができたら、DHCPサーバを起動する。

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

失敗したら/var/log/syslog見れば大体わかるからそれで直す。

3. tftpの設定

デフォルトではinetdを使って動作するようになってるが、これだといまいち上手く行かないので、設定を変更する。
/etc/default/atftpdをいじって、以下のように変更する。

USE_INETD=false
OPTIONS="--daemon --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /var/lib/tftpboot"

具体的には、--daemon をつけるのと、USE_INETD=falseの2点が変更してある。
これも、設定が終わったら起動する。

# /etc/init.d/atftpd start


以上で、母艦の設定が完了。

PXE-bootクライアントの処理

あ、先にBIOS設定の話しちゃったからあと起動するだけ><


とはいえ、実際に起動した後「1対1ネットワークだけどパッケージのnetinstどうすんの?取ってこれないんじゃないの?」みたいな問題が出る。
それはどうするかと言うとw大変荒っぽい話ではあるが、ブートイメージがローディングし終わった段階(Debianマークが出る最初の画面)で、LANケーブルを差し替えればいい。
bootの際には確かにDHCPでkernelイメージを読み出したが、その後インストーラ側のほうでも別途DHCPでネットワークアドレスを取得してくるプロセスが存在する。
なので、その作業が行われる前にLANケーブルがWANに繋がっているネットワーク空間に接続されていれば、問題なくインストールを続行できる。


ちなみに、自分の場合はethが2つあるマシンで作業を行ったので、eth0が母艦DHCPサーバ、eth1が普段使っているルータという構成で臨み、デフォルトネットワークポートの設定を選択する画面でeth1をデフォルトに選んだ。
そうすると、その後のDHCP構築とかパッケージインストールはeth1経由で行ってくれるので、いちいちLANを差し替えたりせずに済む。2ポート最強。


まぁ、これで後はいつもどおりにインストール作業を進めていけば、めでたくPXE-bootによるネットワークインストールの完了です。
あ、一応書き添えておくと、全て終わった後に母艦のDHCPとかはちゃんと切るように気をつけてね!authoritativeになってるから悪さしても知らないよ!


というわけで、最後に参考文献:
unoh.net
PXEを利用してDebianをネットワークインストールする - The dream is invincibility.
http://wiki.moccori.com/doku.php/memo/debian_networkinstall

http://tech11head.blogspot.com/2007/06/pxedebian.html
manとかも色々見たけど、やっぱ設定ファイルのコメントとかシェルスクリプト読んだりするの重要だと思った。


TODO:あとVMWareでこれを実現する方法はとても興味あるので、id:studio-mにそれを聞く。

*1:こういうこともあるし、ライブラリはどんどん公開領域に置いたほうがいいよ!

*2:休日に借りてきた。パチッたわけじゃないよ!

*3:まぁ連休も会社行くけど。

*4:多分、ここが何かってけっこう重要

*5:なくてもいいらしい、という話も聞いた。

*6:atftpdの本当のデフォルトは/tftpboot。でも、debパッケージでインストールすると設定ファイル内で/var/lib/tftpbootが指定してあり、ディレクトリも作ってくれるので、こちらを使うほうが良いとおもう