「Always Free」ということでありがたく愛用している次のOCI (Oracle Cloud Infrastructure) インスタンスのKernelを、本日 (2022-06-08) 現在最新の 5.13.0-1033-oracle へ更新した後、システムが安定せず、Linux起動後にKernel panicが発生するようになってしまった。
項目 | 内容 |
---|---|
インスタンス | OCI (Oracle Cloud Infrastructure) VM.Standard.E2.1.Micro |
OS | Ubuntu 20.04.4 LTS (Focal Fossa) |
問題が発生したKernel | linux-image-5.13.0-1033-oracle 5.13.0-1033.39~20.04.1 amd64 |
問題が発生しないKernel | linux-image-5.13.0-1030-oracle 5.13.0-1030.35~20.04.1 amd64 (一つ前の版) |
[ 47.372548] kernel BUG at include/linux/fs.h:3104!
[ 47.376841] invalid opcode: 0000 [#1] SMP NOPTI
[ 47.377884] CPU: 0 PID: 1860 Comm: miniflux Not tainted 5.13.0-1033-oracle #39~20.04.1-Ubuntu
[ 47.380564] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 0.0.0 02/06/2015
[ 47.382589] RIP: 0010:__fput+0x247/0x250
[ 47.383469] Code: 00 48 85 ff 0f 84 8b fe ff ff f6 c7 40 0f 85 82 fe ff ff e8 ab 38 00 00 e9 78 fe ff ff 4c 89 f7 e8 2e 88 02 00 e9 b5 fe ff ff <0f> 0b 0f 1f 80 00 00 00 00 0f 1f 44 00 00 55 48 89 e5 53 31 db 48
[ 47.393212] RSP: 0018:ffffa3bf82353bd0 EFLAGS: 00010246
[ 47.394525] RAX: 0000000000000000 RBX: 00000000000a801d RCX: ffff95323d1b4800
[ 47.396417] RDX: ffff9532390f7780 RSI: 0000000000000001 RDI: 0000000000000000
[ 47.473552] RBP: ffffa3bf82353bf8 R08: 0000000000000001 R09: ffff95323822cac0
[ 47.475477] R10: ffffa3bf82353bd0 R11: ffff95323914d110 R12: ffff95323914d100
[ 47.477260] R13: ffff95323822cac0 R14: ffff9532390f77a0 R15: ffff95320472cf00
[ 47.479419] FS: 00007fec6cb99b20(0000) GS:ffff95323f800000(0000) knlGS:0000000000000000
[ 47.485791] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 47.487972] CR2: 000000c000d8ffb0 CR3: 000000000327c000 CR4: 00000000003506f0
[ 47.495594] Call Trace:
[ 47.496175] <TASK>
[ 47.496695] ____fput+0xe/0x10
[ 47.497410] task_work_run+0x70/0xb0
[ 47.498604] do_exit+0x37b/0xaf0
[ 47.499425] do_group_exit+0x43/0xb0
[ 47.500326] get_signal+0x157/0x8c0
[ 47.501180] arch_do_signal_or_restart+0xf2/0x290
[ 47.573573] exit_to_user_mode_prepare+0x12f/0x1c0
[ 47.574868] syscall_exit_to_user_mode+0x27/0x50
[ 47.575906] do_syscall_64+0x6e/0xb0
[ 47.576732] ? exit_to_user_mode_prepare+0x3d/0x1c0
[ 47.577803] ? syscall_exit_to_user_mode+0x27/0x50
[ 47.579237] ? do_syscall_64+0x6e/0xb0
[ 47.580179] ? exit_to_user_mode_prepare+0x9b/0x1c0
[ 47.581358] ? irqentry_exit_to_user_mode+0x9/0x20
[ 47.583420] ? irqentry_exit+0x19/0x30
[ 47.585168] ? common_interrupt+0x55/0xa0
[ 47.586882] ? asm_common_interrupt+0x8/0x40
[ 47.588067] entry_SYSCALL_64_after_hwframe+0x44/0xae
[ 47.589582] RIP: 0033:0x46f023
[ 47.590462] Code: Unable to access opcode bytes at RIP 0x46eff9.
[ 47.591938] RSP: 002b:00007fec6cb998a0 EFLAGS: 00000286 ORIG_RAX: 00000000000000ca
[ 47.593888] RAX: fffffffffffffe00 RBX: 000000c00003e800 RCX: 000000000046f023
[ 47.595824] RDX: 0000000000000000 RSI: 0000000000000080 RDI: 000000c00003e948
[ 47.597700] RBP: 00007fec6cb998e8 R08: 0000000000000000 R09: 0000000000000000
[ 47.673857] R10: 0000000000000000 R11: 0000000000000286 R12: 00000000000000f7
[ 47.675586] R13: 0000000000000000 R14: 0000000000d00024 R15: 0000000000000000
[ 47.677321] </TASK>
[ 47.678535] Modules linked in: xt_mark ip6table_nat ip6table_filter ip6_tables veth xt_nat xt_tcpudp xt_conntrack xt_MASQUERADE nf_conntrack_netlink nfnetlink xfrm_user xfrm_algo xt_addrtype iptable_filter iptable_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 bpfilter br_netfilter bridge stp llc aufs overlay nls_iso8859_1 dm_multipath scsi_dh_rdac scsi_dh_emc scsi_dh_alua joydev efi_pstore input_leds serio_raw sch_fq_codel ipmi_devintf ipmi_msghandler msr sunrpc ip_tables x_tables autofs4 btrfs blake2b_generic zstd_compress iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi iscsi_ibft iscsi_boot_sysfs raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx xor raid6_pq libcrc32c raid1 raid0 multipath linear hid_generic bochs_drm drm_vram_helper drm_kms_helper syscopyarea sysfillrect usbhid crct10dif_pclmul sysimgblt crc32_pclmul fb_sys_fops ghash_clmulni_intel cec aesni_intel rc_core drm_ttm_helper crypto_simd hid cryptd ttm virtio_net net_failover failover
[ 47.678599] psmouse drm virtio_scsi floppy
[ 47.785254] ---[ end trace 0e747571a933ea24 ]---
(snip)
[ 51.097840] RIP: 0010:__fput+0x247/0x250
[ 51.173822] Code: 00 48 85 ff 0f 84 8b fe ff ff f6 c7 40 0f 85 82 fe ff ff e8 ab 38 00 00 e9 78 fe ff ff 4c 89 f7 e8 2e 88 02 00 e9 b5 fe ff ff <0f> 0b 0f 1f 80 00 00 00 00 0f 1f 44 00 00 55 48 89 e5 53 31 db 48
[ 51.181323] RSP: 0018:ffffa3bf82353bd0 EFLAGS: 00010246
[ 51.184481] RAX: 0000000000000000 RBX: 00000000000a801d RCX: ffff95323d1b4800
[ 51.187779] RDX: ffff9532390f7780 RSI: 0000000000000001 RDI: 0000000000000000
[ 51.191379] RBP: ffffa3bf82353bf8 R08: 0000000000000001 R09: ffff95323822cac0
[ 51.194511] R10: ffffa3bf82353bd0 R11: ffff95323914d110 R12: ffff95323914d100
[ 51.197397] R13: ffff95323822cac0 R14: ffff9532390f77a0 R15: ffff95320472cf00
[ 51.272947] FS: 0000000000000000(0000) GS:ffff95323f900000(0000) knlGS:0000000000000000
[ 51.276348] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 51.278612] CR2: 0000557b01ae52e0 CR3: 0000000004852000 CR4: 00000000003506e0
[ 51.281192] Kernel panic - not syncing: Fatal exception in interrupt
[ 51.285262] Kernel Offset: 0x16400000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
[ 51.299923] ---[ end Kernel panic - not syncing: Fatal exception in interrupt ]---
Kernel更新に関わる問題が発生したときの一般的な対処法としては、GRUBを操作して更新前のKernelを選択して起動しなおせば良いわけだが、今回の環境では勝手が違っていて次の通り。
【事後談】GRUBの設定/etc/default/grub
を確認してみると、そもそもシリアルコンソールを使う設定になっていなかった。
$ cat grub.original | grep -v '^#' | grep -v '^\s*$'
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
Linuxの起動後の数秒間は生きているので、この短い時間内で問題解決をしなければならない。GRUBの設定を変更して一つ前のKernelで起動させることを目標に、次のような操作を行った。操作途中でKernel panicが発生してしまったら、OCI管理画面から対象のインスタンスを強制StopしてまたStartさせて……を繰り返し、不調サーバがつかのま息を吹き返しているうちに続きを実施。
どうやら今回の環境では、コンソールでの直接ログインよりもSSHでのネットワークログインのほうが起動の早い段階で行える、つまりネットワークからアクセスするほうが早く触れて時間的に余裕があると気づいたので、できるだけネットワーク経由で作業を行うようにした。
ssh <不調サーバ>
scp /etc/default/grub <他のサーバ>:/tmp/grub.original
grep -E '(menuentry|submenu) ' /boot/grub/grub.cfg > /tmp/menu.txt && scp /tmp/menu.txt <他サーバ>:/tmp/menu.txt
## 他サーバにて
$ cd /tmp
$ cp grub.original grub.emergency
$ vim grub.emergency
## https://blog.masu-mi.me/post/2020/12/05/switch-kernel-with-grub2/ と
## menu.txtを参考にしながら一つ前のkernelを使う中身に編集する
$ diff grub.original grub.emergency
6c6
< GRUB_DEFAULT=0
---
> GRUB_DEFAULT='Advanced options for Ubuntu>Ubuntu, with Linux 5.13.0-1030-oracle'
scp grub.emergency <不調サーバ>:/tmp/
ssh <不調サーバ>
sudo mv /tmp/grub.emergency /etc/default/grub && sudo update-grub && sudo reboot
最後のsudo update-grub && sudo reboot
までやり通すことができれば、不調サーバは一つ前のKernelで正常に起動してくるはず。
【事後談】問題のインスタンスがマウントしているボリュームを他のインスタンスでマウントし、そちらでGRUBの設定を変更するという方法も可能かも。このほうがデータ破壊の恐れを最小化できるだろうが、OCIでのやり方を知らない。
とりあえず上記の復旧作業を暫定的に行ってほっとした後、Twitterにて Andrew (@andriusk) さんから有用な情報をいただいた。そのリンク先によると、私が問題に遭遇したOCIのインスタンスの他に、AWS (Amazon Web Services), Microsoft Azure, GCE (Google Compute Engine) でも同様の問題が発生しているらしい。
そして問題のKernel panicが発生するのは、dockerが動いている環境らしいのだ。ひぇぇー、私の環境が特殊だったというわけではなく、影響が広範囲っぽくて大変だ。
とりあえず次のメッセージが出ている。
— Masahiko OHKUBO (@mah_jp) June 8, 2022
> kernel BUG at include/linux/fs.h:3104! https://t.co/YpsWIpU01R
— Andrew (@andriusk) June 8, 2022
関連の情報源は次の通り。特に2のリンク先ではスレッドが進行中に思える。発生条件的に該当する環境では、問題が解決するまではKernelの更新は見守ったほうが無難であろう。
Work on this issue continues. We have identified the following impacted kernels and versions:
focal linux-aws-5.13 5.13.0-1028.31
20.04.120.04.1
focal linux-azure-5.13 5.13.0-1028.33
focal linux-gcp-5.13 5.13.0-1030.3620.04.120.04.1
focal linux-oracle-5.13 5.13.0-1033.39
Kernelエラーの問題がdocker絡みだと判明した上での暫定対処方法として、インスタンスの起動直後にdockerサービスを停止 (stop) または無効化 (disable) することも考えられる。
インスタンス上のUbuntu 20.04のカーネル更新で、起動後数十秒でDocker絡みのfs.h kernel panicが話題になっているが、sudo systemctl disable docker.serviceをクリップボードに、シリアルコンソールから素早くログイン&ペースト&エンター。その後インスタンスリブートで一時的に回避出来たこと記す
— MATSUOKA Hiroshi (@matsu_hiroshi) June 9, 2022
GCEとOCIのインスタンスで、問題を回避するために実際にどのような操作をしたかの奮闘記。大変参考になる。