kvm/qemu でCDROM内のカーネルを起動する
カーネルにオプションを渡して起動したい。シリアルコンソールで画面を出したい。と思った。virt-manager でどうやるのか、virt-install 起動時にどうするか、迷ったのでメモを残す。
virt-manager の画面での指定。
次のように、カーネルのファイルを指定する。
これで起動ができる。起動だけなので、インストールはCD-ROMを差し込む必要がある。
マウントの例
CD-ROMをマウントして
mkdir mnt sudo mount -t iso9660 -o loop,ro debian-11.2.0-amd64-netinst.iso mnt
フルパスを取得する
realpath mnt/install.amd/vmlinuz realpath mnt/install.amd/initrd.gz
これで準備ができた。
指定した引数。
- カーネル
/var/lib/libvirt/images/mnt/install.amd/vmlinuz
- init
/var/lib/libvirt/images/mnt/install.amd/initrd.gz
- 引数
console=tty0 console=ttyS0,115200n8
フルパスをvirt-manager で指定する。
準備ができたので、それを仮想マシンに指定する。
これで、問題なく起動できる。
インストールするときは、CD-ROMも渡す
インストール時には、インストールデータを取得するが、カーネルをCD-ROM内部を使っているので、インストールデータもCD-ROMから取ってきたほうが無難
ということで、CD-ROMも仮想マシンに接続する。
これで、無事にインストールが始まる。
全部コマンドラインでやるには
上記の手順を、すべてコマンドから行い、インストールもコマンドから行うには次のように、virt-install を使う。ディスクにCD-ROMもしていする。カーネルもinitrdも指定する。
コマンドの例
mkdir mnt sudo mount -t iso9660 -o loop,ro debian-11.2.0-amd64-netinst.iso mnt kernel=$( realpath mnt/install.amd/vmlinuz ) initrd=$( realpath mnt/install.amd/initrd.gz ) kernel_args="console=tty0 console=ttyS0,115200n8" virt-install \ --connect=qemu:///system \ --name d05 \ --ram 8192 \ --vcpus 8 \ --disk path=/var/lib/libvirt/images/d05.qcow2 \ --disk /var/lib/libvirt//images/debian-11.2.0-amd64-netinst.iso,device=cdrom,bus=ide --virt-type kvm \ --os-type linux \ --os-variant debian10 \ --graphics none \ --install \ kernel=${kernel},initrd=${initrd},kernel_args_overwrite=yes,kernel_args="${kernel_args}"
シリアルコンソールを指定しているので、このままインストールがSSH経由のコマンドラインで開始する。preseedや cloud-initを使って無人インストールも可能だ。
ネットワークから取得する場合
ネットワークからインストーラーを取得する場合なら、location だけで行ける
location でネットワークからインストーラーを取得すればいい。
virt-install \ --connect=qemu:///system \ --graphics none \ --location http://ftp.kddilabs.jp/pub/Linux/distributions/Debian/debian/dists/buster/main/installer-amd64/ \ --disk path=/var/lib/libvirt/images/d01.qcow2 \ --extra-args="console=ttyS0" --ram 4096 \ --vcpus 8 \ --virt-type kvm \ --os-type linux \ --os-variant debian10 \ --name d05 \
CD-ROMの場合に比べてずいぶんシンプルですね。CD-ROMのほうがコピーで済むので早い気もするが、マウントなどが不要なので、確実なのはネットワークから取得したほうがいい気もする。
カーネルを直接起動する理由
なぜこんなことをしているかというと、シリアルコンソール(ttyS0)を使いたいから。
グラフィック起動でインストールするとコピペが面倒なのです。
まとめ
次の引数いれて、カーネル直接起動ができる。
- カーネル
/var/lib/libvirt/images/mnt/install.amd/vmlinuz
- init
/var/lib/libvirt/images/mnt/install.amd/initrd.gz
- 引数
console=tty0 console=ttyS0,115200n8
vmlinuz / initrd.gz は、CD-ROMをマウントすれば取れる。
マウントは、is9600を使う。
sudo mount -t iso9660 -o loop,ro debian-11.2.0-amd64-netinst.iso mnt