maehachi08 Anything Blog

2012年04月05日
キックスタートによるOS自動インストール環境の構築

キックスタートとは

「じゃあ20台のサーバにLinux入れといて。」などと頼まれた場合、あなたはどうするで しょうか。
1台ずつインストールメディアを入れて、anacondaブートローダーを起動して設定書を目 で追いながらいつミスするかもしれない恐怖に怯えて構築していくのでしょうか。
キックスタートによる自動インストールを実現するとそんな手間も低減できます。
キックスタートサーバはDHCPサーバ、TFTPサーバ、HTTPサーバといった複数のサーバを組み合わせてOSインストール自動化を実現する仕組みのことを指します。そしてOSインストールを自動化したいマシン側ではPXEブートに対応したNICが必要です。
PXEブートとは、ネットワークカードに搭載されているPXE(Preboot eXecution Environment)機能を利用してプログラムを起動するブート方法でネットワークブートに利用され ます。

ここで、キックスタートでOSを自動インストールする仕組みを簡単に説明します。
ここではOSインストールマシンをクライアントと記載します。

1. クライアントがPXEブートすると、
   まずブロードキャストパケットを送信し、
   DHCPサーバにIPアドレスをリクエストします。

2. DHCPサーバはIPアドレスとnext-serverパラメータとfilenameパラメータを渡します。
   next-serverパラメータはTFTPサーバのIPアドレスを設定しておきます。
   filenameにはブートストラップイメージファイル名を設定しておきます。
   # ここでいうブートストラップイメージは通常起動時のMBRレコードにあたります。

3. クライアントはTFTPサーバにブートストラップイメージと
   初期RAMディスクを要求し、取得します。
   # お分かりのように、TFTPサーバには事前に上記ファイルを用意しておきます。

4. クライアントは取得したブートストラップイメージをメモリに読み込み、
   初期RAMディスクを解凍し、最小限のデバイスドライバを組み込みます。

5. クライアントはHTTPを利用してksファイルを取得します。

6. ksファイルに記載されているOSインストールに必要な
   パッケージをHTTPで取得してインストールします。

7. クライアントが再起動します。

上記の流れはpxelinux.0やdefaultファイルの流れを割愛しているので
正確ではありませんが、大きな流れを記載しました。

キックスタートサーバ構築

ここでは自宅サーバ(HP ML110G6)にKVMモジュールで仮想環境を構築しているホストマシ ンをキックスタートサーバとして構築します。

1. キックスタートサーバに必要なパッケージインストール

$ sudo yum install -y dhcp tftp-server httpd syslinux system-config-kickstart

2. OSインストールに必要なパッケージをメディアからコピー

