2014年2月14日金曜日

KVM virt-install でネットワーク環境が全く無い場合でも DVD イメージから Preseed で自動インストール

はじめに

KVM サーバーを構築して、ゲストマシンとして動作確認用の Ubuntu を何度もインストールするようになりました。

毎回ゲスト Ubuntu をインストールするのが大変なので、Preseed を使って自動化するんですが、「 KVM virt-install でディストリビューションツリーを指定した時に Preseed で自動設定 」 だとどうしてもネットワーク環境が必要なようです。

ネットワーク環境がなくても Preseed を使い、更に DVD メディアから全てをインストールする方法を調べてみました。インストール画面の表示も VNC コンソールではなく、virt-install を実行するターミナルに表示するようにします。

Preseed の設定ファイルをあらかじめ用意した TFTP サーバーに置く方法もあるようですが、なんとなく TFTP サーバーとか構築したくないですし、そもそもネットワーク環境が無い場合を想定しているので aufs を利用して Ubuntu インストール用 ISO イメージの中に擬似的に設定ファイルを埋め込むような方法でやってみます。

KVM サーバー環境

先日ブログに投稿した「 Kvm インストール 」でインストールした KVM です。

KVM サーバーの Ubuntu のバージョンは 12.04.3 Server です。

ISO イメージをループバックマウント

ゲスト Ubuntu も 12.04.3 Server にします。

Ubuntu のサイトから ubuntu-12.04.3-server-amd64.iso をダウンロード

マウントポイントを作成して、ダウンロードした ISO イメージをループバックマウント

$ mkdir Iso
$ sudo mount --read-only --options loop ubuntu-12.04.3-server-amd64.iso Iso/

ISO イメージの内容を擬似的に上書きするためのディレクトリ、ファイル準備

ディレクトリ作成

$ mkdir -p ForOverwrite/{isolinux,preseed}

以下の内容で ForOverwrite/isolinux/isolinux.cfg 設置

default install
label install
    kernel /install/vmlinuz
    append auto=true file=/cdrom/preseed/Custom.seed initrd=/install/initrd.gz quiet console=ttyS0 --

以下の内容で ForOverwrite/preseed/Custom.seed 設置

d-i netcfg/get_hostname                 string      TestMachine
d-i user-setup/encrypt-home             boolean     false

d-i passwd/user-fullname                string      testuser
d-i passwd/username                     string      testuser

# ここにパスワードを書き込むとファイルとしてパスワードが残ってしまうので
# 以下をコメントアウトし、パスワードをコンソールから入力した方が良いです。
d-i passwd/user-password                password    testpasswd
d-i passwd/user-password-again          password    testpasswd

d-i debian-installer/language           string      en
d-i debian-installer/country            string      JP
d-i localechooser/preferred-locale      select      en_US.UTF-8
d-i time/zone                           string      Asia/Tokyo

d-i netcfg/disable_autoconfig           boolean     true
d-i netcfg/get_ipaddress                string      192.168.122.100
d-i netcfg/get_netmask                  string      255.255.255.0
d-i netcfg/get_gateway                  string      192.168.122.1
d-i netcfg/get_nameservers              string      192.168.122.1
d-i netcfg/get_domain                   string

#d-i mirror/country                     string      Japan
#d-i mirror/http/mirror                 string      jp.archive.ubuntu.com

# ssh コンソールでのインストール
#d-i anna/choose_modules                string      network-console
#d-i network-console/password           password    HogeHoge
#d-i network-console/password-again     password    HogeHoge

#d-i console-setup/ask_detect           boolean     true
#d-i console-setup/layoutcode           string      jp
#d-i console-setup/charmap              select      UTF-8

d-i partman-auto/method                 string      lvm
d-i partman-lvm/confirm_nooverwrite     boolean     true
d-i partman-auto-lvm/guided_size        string      max
d-i partman/choose_partition            select      finish
d-i partman/confirm_nooverwrite         boolean     true

d-i mirror/http/proxy                   string
d-i pkgsel/update-policy                select      none
d-i pkgsel/install-language-support     boolean     false
d-i tasksel/first                       multiselect OpenSSH server

d-i grub-installer/only_debian          boolean     true
d-i clock-setup/utc                     boolean     true

d-i finish-install/reboot_in_progress   note

ゲスト Ubuntu インストール用 DVD イメージ作成

まず、現段階で ForOverwrite/、Iso/ はそれぞれ以下のようなファイル配置になってます。

ForOverwrite/
├── isolinux/
│   └── isolinux.cfg
└── preseed/
    └── Custom.seed

Iso/
├── ...
├── isolinux/
│   ├── ...
│   ├── isolinux.cfg
│   └── ...
├── preseed/
│   ├── cli.seed
│   ├── cloud.seed
│   ├── ubuntu-server-minimal.seed
│   ├── ubuntu-server-minimalvm.seed
│   └── ubuntu-server.seed
└── ...
この状態でこの2つのディレクトリを aufs で Custom/ へひとつにまとめます。
$ mkdir Custom
$ sudo mount -t aufs -o br:ForOverwrite/:Iso/ aufs Custom/

Custom/ のファイル配置はこのようになります。

Custom/
├── ...
├── isolinux/
│   ├── ...
│   ├── isolinux.cfg
│   └── ...
├── preseed/
│   ├── cli.seed
│   ├── cloud.seed
│   ├── Custom.seed
│   ├── ubuntu-server-minimal.seed
│   ├── ubuntu-server-minimalvm.seed
│   └── ubuntu-server.seed
└── ...

isolinux/isolinux.cfg は ForOverwrite/ と Iso/ のどちらにもあるので、Custom/isolinux/isolinux.cfg は mount -t aufs の引数で先に指定した ForOverwrite/isolinux/isolinux.cfg の内容となります。

最終的に、Custom/ は Iso/ の内容 (ubuntu-12.04.3-server-amd64.iso の内容) を ForOverwrite/ の内容で上書きした状態になっています。

ゲスト Ubuntu インストール用 DVD イメージ作成

$ sudo mkisofs \
-r \
-V 'Custom Ubuntu Install CD' \
-cache-inodes \
-J \
-l \
-b isolinux/isolinux.bin \
-c isolinux/boot.cat \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
-input-charset utf-8 \
-o Custom_ubuntu-12.04.3-server-amd64.iso \
Custom/

Custom/, Iso/ は不要になったのでマウントを解除

$ sudo umount Custom/
$ sudo umount Iso/

ゲスト Ubuntu インストール

インストールディスクイメージ作成

$ sudo qemu-img create -f qcow2 /var/lib/libvirt/images/TestMachine.qcow2 30G
ゲスト Ubuntu インストール
$ sudo virt-install \
--name TestMachine \
--ram 2048 \
--vcpus 1 \
--os-variant ubuntuprecise \
--hvm \
--virt-type kvm \
--disk /var/lib/libvirt/images/TestMachine.qcow2,format=qcow2 \
--cdrom Custom_ubuntu-12.04.3-server-amd64.iso \
--network bridge:virbr0 \
--serial pty \
--keymap ja

数秒待つとインストール画面が表示されます

インストールが終了すると最後にゲストマシンの再起動がかかり、インストールした OS で起動します。 コンソールにはゲスト OS のログインプロンプトが出てくるので ‘Ctrl + ]’ でコンソールを切断します。

再度コンソールに接続する場合
$ sudo virsh console TestMachine

コンソールから切断する場合は同様に ‘Ctrl + ]’ です。


0 件のコメント:

コメントを投稿