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のインストーラを準備

  1. mkdir -p /srv/tftp/centos/6.5/x86_64
  2. CentOSのインストールDVDを持って来る
  3. mount -o loop <CentOS install ISO> /media
  4. /media/images/pxeboot/にある次の2つのファイルを/srv/tftp/centos/6.5/x86_64/以下にコピーしてくる
    • initrd.img
    • vmlinuz
  5. 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とか)を都度生成してインストールする方法も考えたいですね。

さらに読もうと思ってるサイト