それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

kvm/qemuでCDROM内のカーネルを直接起動する。

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