virt-install と Kickstart で KVM に CentOS をインストールする

はじめに

virt-install と Kickstart を使って X Window なしで KVMCentOS をインストールします。

Kickstart 定義ファイル

Kickstart 定義ファイルを作成します。

RHELCentOS を普通にインストールすると /root/anaconda-ks.cfg に Kickstart 定義ファイルが作成されるので、そのファイルを参考に作成します。

ks.cfg

cmdline
install
lang en_US.UTF-8
keyboard jp106

network --device eth0 --onboot yes --bootproto dhcp --noipv6 --hostname hoge

zerombr
bootloader --location=mbr --append="crashkernel=auto rhgb quiet"

clearpart --all --initlabel
part / --fstype=ext4 --grow --asprimary --size=1

rootpw --plaintext password
authconfig --enableshadow --passalgo=sha512
selinux --disabled
firewall --disabled
firstboot --disabled
timezone --utc Asia/Tokyo
reboot

%packages
@core
@base
@japanese-support
%end

この定義ファイルだと概ね次のようにインストールされます。詳しい説明は省略です。

  • シリアルコンソールにインストーラーのメッセージを流すために cmdline を指定
  • ディスクはすべてルートパーティションに割り当て(swap なし)
  • root のパスワードは "password"
    • インストール後に変更!!!
  • I/F は DHCP
    • 固定IPが必要ならインストール後に変更する
  • selinux や iptables は無効
    • 必要ならインストール後に設定する
  • パッケージは Minimum に Base と日本語サポートだけ追加
    • 必要なものはインストール後に追加する

virt-installCentOS をインストール

# virt-install \
    --name hoge \
    --hvm \
    --virt-type kvm \
    --ram 1024 \
    --vcpus 1 \
    --arch x86_64 \
    --machine rhel6.4.0 \
    --os-type linux \
    --os-variant rhel6 \
    --boot hd \
    --disk path=/dev/vg0/vm.hoge \
    --network bridge=br0 \
    --graphics vnc \
    --serial pty \
    --console pty \
    --location http://ftp.riken.jp/Linux/centos/6.4/os/x86_64/ \
    --initrd-inject ks.cfg \
    --extra-args "ks=file:/ks.cfg console=ttyS0,115200" \
    --noautoconsole

# virsh console hoge

ざっくり要点だけを説明すると・・・、

--location http://ftp.riken.jp/Linux/centos/6.4/os/x86_64/
インストールのソースに ftp.riken.jp を使います(リポジトリのミラーがどこかにあるならその方が良いです)。

--initrd-inject ks.cfg
インストーラーの initrd に ks.cfg を突っ込みます。

--extra-args "ks=file:/ks.cfg console=ttyS0,115200"
インストーラーのブートパラメータに Kickstart 定義ファイルを指定します、さらにシリアルコンソールにメッセージを流すために console も指定します。

--noautoconsole
自動的に virt-viewer が起動しないようにします。KVM ホストに X サーバは入れていないしそもそも virt-viewer 自体入れてません。

virsh console hoge
ゲストのシリアルコンソールに接続します(インストーラーのメッセージが表示されます)。

--graphics vnc--graphics none に変えれば virt-viewer の代わりに自動的にゲストのシリアルコンソールに繋がるのですが、いざと言う時のために通常のコンソールは残しておきたいのでこのようにしています(Windows で Xming を起動して virt-managerPuTTy の X forwarding で転送できるようにするため)。

インストール後にスクリプトを実行

Kickstart は %pre や %post でインストール前後にスクリプトを実行することができるので、頑張ればちょっとしたプロビジョニングもできなくはないです。

例えばこんな感じで言語設定をインストール後に日本語に変更することもできます(はじめから日本語にしておけばいいだけですが)。

...snip...

%packages
@core
@base
@japanese-support
%end

%post --log=/root/ks-post.log
set -vx
sed -e '/LANG/cLANG="ja_JP.UTF-8"' -i.orig /etc/sysconfig/i18n
%end

最小のパッケージでインストール

Kickstart をテスト的に試す場合は %packages を次のようにしておくと最小のパッケージしかインストールされません。

%packages --nobase
%end

@core と @base は %packages に記述しなくてもデフォルトで選択されます。--nobase を指定することで @base は除外することが出来ます。

インストール後のカーネルパラメータの調整

インストール後に grub.conf の kernel の行に console=tty0 を追記しておきます。追加する位置は console=ttyS0,115200 の直前がオススメです。

/boot/grub/grub.conf

kernel ...snip... console=tty0 console=ttyS0,115200 ...snip...

これをやっておかないと通常のコンソールの方にブート時のメッセージなどが表示されません。

Kickstart 定義ファイルの bootloader の --append に書いておけば自動的に追記することもできるのですが、それだと ttyS0 より tty0 の方が後に来てしまってちょっと面倒だからです。

CentOS 6 なら inittab や securetty を修正しなくても grub.conf でカーネルパラメータを指定するだけでシリアルコンソールが使えるようになりますが、console が複数指定されている場合は最後の console がシリアルコンソールでなければダメっぽいからです。

さいごに

まいどまいど virt-managerGUI でぽちぽちやるのは非常に面倒だったので、これでだいぶカジュアルに KVMCentOS をインストールできるようになりました!

・・・KVM をカジュアルに使うことはあんまりないですがね・・・