Ubuntu 22.04 のカーネルをダウングレードする
Azureの仮想マシンでカーネルをダウングレードしてみた。
試してみる契機となったのは、Azure Site Recovery で Mobility Service が対応するカーネルバージョンに制限があるため。
対応するカーネルバージョンではないと、インストールに失敗してディザスタリカバリ設定ができない。
実施環境
ARMテンプレートで下記でVMを立てた環境でテストした。
"imageReference": {
"publisher": "canonical",
"offer": "0001-com-ubuntu-server-jammy",
"sku": "22_04-lts-gen2",
"version": "latest"
},
起動したVMに入ると、下記のような状態だった。
$ uname -a
Linux test-vm 6.5.0-1016-azure #16~22.04.1-Ubuntu SMP Fri Feb 16 15:42:02 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
$ dpkg -l | grep linux-image
ii linux-image-6.5.0-1016-azure 6.5.0-1016.16~22.04.1 amd64 Signed kernel image azure
ii linux-image-azure 6.5.0.1016.16~22.04.1 amd64 Linux kernel image for Azure systems (vmlinuz).
このテスト実施時点で、サイトリカバリを設定すると、利用されるモビリティサービスのバージョンは9.60 となり、これは Ubuntu 22.04 LTS の 6.5.0-1016-azure に対応しておらず、エラーとなった。
カーネルパッケージインストール
インストール可能なバージョンを調べる
$ sudo apt search linux-azure | grep linux-image-6.5.0
このテスト実施時点で、モビリティサービス9.60 で対応する最新カーネルは Ubuntu 22.04 LTSでは 6.5.0-1011-azure だったので、linux-image-6.5.0-1011-azure をインストールすることにする。
$ sudo apt install linux-image-6.5.0-1011-azure
インストール後の状態を確認する。
$ dpkg -l | grep linux-image
ii linux-image-6.5.0-1011-azure 6.5.0-1011.11~22.04.1 amd64 Signed kernel image azure
ii linux-image-6.5.0-1016-azure 6.5.0-1016.16~22.04.1 amd64 Signed kernel image azure
ii linux-image-azure 6.5.0.1016.16~22.04.1 amd64 Linux kernel image for Azure systems (vmlinuz).
ブートローダの設定変更
物理マシンだと、ブートローダ起動時にメニューから選択して、起動するカーネルを選択することができる。
IaaSの仮想マシンでもできるかもしれないが、ここでは、デフォルトで起動するカーネルを変更することにする。
$ sudo grep menuentry /boot/grub/grub.cfg
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
menuentry_id_option=""
export menuentry_id_option
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-148b82c8-e8e4-4b41-b1ec-36a2eb471071' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-148b82c8-e8e4-4b41-b1ec-36a2eb471071' {
menuentry 'Ubuntu, with Linux 6.5.0-1016-azure' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.5.0-1016-azure-advanced-148b82c8-e8e4-4b41-b1ec-36a2eb471071' {
menuentry 'Ubuntu, with Linux 6.5.0-1016-azure (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.5.0-1016-azure-recovery-148b82c8-e8e4-4b41-b1ec-36a2eb471071' {
menuentry 'Ubuntu, with Linux 6.5.0-1011-azure' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.5.0-1011-azure-advanced-148b82c8-e8e4-4b41-b1ec-36a2eb471071' {
menuentry 'Ubuntu, with Linux 6.5.0-1011-azure (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.5.0-1011-azure-recovery-148b82c8-e8e4-4b41-b1ec-36a2eb471071' {
menuentry 'UEFI Firmware Settings' $menuentry_id_option 'uefi-firmware' {
$ sudo cp -pi /etc/default/grub ~
$ diff -u /etc/default/grub ~/grub
--- /etc/default/grub 2024-03-19 21:17:11.180950485 +0000
+++ /home/infrauser/grub 2024-03-08 02:14:01.108612555 +0000
@@ -3,7 +3,7 @@
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'
-GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 6.5.0-1011-azure"
+GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
反映するため update-grub を実行する。
$ sudo update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/40-force-partuuid.cfg'
Sourcing file `/etc/default/grub.d/50-cloudimg-settings.cfg'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
GRUB_FORCE_PARTUUID is set, will attempt initrdless boot
:
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
done
再起動と確認
カーネルパッケージインストールと、ブートローダの設定変更を実施したら、再起動する。
$ sudo shutdown -r now
再起動したら、カーネルバージョンが変更されたことを確認する。
$ uname -a
Linux test-vm 6.5.0-1011-azure #11~22.04.1-Ubuntu SMP Mon Jan 15 16:59:12 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
不要パッケージ削除
不要なカーネルパッケージを削除する。
このとき、linux-image-azureパッケージも一緒に削除された。dummy transitional packageと思われるので、動作に影響はないだろうが、気持ち悪ければ調べたほうがいい。
$ sudo apt remove linux-image-6.5.0-1016-azure
その他不要な関連パッケージも削除する
$ sudo apt autoremove
結果を確認する
$ dpkg -l | grep 6.5.0-1011
ii linux-image-6.5.0-1011-azure 6.5.0-1011.11~22.04.1 amd64 Signed kernel image azure
ii linux-modules-6.5.0-1011-azure 6.5.0-1011.11~22.04.1 amd64 Linux kernel extra modules for version 6.5.0 on 64 bit x86 SMP
バージョンの固定
今後 apt upgrade 実行時に勝手にカーネルバージョンが上がることのないように、バージョンを固定する。
(なお、Azureのモビリティサービスでは、こまめにアップデートされて、対応カーネルについての情報も更新されているようだ。本記事記載時点では 6.5.0-1015-azure まで対応していた。)
$ sudo apt-mark hold linux-image-6.5.0-1011-azure linux-modules-6.5.0-1011-azure
linux-image-6.5.0-1011-azure set on hold.
linux-modules-6.5.0-1011-azure set on hold.
$ dpkg --get-selections | grep hold
linux-image-6.5.0-1011-azure hold
linux-modules-6.5.0-1011-azure hold
$ dpkg -l | grep linux-image
hi linux-image-6.5.0-1011-azure 6.5.0-1011.11~22.04.1 amd64 Signed kernel image azure
rc linux-image-6.5.0-1016-azure 6.5.0-1016.16~22.04.1 amd64 Signed kernel image azure
Discussion