Ubuntu 18 上的内核升级(4.15 至 4.19)后“加载初始 ramdisk”内存不足

Ubuntu 18 上的内核升级(4.15 至 4.19)后“加载初始 ramdisk”内存不足

我正在尝试将内核升级到 4.19,因为我需要运行一些需要它的基准测试(打开一些内核选项)。我完全不明白为什么这不起作用。我已经完成了两次 ubuntu 18 全新安装,下载 4.19 内核,制作 oldconfig(或 olddefconfig),安装模块和内核本身。重新启动后,输出只是说

Loading Linux 4.19.237
Loading initial ramdisk
error: out of memory
Press any key to continue

按下按键后,它只显示初始启动消息和错误堆栈:

在此输入图像描述

如果我重新启动,较旧的(4.15)内核仍然可以启动并完美运行。

grub.cfg 上的两个条目相似

menuentry 'Ubuntu, with Linux 4.19.237' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.19.237-advanced-cbc1623f-b651-454a-87dd-da2056dd55\05' {
                recordfail
                load_video
                gfxmode $linux_gfx_mode
                insmod gzio
                if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
                insmod part_gpt
                insmod ext2
                set root='hd0,gpt2'
                if [ x$feature_platform_search_hint = xy ]; then
                  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  cbc1623f-b651-454a-87dd-da2056dd5505
                else
                  search --no-floppy --fs-uuid --set=root cbc1623f-b651-454a-87dd-da2056dd5505
                fi
                echo    'Loading Linux 4.19.237 ...'
                linux   /boot/vmlinuz-4.19.237 root=UUID=cbc1623f-b651-454a-87dd-da2056dd5505 ro
                echo    'Loading initial ramdisk ...'
                initrd  /boot/initrd.img-4.19.237
        }

menuentry 'Ubuntu, with Linux 4.15.0-20-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-20-generic-advanced-cbc1623f-b651-45\4a-87dd-da2056dd5505' {
                recordfail
                load_video
                gfxmode $linux_gfx_mode
                insmod gzio
                if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
                insmod part_gpt
                insmod ext2
                set root='hd0,gpt2'
                if [ x$feature_platform_search_hint = xy ]; then
                  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  cbc1623f-b651-454a-87dd-da2056dd5505
                else
                  search --no-floppy --fs-uuid --set=root cbc1623f-b651-454a-87dd-da2056dd5505
                fi
                echo    'Loading Linux 4.15.0-20-generic ...'
                linux   /boot/vmlinuz-4.15.0-20-generic root=UUID=cbc1623f-b651-454a-87dd-da2056dd5505 ro
                echo    'Loading initial ramdisk ...'
                initrd  /boot/initrd.img-4.15.0-20-generic
        }

我完全没有主意了。我已经多次重新编译内核,在BIOS中禁用TPM,更新BIOS,重新安装没有LVM的ubuntu,尝试恢复模式,从RAID更改为AHCI(只有一个磁盘)。

有任何想法吗?

编辑:在到处搜索并更改配置后,我启动了它,但仍然遇到内存不足错误,这需要我按一个键。我在内核中启用了一堆 VIRTIO、AHCI 和其他 BLK 参数。然后,当我在内存不足错误后按下按钮时,它显示了完全不同的 UUID 列表:

在此输入图像描述

这让我尝试不使用 UUID。所以我把 grub 改为使用root=/dev/sda2.按下一个out of memory error键后,我会看到很长的启动日志和登录提示。

由于某种原因,网络设备在新内核中更改了名称(从 enp4s0 更改为 enp3s0),因此我必须编辑 netplan 文件并且我有网络。

现在,我仍然遭受内存不足错误的困扰,但我不知道为什么。我需要解决这个问题,因为我远程使用这台机器,并且每当我需要重新启动它时都无法访问它。对于为什么在如此简单的内核升级中发生这种情况,仍然愿意接受任何想法。

答案1

结果发现 initrd 镜像非常大。 500MB 与默认的 50MB 相比。减小尺寸的关键在于:编译内核时如何减小 initrd 的大小?

基本上:/etc/initramfs-tools/initramfs.conf改变MODULESMODULES=dep.

安装模块时,传递一个变量来去除调试符号:make INSTALL_MOD_STRIP=1 modules_install

此后,内存不足错误消失,vfs 错误也因某种原因消失。现在initrd已经小于50MB了。在应用这些更改之前,我确实升级了所有软件包,包括内核,但它可能不会产生任何影响。

答案2

除了更改 MODULES 之外,您还可以提高 initrds 的压缩级别。

/etc/initramfs-tools/initramfs.conf

MODULES=dep
COMPRESS=xz

更新conf文件后运行以下命令:

sudo update-initramfs -c -k all
sudo update-grub

相关内容