![Ubuntu 18 上的内核升级(4.15 至 4.19)后“加载初始 ramdisk”内存不足](https://linux22.com/image/204722/Ubuntu%2018%20%E4%B8%8A%E7%9A%84%E5%86%85%E6%A0%B8%E5%8D%87%E7%BA%A7%EF%BC%884.15%20%E8%87%B3%204.19%EF%BC%89%E5%90%8E%E2%80%9C%E5%8A%A0%E8%BD%BD%E5%88%9D%E5%A7%8B%20ramdisk%E2%80%9D%E5%86%85%E5%AD%98%E4%B8%8D%E8%B6%B3.png)
我正在尝试将内核升级到 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
改变MODULES
为MODULES=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