如何让apt在其他分区生成精简内核initrd文件后覆盖/boot分区原文件?
我完全理解你现在的困境——/boot分区空间实在太紧张,apt因为无法生成新的initrd彻底卡住,确实挺闹心的。下面我会一步步带你解决问题,从临时修复当前的apt故障,到永久配置让后续内核更新不再踩这个坑。
一、临时修复:手动在大分区生成精简initrd并替换
你的根分区(/)还有10G可用空间,我们先在这里生成精简版initrd,再替换到/boot里,让apt能继续完成修复操作。
1. 生成精简版initrd到/tmp目录
使用mkinitramfs命令,指定内核版本、输出路径,并排除非必需模块来缩小文件体积:
# 注意替换为你的内核版本,这里是4.4.0-170-generic sudo mkinitramfs -o /tmp/initrd.img-4.4.0-170-generic -k 4.4.0-170-generic --exclude=usb-storage --exclude=firewire --exclude=soundcore --exclude=bluetooth
--exclude参数可以根据你的硬件灵活调整:比如你没有外接USB存储、火线接口、蓝牙或独立声卡,就可以排除这些模块,能大幅压缩initrd体积。- 如果你不确定哪些模块可排除,可以先执行
lsmod查看当前加载的模块,只保留磁盘驱动、文件系统这类启动必需的模块即可。
执行后检查生成的文件大小:
du -sh /tmp/initrd.img-4.4.0-170-generic
正常情况下,它会比你原来36M的initrd小很多(比如15-20M左右)。
2. 替换/boot中的原initrd
先备份原文件(以防万一):
sudo mv /boot/initrd.img-4.4.0-170-generic /boot/initrd.img-4.4.0-170-generic.bak
再把/tmp里的精简版复制到/boot:
sudo cp /tmp/initrd.img-4.4.0-170-generic /boot/
最后修正文件权限,确保系统能正常读取:
sudo chmod 644 /boot/initrd.img-4.4.0-170-generic
3. 完成apt的修复操作
现在/boot的空间应该足够了,执行命令让apt继续完成依赖修复:
sudo apt -f install
这时候apt应该能顺利完成剩余的操作了。
二、永久配置:让apt自动生成精简initrd(避免再踩坑)
为了以后内核更新时不再出现空间不足的问题,我们需要修改initramfs的配置,让它默认生成精简版initrd,同时确保生成过程在大分区完成。
1. 修改initramfs核心配置
编辑/etc/initramfs-tools/initramfs.conf:
sudo nano /etc/initramfs-tools/initramfs.conf
找到以下配置项并修改:
- 精简模块加载:把
MODULES=most改成MODULES=dep,这样initrd只会加载系统启动必需的模块,而非所有可能的模块:MODULES=dep - 优化压缩方式:如果你的系统默认用zstd压缩(新内核常用),可以改成
gzip(压缩后的文件体积更小,对老内核来说解压速度的影响可以忽略):COMPRESSION=gzip
保存并退出编辑器(nano按Ctrl+O保存,Ctrl+X退出)。
2. 配置钩子:让initrd先在大分区生成再复制到/boot
默认update-initramfs(apt更新内核时会调用它)会直接在/boot生成文件,我们可以添加一个钩子脚本,让它先在/tmp生成,再复制到/boot:
- 创建钩子脚本:
sudo nano /etc/initramfs-tools/hooks/00_copy_to_boot
- 写入以下内容:
#!/bin/sh set -e # 仅在生成initrd阶段执行 if [ "$1" = "prereqs" ]; then exit 0; fi # 获取当前处理的内核版本 KERNEL_VERSION="$2" TMP_INITRD="/tmp/initrd.img-${KERNEL_VERSION}" BOOT_INITRD="/boot/initrd.img-${KERNEL_VERSION}" # 先在/tmp生成精简initrd mkinitramfs -o "$TMP_INITRD" -k "$KERNEL_VERSION" # 复制到/boot并修正权限 cp "$TMP_INITRD" "$BOOT_INITRD" chmod 644 "$BOOT_INITRD" # 清理临时文件 rm "$TMP_INITRD"
- 给脚本添加执行权限:
sudo chmod +x /etc/initramfs-tools/hooks/00_copy_to_boot
3. 测试配置是否生效
手动更新initramfs验证:
sudo update-initramfs -u -k 4.4.0-170-generic
然后检查/boot里的initrd大小:
du -sh /boot/initrd.img-4.4.0-170-generic
应该会比原来的36M小很多,同时/boot的剩余空间也能保持充足。
三、额外建议:扩大/boot分区(可选)
如果之后你有时间,可以考虑把/boot分区扩大到512M左右,从根本上避免空间不足的问题。你可以用GParted这类工具调整分区,但操作前一定要备份好重要数据!
备注:内容来源于stack exchange,提问作者Phrogz




