PXEブートでインストーラを起動する
Posted on Wed 01 January 2014 in blog
最近、VMwareのESXiで仮想環境を作っています。
触っていて気づいたのですが、空の仮想マシンを起動するとPXEブートを試みてくれます。
この仕様をうまく使いたいなーと思って、PXEブートでインストールを自動化する方法を調べました。
PXEブートしてインストールを自動化するまでの手順を簡単に書いていきます。
Debianをインストールサーバーとして予め立てておき、DebianまたはCentOSをインストールすることにします。
1. Debian Install
最初のDebianはCDやらで手動でインストールしてください。
Debianのインストール手順は省略します。
2. DHCPサーバーを立てる
# Install DHCP Server
apt-get install isc-dhcp-server
# Config DHCP : INTERFACES
vi /etc/default/isc-dhcp-server
# Modify INTERFACES="" to INTERFACES "eth1"
# Config DHCP : Server setting
vi /etc/dhcp/dhcpd.conf
編集する箇所は以下の通りです。
https://gist.github.com/10664868
DHCPサーバーを再起動して設定を反映させます。
# Restart DHCP Server
/etc/init.d/isc-dhcp-server restart
3. TFTPサーバーを立てる
デフォルトで大丈夫でした。
# Install TFTP Server
apt-get install tftpd-hpa
4. PXEブート用のイメージを準備する
以下のページから適当にnetbootイメージを選んで、netboot/netboot.tar.gzを取って来ます。
# 展開する
tar xvf netboot.tar.gz
# move files to root dir of TFTP
mv ./* /srv/tftp
5. 中間チェック
この段階でPXEブートしてみると、Debianのインストーラが立ち上がるようになります。
ブート画面でOSを選択できるようにする
6. CentOSのインストーラを準備
- mkdir -p /srv/tftp/centos/6.5/x86_64
- CentOSのインストールDVDを持って来る
- mount -o loop <CentOS install ISO> /media
- /media/images/pxeboot/にある次の2つのファイルを/srv/tftp/centos/6.5/x86_64/以下にコピーしてくる
- initrd.img
- vmlinuz
- umount /media
ここで、Debianのインストーラたちも整理して、 /srv/tftp/debian/7.4/amd64 以下にあるとします。:
/srv/tftp/ | |-debian/7.4/amd64/ | | | |-boot-screens | | | |-initrd.gz | | | |-linux | | | |-pxelinux.0 | | | |-pxelinux.cfg/default | |-centos/6.5/x86_64 | | | |-initrd.img | | | |-vmlinuz | |-pxelinux.0 -(シンボリックリンク)-> debian/7.4/amd64/pxelinux.0 | |-pxelinux.cfg -(シンボリックリンク)-> debian/7.4/amd64/pxelinux.cfg
7. メニューの作成
pxelinux.cfg/defaultの内容を以下のように編集します。 後でもう少し修正します。 最終形はGistにあがっているので、 そちらを見てください。
# D-I config version 2.0
default debian/7.4/amd64/boot-screens/vesamenu.c32
# Boot Menuに入りたい
prompt 1
timeout 300
menu title - Boop Options Menu -
label Debian-7.4
menu label ^0 Debian 7.4
#include debian/7.4/amd64/boot-screens/menu.cfg
kernel debian/7.4/amd64/linux
append priority=critical vga=788 initrd=debian/7.4/amd64/initrd.gz
label CentOS-6.5
menu label ^1 CentOS 6.5
kernel centos/6.5/x86_64/vmlinuz
append initrd=centos/6.5/x86_64/initrd.img
Debianインストールの自動化
ここまでで、PXEブートさえしていれば、複数のOSを選んでインストールできるようになりました。
いまのところの問題点としては、結局インストーラを起動した後は手作業になっていることです。
次は、PXEブートした後、放っておくと勝手にインストールが終わっているようにしましょう。
Debianの場合にこれを実現するには、preseedと呼ばれる設定ファイルを書けば良いです。
普通にインストールするときに色々な質問に答える必要があると思いますが、その答えを事前に書いておくものです。
ただ、preseedが読まれる前に、インストーラから質問される(インストールのタイプなど)ことがあるので、そのあたりはブート時のパラメータとして渡しましょう。
8. preseed ファイル作成
preseedファイルはかなり長いです。
昔はpreseedのドキュメントを読んでも、作るの大変だった印象があったのですが、コメント付きのpreseedの例がある ので、これを元に書いて行けば特に大きくは困らないです。
ただ、例に書かれていないのですが、GRUBの設定を追加しないといけないのはわかりづらいかも知れません。
preseedで細かく設定しようとすると大変なので、それはAnsibleなどインストール終わってからの自動化に入れる方針です。
今回はパーティションなどは全部インストーラに任せています。
パーティションを変える場合などは、コメントアウトされているところを変更してください。
https://gist.github.com/10664868 の preseed.cfgを参照。
9. pxelinux.cfg/default 書き換え
今書いたpreseedファイルを debian/7.4/preseed.cfg として配置したことにします。
ブートオプションなどを追加した pxelinux.cfg/default ファイルは以下のようになります。
あとでどうせCentOSも自動化するので、そちらもあわせてオプションをつけておきます。
https://gist.github.com/10664868 の defaultを参照。
10. Debianインストールのチェック
また実際にPXEブートしてみましょう。
Debianをメニューで選択すると、今度は勝手に画面が進んで行くと思います。
最後までインストールが終わり、勝手にリブートされてこれば、成功です。s
Cent OSインストールの自動化
11. httpサーバー作成
後でやるように、kickstartファイルはhttp経由で配ろうと思います。(TFTPでできないっぽかった)
なので、httpサーバーを予め立てておくことにします。
# apache install
apt-get install apache2
12. CentOSイメージのマウント
mkdir -p /var/www/images/centos
mount -o loop <CentOS install ISO> /var/www/images/centos
13. kickstartファイルの準備
kickstartファイルの詳細については、 redhatのページ が参考になります。というか、コレ見たら大体で書ける。
今回使っているkickstartfileは以下の通りです。
https://gist.github.com/10664868 の kickstart.cfgを参照。
14. kickstartファイルの配置
pxelinux.cfg/defaultファイルの内容に合わせて、kickstart.cfgを配置します。
今回は、apacheのドキュメントルート直下に置けば良いようにしました。
mv kickstart.cfg /var/www/
15. CentOSインストールのチェック
最後に、CentOSのインストールを確かめます。
実際にPXEブートして、CentOSをメニューで選択すると、勝手に画面が進んで行くと思います。
最後までインストールが終わり、勝手にリブートされてこれば、成功です。
もっと自動化できるけど...
今回は、インストールの自動化を行いました。
一応、インストールするOSの種類を選ぶところを手でやることにしましたが、普通はOSは一種類で良いか、MACアドレスでインストールするOSを分けてしまうのだと思います。
そうしておけば、OSの種類を選ぶところも自動化することができます。
自分としては、基本はDebianをインストールしたくて、たまにCentOSも選びたいという程度なので、ここまでで止めておきます。
機会があれば、preseedやkickstartでホスト依存な部分(例えば固定IPとか)を都度生成してインストールする方法も考えたいですね。
さらに読もうと思ってるサイト
- http://d.hatena.ne.jp/fujisan3776/20100630/1277861431
- インストール中は別の作業をしているので、インストールが終わったことも知らせて欲しい