🍗

Ubuntu 22.04 のカーネルをダウングレードする

2024/03/24に公開

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
GitHubで編集を提案

Discussion