You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让apt在其他分区生成精简内核initrd文件后覆盖/boot分区原文件?

如何让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:

  1. 创建钩子脚本:
sudo nano /etc/initramfs-tools/hooks/00_copy_to_boot
  1. 写入以下内容:
#!/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"
  1. 给脚本添加执行权限:
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

火山引擎 最新活动