はじめに
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 をカジュアルに使うことはあんまりないですがね・・・