はじめに
virt-install と Kickstart を使って X Window なしで KVM に CentOS をインストールします。
Kickstart 定義ファイル
Kickstart 定義ファイルを作成します。
RHEL や CentOS を普通にインストールすると /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-install で CentOS をインストール
# 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-manager を PuTTy の 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 の直前がオススメです。
kernel ...snip... console=tty0 console=ttyS0,115200 ...snip...
これをやっておかないと通常のコンソールの方にブート時のメッセージなどが表示されません。
Kickstart 定義ファイルの bootloader の --append に書いておけば自動的に追記することもできるのですが、それだと ttyS0 より tty0 の方が後に来てしまってちょっと面倒だからです。
CentOS 6 なら inittab や securetty を修正しなくても grub.conf でカーネルパラメータを指定するだけでシリアルコンソールが使えるようになりますが、console が複数指定されている場合は最後の console がシリアルコンソールでなければダメっぽいからです。
さいごに
まいどまいど virt-manager の GUI でぽちぽちやるのは非常に面倒だったので、これでだいぶカジュアルに KVM に CentOS をインストールできるようになりました!
・・・KVM をカジュアルに使うことはあんまりないですがね・・・