なんとな~くしあわせ?の日記

JavaとかAWSの設定とかをメモする技術ブログ

PXEネットワークブートでLinuxをインストールする

もういちいちインストールごとにCDにLinuxのイメージ焼きたくないでござる!
じゃあPXEブートやろうぜ

何ができるの?

・CDにLinuxを焼かずにインストールできる
・CD/DVDドライブがないマシンにLinuxがインストールできる

要件

・WANにつながったネットワーク(HUBがあると楽)
・tftpd、dnsmasq、apache2を動かすホストマシン(インストール仕掛ける:192.168.1.2)
・PXEブート対応のBIOSを保持するゲストマシン(インストール対象)
・この事例ではDebian sidを使用して、Fedora20をインストールしている

元にした記事

www.debian-administration.org

手順

tftpd

TFTPはとても単純なファイル転送プロトコルです。それはFTPとよく似ていますが、認証処理がありません。

// パッケージインストール
# apt-get install tftpd-hpa

// 設定ファイル書き換え
$ cat /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
-TFTP_DIRECTORY="/srv/tftp"
+TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
-TFTP_OPTIONS="--secure"
+TFTP_OPTIONS="-l -s /var/lib/tftpboot"

// tftpdの起動
# mkdir -p /var/lib/tftpboot
# systemctl start tftpd-hpa

dnsmasq

DHCPサービスをLANに提供するために dnsmasq を使用している。家庭用ルータが起動していてDHCPを実行していても、特に問題なくターゲットのマシンにIPアドレスを配布できた(なんでだろう?)

// パッケージインストール
# apt-get install dnsmasq

// 一部修正
# vim /etc/dnsmasq.conf
dhcp-boot=pxelinux.0,cowgirl,192.168.1.2
// dnsmasqの起動
# systemctl start dnsmasq

PXEの設定

これでTFTPとDHCPサーバは設定されたので、ブート可能なカーネルのリストを含んだファイルを作成する。

# mkdir -p /var/lib/tftpboot/pxelinux.cfg

DVDのマウント

DVDマウント
Fedora20のDVDイメージファイルをマウントします。イメージファイルを適当なところに置き、/var/www/html/fedora20 にマウント先を作成後、マウントする。これを行わないと、dracutの実行が終わらず、インストールできない。HTTPで接続して、isoの中身が見えていれば成功です。ここではサーバが192.168.1.2のIPアドレスを持つものとします。

# cd  /var/lib/tftpboot/fedora/heisenbug/x86_64/linux/
# wget http://ftp.jaist.ac.jp/pub/Linux/Fedora/releases/20/Fedora/x86_64/iso/Fedora-20-x86_64-DVD.iso
# mkdir /var/www/html/fedora20
# mount -t iso9660 -o loop /var/lib/tftpboot/fedora/heisenbug/x86_64/linux/Fedora-20-x86_64-DVD.iso /var/www/html/fedora20
// apache2の起動
# systemctl start apache2

次に、以下を /var/lib/tftpboot/pxelinux.cfg/default として保存する

DISPLAY boot.txt

DEFAULT heisenbug_x86_64_install

LABEL heisenbug_x86_64_install
        kernel fedora/heisenbug/x86_64/linux/vmlinuz
        append vga=normal initrd=fedora/heisenbug/x86_64/linux/initrd.img inst.repo=http://192.168.1.2/fedora20/ --

LABEL heisenbug_x86_64_linux
        kernel fedora/heisenbug/x86_64/linux/vmlinuz
        append vga=normal initrd=fedora/heisenbug/x86_64/linux/initrd.img inst.repo=http://192.168.1.2/fedora20/ --

LABEL heisenbug_x86_64_expert
        kernel fedora/heisenbug/x86_64/linux/vmlinuz
        append priority=low vga=normal initrd=fedora/heisenbug/x86_64/linux/initrd.img inst.repo=http://192.168.1.2/fedora20/ --

LABEL heisenbug_x86_64_rescue
        kernel fedora/heisenbug/x86_64/linux/vmlinuz
        append vga=normal initrd=fedora/heisenbug/x86_64/linux/initrd.img rescue/enable=true inst.repo=http://192.168.1.2/fedora20/ --

PROMPT 1
TIMEOUT 0

boot.txtはクライアント側のPCにファイルの内容を表示させるように指示する

# cat /var/lib/tftpboot/boot.txt
- Boot Menu -
=============

heisenbug_x86_64_install
heisenbug_x86_64_linux
heisenbug_x86_64_expert
heisenbug_x86_64_rescue

カーネルインストーラと関連するファイルをダウンロードし、作成した"default"のディレクトリにそれを保存する。

# cd /var/lib/tftpboot/
# wget http://ftp.jaist.ac.jp/pub/Linux/Fedora/releases/20/Fedora/x86_64/os/Packages/s/syslinux-4.05-7.fc20.x86_64.rpm
# rpm2cpio syslinux-4.05-7.fc20.x86_64.rpm | cpio -id

// pxelinux.0, vesamenu.c32を取り出してコピー
# cp {pxelinux.0, vesamenu.c32} /var/lib/tftpboot/

# mkdir -p /var/lib/tftpboot/fedora/heisenbug/x86_64
# cd /var/lib/tftpboot/fedora/heisenbug/x86_64
# wget http://ftp.jaist.ac.jp/pub/Linux/Fedora/releases/20/Fedora/x86_64/os/images/pxeboot/initrd.img
# wget http://ftp.jaist.ac.jp/pub/Linux/Fedora/releases/20/Fedora/x86_64/os/images/pxeboot/vmlinuz
構成
cowgirl:/var/lib/tftpboot# pwd
/var/lib/tftpboot
cowgirl:/var/lib/tftpboot# tree
.
├── boot.txt
├── fedora
│   └── heisenbug
│       └── x86_64
│           └── linux
│               ├── Fedora-20-x86_64-DVD.iso
│               ├── initrd.img
│               └── vmlinuz
├── pxelinux.0
├── pxelinux.cfg
│   ├── default
│   └── default~
└── vesamenu.c32

5 directories, 8 files
実行

ターゲットのマシン起動中にF11とか押してBIOSに入る。
→ PXEブートを実行するメニューがあるので実行。
→ うまく行くと以下のような画面へ
f:id:panzer-jagdironscrap1:20150421234015j:plain

感想

クラウドのが楽
・ひょっとすると実務で役立つかもしれない