💬

virt-installによってインストールしたUbuntuのカーネルパラメタをインストール時に設定

2022/01/01に公開

virt-installでUbuntuをインストールしたときに、このUbuntuのカーネルパラメタを設定する方法を知ったのでメモを残しておきます。ホストOSもゲストOSもUbuntu 20.04です。

結論

virt-installに--extra-args 'console=ttyS0 --- console=ttyS0'のようなオプションを与えると、"---"の前はインストーラのカーネルパラメタとして使い、"---"の後はインストールされたOSのカーネルパラメタに設定する。

2022/1/1 23時ごろ追記

これはvirt-installではなくインストーラの機能らしい。Ubuntuでは実際にできることを確認して、かつ、Debianでもドキュメント上はできることを確認した。他のdistroについては調べていないので知らない。

貴重な情報を教えてくださったsatoru_satohさん、naoktonさん、ありがとうございました。

https://twitter.com/satoru_satoh/status/1477253441991110662
https://twitter.com/naokton/status/1477254404017434624

これを知った経緯

virt-installは以下のようにするとCUI環境でもtextベースのインストーラを使って仮想マシンにUbuntuをインストールできます。

$ virt-install --name ubuntu2004 --vcpus 1--memory 8192 --os-variant ubuntu20.04 --graphics none --extra-args console=ttyS0 --location http://us.archive.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/

普段LinuxのGUI(仮想マシンのインストールの文脈でいうとvirt-manager)を使わないわたしにとってはこれは非常に便利です。これは--extra-args console=ttyS0オプションによってインストーラのカーネルパラメタを設定して、仮想マシンのコンソール出力をシリアル経由でvirt-installに渡すように設定してあるからです。

しかしインストールが終了して再起動後するとvirsh console ubuntu2004でつなごうとすると以下のメッセージを出した後にログインプロンプトが出てこずに、ピクリともしません。

$ virsh console ubuntu2004
Connected to domain ubuntu2004
Escape character is ^]

これはなぜかというと前述の--extra-argsオプションの引数で渡したパラメタは、あくまでインストーラのカーネルパラメタを変更するものであって、インストールされたカーネルのパラメタは触らないからです。

インストールされたカーネルのパラメタを変更する方法はいくらでもあるんですが、いつもはやっつけで仮想マシンを作りたいときに大げさなことはしたくないので、ip neighコマンドなりでブリッジ(virbr0など)のIPアドレスを探してssh接続してそこからgrubの設定を書き換えて…ということをやっていました。

ところが今日は一念発起してvirt-installだけで完結しないかなあといろいろ検索していたところ、まさに求めていたことが書いてあるサイトを見つけました。

virt-install \
<snip>
    --extra-args 'console=ttyS0,115200n8 --- console=ttyS0,115200n8' \
<snip>
The arguments after the triple dash in the --extra-args option are used when writing the boot loader options. This allows one to see the Linux boot messages on the console on subsequent boots.

で、実際にやってみたらできました。

$ virt-install --name ubuntu2004 --vcpus 1--memory 8192 --os-variant ubuntu20.04 --graphics none --extra-args "console=ttyS0 --- console=ttyS0" --location http://us.archive.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/
...
$ virsh console ubuntu2004
Connected to domain ubuntu2004
Escape character is ^]

ubuntu login:

ログインして"/etc/default/grub"を見ると(当たり前ですが)ちゃんとカーネルパラメタが追加されていました。

$ cat /etc/default/grub
<snip>
GRUB_CMDLINE_LINUX="console=ttyS0"
<snip>

こんな設定方法はマニュアルに書いてなかったのでvirt-install(正確にはvirt-manager)のソースを検索して、こういうことをやっているコードを探してみましたが見つかりませんでした。そもそもgit grep -- ---をしてもコードのどこにもひっかからないし。誰かわかる人がいれば教えてください。

2022/1/1 23時ごろ追記

これはvirt-installではなくインストーラの機能のようです。Ubuntuでは上記の通り、実際にできることを確認して、かつ、Debianでもドキュメント上はできることを確認しました。他のdistroは調べていないので知らないです。

Ubuntu 20.04のドキュメント:
https://help.ubuntu.com/lts/installation-guide/arm64/ch05s03.html
> Be sure to specify this option after “---”, so that it is copied into the bootloader configuration for the installed system (if supported by the installer for the bootloader).

Debian 11.0のドキュメント:
https://www.debian.org/releases/bullseye/amd64/apbs02.en.html#preseed-bootparms
> A “---” in the boot options has special meaning. Kernel parameters that appear after the last “---” may be copied into the bootloader configuration for the installed system (if supported by the installer for the bootloader).

あとこんなことしなくてもvirt-installで同等のことができると知っているかたがいれば、そちらも教えてほしいです。

おわり

Discussion