Arch Linux更新后mkinitcpio -P报错error的解决
2026/7/24 13:17:44 网站建设 项目流程

Arch Linux更新后进行mkinitcpio应该是SOP标准操作(虽然我记住这个也是因为某次更新kernel之后再启动纯黑屏grub引导都没进去给我吓一跳。今天我sudo pacman -Syu之后mkinitcpio -P发现报错,问了DeepSeek之后发现给的解决方式有点怪,于是我在这记录一下我的解决方法:

1. 操作及报错情况

[yinyou@archlinux ~]$ mkinitcpio-P==>Building image from preset: /etc/mkinitcpio.d/linux-lts.preset:'default'==>Using default configuration file:'/etc/mkinitcpio.conf'->-k/boot/vmlinuz-linux-lts-g/boot/initramfs-linux-lts.img==>ERROR: Invalid option-g--'/boot/initramfs-linux-lts.img'must be writable==>Building image from preset: /etc/mkinitcpio.d/linux-surface.preset:'default'==>Using default configuration file:'/etc/mkinitcpio.conf'->-k/boot/vmlinuz-linux-surface-g/boot/initramfs-linux-surface.img==>ERROR: Invalid option-g--'/boot/initramfs-linux-surface.img'must be writable

2. DeepSeek建议的排查思路

DeepSeek:
这个错误说得很清楚:mkinitcpio 无法写入 /boot/ 目录,因为它没有写权限,或者 /boot 分区已满(或文件系统处于只读状态)。
一、先确认 /boot 分区的状态

运行以下命令,查看 /boot 分区的挂载情况:

mount|grep/boot

你会看到类似:

vfat 或 ext4 → 这是 /boot 的文件系统类型,但还需要检查挂载状态。 如果输出中出现 ro(read-only),说明分区当前是只读状态。

接着检查 /boot 是否写满:

df-h/boot

如果 Use% 显示为 100% 或接近满,就说明磁盘空间不足,这就是 mkinitcpio 无法写入新镜像的原因。对于 EFI 系统来说,/boot 通常是 vfat 分区,容量较小(一般在 100MB 到 1GB 之间)。如果旧的内核镜像文件(如 initramfs-linux-lts.img 和 initramfs-linux-surface.img)没有被清理,很容易填满。

3. 我的解决思路

我:没看懂,但好像是权限不够,那我直接sudo试试

[yinyou@archlinux ~]$sudomkinitcpio-P[sudo]yinyou 的密码:==>Building image from preset: /etc/mkinitcpio.d/linux-lts.preset:'default'==>Using default configuration file:'/etc/mkinitcpio.conf'->-k/boot/vmlinuz-linux-lts-g/boot/initramfs-linux-lts.img==>Starting build:'6.18.39-1-lts'->Running build hook:[base]->Running build hook:[systemd]->Running build hook:[autodetect]->Running build hook:[microcode]->Running build hook:[modconf]->Running build hook:[kms]->Running build hook:[keyboard]->Running build hook:[sd-vconsole]->Running build hook:[block]->Running build hook:[filesystems]->Running build hook:[fsck]==>Generating module dependencies==>Creating zstd-compressed initcpio image:'/boot/initramfs-linux-lts.img'->Early uncompressed CPIO image generation successful==>Initcpio image generation successful==>Building image from preset: /etc/mkinitcpio.d/linux-surface.preset:'default'==>Using default configuration file:'/etc/mkinitcpio.conf'->-k/boot/vmlinuz-linux-surface-g/boot/initramfs-linux-surface.img==>Starting build:'6.19.8-arch1-3-surface'->Running build hook:[base]->Running build hook:[systemd]->Running build hook:[autodetect]->Running build hook:[microcode]->Running build hook:[modconf]->Running build hook:[kms]->Running build hook:[keyboard]->Running build hook:[sd-vconsole]->Running build hook:[block]->Running build hook:[filesystems]->Running build hook:[fsck]==>Generating module dependencies==>Creating zstd-compressed initcpio image:'/boot/initramfs-linux-surface.img'->Early uncompressed CPIO image generation successful==>Initcpio image generation successful

4. 我直接sudo解决了。如果是DeepSeek分析的以上原因比如/boot满了,那么我的sudo解法会带来什么隐患吗?

直接回答你:在“/boot 满了”这个问题上,你用sudo做的操作(比如sudo rm删文件、sudo pacman -R删旧内核包、sudo mkinitcpio -P)是完全合法且正确的,不会带来隐患。真正需要担心的是“不理解为什么能用sudo,以及/boot是怎么被填满的”。

我们把这个场景拆开来看:


一、为什么用sudo解决“/boot 满了”是安全的?

/boot分区(特别是 EFI 系统分区)是操作系统内核和 initramfs 镜像的存放处,这些文件的所有权属于root,普通用户没有写权限。当你用sudo执行以下操作时,你实际上是在做系统管理的标准动作:

操作性质是否安全
sudo rm /boot/initramfs-*.img清理旧内核镜像✅ 安全,只删除文件,不涉及系统配置文件
sudo pacman -R linux-lts卸载旧内核包✅ 安全,包管理器会清理/boot中属于该包的文件
sudo mkinitcpio -P重新生成 initramfs✅ 安全,这是官方推荐的内核更新后的流程
sudo mount -o remount,rw /boot重新挂载为可写✅ 安全,仅改变挂载状态,不改变文件系统内容

这些操作都不会破坏系统配置、不会引入恶意代码、不会导致其他分区受损。唯一需要确认的是:你在/boot中删除的文件,确实是你确认不再需要的内核版本,而不是当前正在运行的内核。如果你不小心删除了当前正在使用的内核文件,下次启动时仍然可以进入系统(因为内核已经加载到内存中),但下次重启时可能会无法启动。删除前建议先用uname -r确认当前内核版本,并保留对应的vmlinuzinitramfs文件。


二、用sudo解决的真正“隐患”在于“你不知道为什么它能解决”

你问“隐患”时,真正想问的可能是:

“我这样做了之后,下次还会再出现同样的问题吗?”

答案取决于/boot为什么会被填满。如果它只是偶尔满了(比如你安装了多个内核版本),用sudo rm清理是正常的系统维护。但如果/boot总是快速被填满,可能的原因包括:

情况原因如何永久解决
/boot分区本身太小EFI 系统分区通常只有 100MB-500MB,频繁更新内核时确实容易爆满调整分区大小(较复杂),或定期清理旧内核
你安装了多个内核版本linuxlinux-ltslinux-surface同时存在检查当前使用的内核,卸载不用的版本
系统自动保留多个 initramfs每次内核更新都会生成新的 initramfs这种属于正常行为,只需定期清理旧文件即可

三、用sudo的“真正风险”只在你误删了不该删的文件时才会出现

如果你在/boot下删除了当前正在使用的内核(通常是vmlinuz-linux),并且在没有其他可启动内核的情况下重新启动,你将无法进入系统。但只要你确认了当前内核版本(uname -r),并只删除旧版本,就不会触发这个风险。而且如果你在删除旧内核时保留了当前版本的vmlinuzinitramfs,下次启动时仍能正常引导。


四、你现在应该做的一步“收尾”操作

清理完/boot后,确认mkinitcpio -P已成功生成当前内核的 initramfs。然后运行:

sudogrub-mkconfig-o/boot/grub/grub.cfg

这一步会更新 GRUB 菜单,确保它指向正确的内核和 initramfs 文件。很多关于/boot的后续问题(例如 GRUB 找不到内核)都是因为忘记更新配置引起的。


五、总结:sudo不是隐患,隐患是不理解清理逻辑

你的操作本身没有问题,真正需要注意的点是:定期检查/boot分区使用情况,以免再次写满。你可以在/etc/pacman.conf中启用CleanMethod = KeepCurrent选项来自动清理旧内核文件,避免每次手动删除。如果有多个内核版本,可以用pacman -R删除不用的,而不是手动删除文件,因为pacman会自动清理关联文件并更新 GRUB 配置。你是安全的,而且你已经做了系统管理员日常该做的事。下次如果担心/boot再次写满,可以用df -h /boot定期检查一下。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询