$ sudo mkdir /mnt/cdrom
$ sudo mount -r -t iso9660 /dev/cdrom /mnt/cdrom
$ sudo cd /mnt/cdrom/
$ sudo mkdir /var/www/html/CENTOS62-x86_64
$ sudo cp -af /mnt/cdrom/* /var/www/html/CENTOS62-x86_64/
$ sudo cd ../
$ sudo umount /dev/cdrom

3. DHCPサーバ設定

$ vi /etc/dhcp/dhcpd.conf
ddns-update-style ad-hoc;
subnet 192.168.100.0 netmask 255.255.255.0 {
range 192.168.100.150 192.168.100.199;
next-server 192.168.100.200;
filename "pxelinux.0";
}

4. TFTPサーバ設定

$ sudo cp -p /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
$ sudo mkdir /var/lib/tftpboot/CENTOS62-x86_64
$ sudo cp /var/www/html/CENTOS62-x86_64/images/pxeboot/vmlinuz /var/lib/tftpboot/CENTOS62-x86_64
$ sudo cp /var/www/html/CENTOS62-x86_64/images/pxeboot/initrd.img /var/lib/tftpboot/CENTOS62-x86_64

5. ブートメッセージ作成

$ sudo vim /var/lib/tftpboot/boot.msg
===============================

Welcome to kickstart installer

===============================

1. CentOS 6.2 (x86_64) - CLI
2. CentOS 6.2 (x86_64) - GUI

6. オプション設定ファイル作成

$ sudo mkdir /var/lib/tftpboot/pxelinux.cfg
$ sudo vim /var/lib/tftpboot/pxelinux.cfg/default
prompt 1
display boot.msg

label 1
kernel /CENTOS62-x86_64/vmlinuz
append initrd=/CENTOS62-x86_64/initrd.img ks=http://192.168.100.200/ks/Basci_Server_CLI.cfg

label 2
kernel /CENTOS62-x86_64/vmlinuz
append initrd=/CENTOS62-x86_64/initrd.img ks=http://192.168.100.200/ks/Basci_Server_GUI.cfg

7. サービス起動設定

$ sudo chkconfig dhcpd on
$ sudo service dhcpd start
dhcpd を起動中: [ OK ]

$ sudo chkconfig httpd on
$ sudo service httpd start
httpd を起動中: httpd: apr_sockaddr_info_get() failed for pachi
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[ OK ]

$ sudo chkconfig xinetd on
$ sudo chkconfig tftp on
$ sudo service xinetd start
xinetd を起動中: [ OK ]

8. キックスタートファイル作成

  • キックスタートファイル作成ツール「system-config-kickstart」で作成しました。
# mkdir /var/www/html/ks

~ ksファイル作成 ~
# ls -l
合計 8
-rw-r--r-- 1 root root 1199  2月 28 11:55 2012 Basci_Server_CLI.cfg
-rw-r--r-- 1 root root 1258  2月 24 14:31 2012 Basci_Server_GUI.cfg

# cat Basci_Server_CLI.cfg
#platform=x86, AMD64, 又は Intel EM64T
#version=DEVEL
# Firewall configuration
firewall --disabled
# Install OS instead of upgrade
install
# Use network installation
url --url="http://192.168.100.200/CENTOS62-x86_64"
# Root password
rootpw --iscrypted $1$lLH/ND67$BWMCk18R3D4PylOQHJkzu0
# System authorization information
auth  --useshadow  --passalgo=sha512
# Use graphical install
graphical
firstboot --disable
# System keyboard
keyboard jp106
# System language
lang ja_JP
# SELinux configuration
selinux --disabled
# Installation logging level
logging --level=info
# Reboot after installation
reboot
# System timezone
timezone  Asia/Tokyo
# System bootloader configuration
bootloader --location=mbr
# Partition clearing information
clearpart --all
# Disk partitioning information
part /boot --asprimary --fstype="ext4" --size=100
part swap --fstype="swap" --size=1024
part / --asprimary --fstype="ext4" --grow --size=1

%packages
@additional-devel
@base
@client-mgmt-tools
@console-internet
@debugging
@development
@directory-client
@ftp-server
@hardware-monitoring
@japanese-support
@java-platform
@large-systems
@network-file-system-client
@performance
@perl-runtime
@server-platform

%end

# cat Basci_Server_GUI.cfg
#platform=x86, AMD64, 又は Intel EM64T
#version=DEVEL
# Firewall configuration
firewall --disabled
# Install OS instead of upgrade
install
# Use network installation
url --url="http://192.168.200.1/CENTOS62-x86_64"
# Root password
rootpw --iscrypted $1$0JbUuPdl$aVW6/ZjQWIGKxH/R7uLSk0
# System authorization information
auth  --useshadow  --passalgo=sha512
# Use graphical install
graphical
firstboot --disable
# System keyboard
keyboard jp106
# System language
lang ja_JP
# SELinux configuration
selinux --disabled
# Installation logging level
logging --level=info
# Reboot after installation
reboot
# System timezone
timezone  Asia/Tokyo
# System bootloader configuration
bootloader --location=mbr
# Partition clearing information
clearpart --all
# Disk partitioning information
part /boot --asprimary --fstype="ext4" --size=100
part swap --fstype="swap" --size=1024
part / --asprimary --fstype="ext4" --grow --size=1

%packages
@additional-devel
@base
@basic-desktop
@client-mgmt-tools
@console-internet
@debugging
@development
@directory-client
@ftp-server
@graphical-admin-tools
@hardware-monitoring
@internet-browser
@japanese-support
@java-platform
@large-systems
@network-file-system-client
@performance
@perl-runtime
@server-platform
@x11

%end

ここまで出来たら、PXEブート可能なマシンをブートしてみてください。
POSTが終わってRAIDイニシャライズなども終わればDHCPサーチしたタイミングでCentOS6.2のブート画面が表示されるはずです。