在 AWS (ec2) 上使用 Ubuntu 20.04 时,我想将我的内核从 AWS 更改为通用内核。当我尝试按照建议的方式更改 Grub 配置时,它会停止机器。
这是因为 Jibri(Jitsi 视频录像机)需要使用 ALSA 并 modprobe snd-aloop ,但任何想要低延迟或不同内核的东西都会有相同的需求——想要使用与 AWS 不同的内核。
我尝试过的:
抓取图像:
sudo apt install linux-image-extra-virtual
您将看到它在安装包中引用了类似 Linux 5.4.0-84-generic 的内容,这对以后有帮助。现在,列出您为该新通用内核拥有的启动项
grep -A200 submenu /boot/grub/grub.cfg |grep -P '^(?=.*menuentry)(?=.*generic)'
我懂了:
menuentry 'Ubuntu,带有 Linux 5.4.0-84-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-84-generic-advanced-e8070c31-bfee-4314-a151-d1332dc23486' { menuentry 'Ubuntu,带有 Linux 5.4.0-84-generic (恢复模式)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-84-generic-recovery-e8070c31-bfee-4314-a151-d1332dc23486' {
在最上面的一行(不是提到恢复模式的那一行)中,复制行首的菜单项。我的看起来像是 Ubuntu,带有 Linux 5.4.0-84-generic ,但每个人的情况都不一样。
现在,我将编辑/etc/默认/grub,
注释掉 GRUB_DEFAULT=0(加载 grub 启动列表中的第一个条目),并将其更改为我们之前找到的字符串。对我来说,文件的这一部分现在看起来像:
#GRUB_DEFAULT=0
GRUB_DEFAULT="Ubuntu, with Linux 5.4.0-84-generic"
这还不是一个正确的设置 - 我们正在使用它来让 grub 检查并告诉我们最好的方法。
此时,我们可以 sudo update-grub,它会给我一个这样的友好警告(这很好!)
Warning: Please don't use old title `Ubuntu, with Linux 5.4.0-84-generic' for GRUB_DEFAULT, use `Advanced options for Ubuntu>Ubuntu, with Linux 5.4.0-84-generic' (for versions before 2.00) or `gnulinux-advanced-e8070c31-bfee-4314-a151-d1332dc23486>gnulinux-5.4.0-84-generic-advanced-e8070c31-bfee-4314-a151-d1332dc23486' (for 2.00 or later)
再次,这很好!我们知道我们指定了它能识别的东西。现在每个人都在运行 2.00 以上的 grub,所以我们现在再次编辑 /etc/default/grub 并将其更改为最终值:
(我的价值观与你的不同)
#GRUB_DEFAULT=0
#GRUB_DEFAULT="Ubuntu, with Linux 5.4.0-84-generic"
GRUB_DEFAULT="gnulinux-advanced-e8070c31-bfee-4314-a151-d1332dc23486>gnulinux-5.4.0-84-generic-advanced-e8070c31-bfee-4314-a151-d1332dc23486"
sudo update-grub,我看到警告现在已经消失。
现在我做一个sudo reboot now
此时,grub 已为我提供了一个配置,该配置应该尝试启动通用内核,然后恢复到正常内核。
相反,它会陷入启动循环。
在串行控制台中,我在其启动循环期间反复看到此现象。
[ 0.000000] Linux version 5.4.0-84-generic (buildd@lgw01-amd64-050) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #94-Ubuntu SMP Thu Aug 26 20:27:37 UTC 2021
(Ubuntu 5.4.0-84.94-generic 5.4.133)
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.4.0-84-generic root=PARTUUID=5198cbc0-01 ro console=tty1 console=ttyS0 nvme_core.io_timeout=4294967295 panic=-
1
[ 0.000000] KERNEL supported cpus:
[ 0.000000] Intel GenuineIntel
[ 0.000000] AMD AuthenticAMD
[ 0.000000] Hygon HygonGenuine
[ 0.000000] Centaur CentaurHauls
[ 0.000000] zhaoxin Shanghai
... lots of cpu init that's hard to copy ..
[ 10.366218] rtc_cmos 00:00: setting system clock to 2021-09-21T11:25:30 UTC (1632223530)
[ 10.373185] md: Waiting for all devices to be available before autodetect
[ 10.460173] md: If you don't use raid, use raid=noautodetect
[ 10.464642] md: Autodetecting RAID arrays.
[ 10.468024] md: autorun ...
[ 10.470867] md: ... autorun DONE.
[ 10.473906] VFS: Cannot open root device "PARTUUID=5198cbc0-01" or unknown-block(0,0): error -6
[ 10.562806] Please append a correct "root=" boot option; here are the available partitions:
[ 10.569825] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[ 10.674637] CPU: 1 PID: 1 Comm: swapper/0 Not tainted 5.4.0-84-generic #94-Ubuntu
[ 10.682527] Hardware name: Amazon EC2 t3.small/, BIOS 1.0 10/16/2017
[ 10.686735] Call Trace:
[ 10.691100] dump_stack+0x6d/0x8b
[ 10.759061] panic+0x101/0x2e3
[ 10.761974] mount_block_root+0x23f/0x2e8
[ 10.765568] mount_root+0x38/0x3a
[ 10.768584] prepare_namespace+0x13f/0x194
[ 10.771873] kernel_init_freeable+0x23f/0x263
[ 10.775368] ? rest_init+0xb0/0xb0
[ 10.859141] kernel_init+0xe/0x110
[ 10.862101] ret_from_fork+0x35/0x40
[ 10.865843] Kernel Offset: 0x36a00000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
它告诉我找不到启动设备或与之对应的 partuuid。此时,我几乎必须终止实例并重试,因为我无法轻松恢复它。
有没有更好的方法将我的内核更改为通用内核?如果它可以启动,我很乐意以任何可能的方式使用通用映像。
答案1
如日志跟踪所述:
FS: Cannot open root device "PARTUUID=5198cbc0-01" or unknown-block(0,0): error -6
[ 10.562806] Please append a correct "root=" boot option; here are the available partitions:
[ 10.569825] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
问题主要在于 /etc/default/grub.d/40-force-partuuid.cfg 中强制设置 PARTUUID
解决方案是:
- 安装特定
linux-generic
内核(sudo apt install linux-generic
最新版)。您可以使用命令检查可用的内容linux-version list
- 更改
GRUB_DEFAULT="1>2"
或相应地更改grub.cfg
菜单顺序列表。
(“1>2”)解释:数字 1 代表“高级 Ubuntu 选项”(从零开始的第二个菜单项),数字 2 是“高级 Ubuntu 选项”中的第三个子菜单选项(从零开始),这是我的情况应该使用的通用内核。
- 注释掉
GRUB_FORCE_PARTUUID
行/etc/default/grub.d/40-force-partuuid.cfg
sudo update-grub && sudo update-grub2
Reboot