在 Debian 10 (buster) 系统上,我刚刚尝试安装最近的grub-pc
更新,并且第一次收到此错误:
Installing for i386-pc platform.
grub-install: warning: your core.img is unusually large. It won't fit in the embedding area.
grub-install: error: embedding is not possible, but this is required for RAID and LVM install.
对于构成我的/boot/
分区的每个磁盘都重复了此操作。
这个安装很老了;它于 2006 年安装,磁盘已多次移植到新硬件中,并且操作系统从那时起一直保持最新状态。
因此,for 的设置/boot
相当陈旧,但仍然可以工作。有四个相同分区的 HDD:
$ sudo fdisk -u -l /dev/sda
Disk /dev/sda: 298.1 GiB, 320069031424 bytes, 625134827 sectors
Disk model: ST3320620AS
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 63 514079 514017 251M fd Linux raid autodetect
/dev/sda2 514080 6393869 5879790 2.8G fd Linux raid autodetect
/dev/sda3 6393870 625121279 618727410 295G fd Linux raid autodetect
所以这是一个老式的 MBR,第一个分区从 63 个扇区开始。每个磁盘的第一个分区被放入一个 4 路 RAID-1 中md0
,这就是我的/boot
:
$ sudo mdadm --detail /dev/md0
/dev/md0:
Version : 0.90
Creation Time : Sun Jun 4 08:18:05 2006
Raid Level : raid1
Array Size : 256896 (250.88 MiB 263.06 MB)
Used Dev Size : 256896 (250.88 MiB 263.06 MB)
Raid Devices : 4
Total Devices : 4
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Thu Mar 4 06:52:36 2021
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Consistency Policy : resync
UUID : 78cf4169:e31908f4:e667021c:582159fb
Events : 0.2479
Number Major Minor RaidDevice State
0 8 49 0 active sync /dev/sdd1
1 8 1 1 active sync /dev/sda1
2 8 17 2 active sync /dev/sdb1
3 8 33 3 active sync /dev/sdc1
这个 md 数组故意具有元数据版本 0.90,以便它可以由 grub 引导,因为它可以追溯到 grub 不支持 md 的时间;0.90 元数据版本将元数据放在分区的末尾,因此 grub 应该能够读取每个分区,就好像它不是软件 RAID 一样。
grub 已安装到基本磁盘设备,即每个/dev/sd{a,b,c,d}
. 软件包的后续升级grub-pc
似乎知道运行grub-install /dev/sda
,然后对于sd{b,c,d}
.
直到今天才出现此错误。
这个系统现在无法启动吗?它看起来像一个错误情况,所以我假设新版本的 grub 并没有实际安装。
我很困惑为什么它说它需要为 RAID/LVM 做一些事情,而不需要这样的支持来引导这个系统。
grub 是否因某种原因增大了大小,现在不适合每个磁盘的前 63 个扇区?我知道现在的惯例是以 1MB 开始分区,但正如我所说,这是一个非常古老的安装,一直有效。
安装此 grub 更新的最简单方法是什么?如果我需要删除那些第一个分区并以 1MB 的大小启动它们,我可以很容易地做到这一点,尽管我想在我达到那个长度之前确定这实际上是问题所在。
的详细输出grub-install -v /dev/sda
是巨大的,然后以相同的方式结束。我无法在其中发现任何有用的内容,但如果有人认为有必要,我会将其包括在内。
具体来说,Debian Buster 和 Bullseye 上的最新 grub2 软件包包含大量补丁变更日志,其中很多都涉及添加缺失检查(例如缓冲区溢出、NULL 取消引用),这些在以前的版本中是不存在的。
其中一些会影响配置解析器、grub.cfg 脚本执行器和分区表扫描器,所有这些都包含在安装在 MBR 后间隙中的核心映像中。这会稍微增加代码大小。
但是,如果余量如此之小,您甚至可能会受到不同编译器为同一源输出不同代码的影响,或者受到分发更改编译器标志以添加运行时安全检查的影响。
如果您不断更新系统,这本身就意味着软件不断变化,并且“它不能停止工作,因为它一直在工作”的理念直接消失了。
但是 GRUB 2现在确实支持 md ,这意味着如果它检测到 /boot 位于 mdraid 阵列上,那么它将在其核心映像中包含一个 mdraid 驱动程序——即使该阵列恰好是 0.90 RAID1。这增加了核心图像的大小。
(mdraid 支持不仅仅意味着能够跳过元数据——它意味着能够从 raid0/5/6 阵列读取、识别备用磁盘等等。)
在当前的 Debian Buster 上,只有 GRUB 2 内核(没有模块也没有配置)的完全准系统 core.img 是 39 个扇区1。使用默认的 'biosdisk'、'part_msdos'、'search_fs_uuid' 和 'ext2' 模块集,它有 54 个扇区 - 如果在顶部添加 'mdraid09' 模块,那已经是 64 个扇区,而您的磁盘只有 62 个扇区备用(不包括位置 0 的 MBR 引导扇区)。
1使用 测量
grub-mkimage -O i386-pc -p /boot [modules] | wc -c
。grub-install 还需要添加一个简短的 2 行配置,将 GRUB 内核指向您的真实 /boot 位置,但假设这适合剩余的 1⁄4 个扇区。
在 BIOS 系统上,grub-install 还为 Reed-Solomon 纠错码使用了一些额外的空间,以便在其中一个扇区损坏的情况下进行引导——我找不到关于它使用了多少空间的信息,但它至少是几个部门。
所以你有几个选择:
--no-rs-codes
并希望结果足够小以适合。grub-install --skip-fs-probe --modules=...
,但更可能使用grub-mkimage
),假装它仍然是 2006 并且 GRUB 还没有 md 支持。该死,我的 RAID1 /boot 分区与 sda/sdb 有完全相同的问题。
不久前,当我从 Stretch 升级到 Buster 时,我能够从 /boot 磁盘空间不足的情况下恢复。现在这个:(
抱歉,我对 user1686 作为解决方案提供的可能替代方案有点厚积薄发。特别是移动引导分区听起来很有趣。您能否详细说明它们,或者创建 grifferz 先生评论的新的更小的引导阵列/分区。
从之前的引导分区练习中,我确实有一些 1GB 的未分配空间可用。我想知道我是否可以以某种方式利用它?
不知何故重装系统一点都不吸引人……