我使用的是 Ubuntu 16.04.1 LTS。系统设置了 RAID1 btrfs /(两个磁盘 sda1 和 sdb1)。没有创建单独的 /boot 分区或 BIOS 启动分区。
在添加两个磁盘并转换为 RAID10 后,系统拒绝启动。不过,我能够通过按照以下说明从 Live CD 运行 update-grub 来修复它这一页。
我对 grub 的工作原理不太了解。但回想起来,它能够启动系统似乎是一个奇迹。如果我理解正确的话,grub 将下一阶段的第一个块的块地址存储在 MBR 中。我说得对吗?我必须使用 update-grub,因为余额会重新排列块。
其次,如果由于 RAID10,grub 的下一阶段被拆分到多个磁盘上,会发生什么情况?它知道如何处理这种情况吗?还是我在这里坐了一个定时炸弹?
答案1
Grub 会加载自己的文件系统管理器(NTFS、FAT32、EXT*、BTRFS、LUKS、LVM、RAID 等),如果在安装时指示模块必须处于启动阶段,这样它才知道如何访问您想要的所有文件系统(受支持的),因此它会加载小型 MBR 代码(存储在第一个扇区上),无论是 MBR 还是 GPT 分区磁盘(或混合),然后它会加载一个“大”数据块,这些数据块硬编码在一个扇区和下一个扇区中(如果在那个阶段放置了很多模块,可能会接近 2MiB 或更多,我测试过最多接近 8MiB),数据存储在磁盘的不可移动部分,可能是在 MBR(第 1MB,最多 2047 个扇区)之后,在专用分区(biosgrub)上(未格式化)(原始模式),在格式化的分区上(在一个不能移动的文件上),或者在链块上(某些 ext* 并且不推荐,因为可以被移动并且直到重新安装 grub 才会启动)。
因此,grub 首先加载一个已硬编码存储“大”代码的微代码,然后 ir 加载该代码,该“大”代码知道如何管理已告知的所有文件系统(当使用模块参数或文件配置等安装 grub 时),这使得 grub 知道如何访问 LUKS 加密(允许多级)、RAID、LVM2、FAT32、NTFS、EXT*、BTRFS 等,因此它知道如何访问存储其文件(grub.cfg 等)的文件系统。
所以是的,GRUB2 可以在纯剥离(raid0、LVM、btrfs 等)上安装而不会出现问题;但如果该“大”代码被复制到另一个地方并且被覆盖,GRUB 将无法启动,直到重新安装 grub 并更新其“大”代码的硬编码位置。
一些文件系统每个文件都有一个标志,允许文件系统知道该文件不能被移动,并且由于该文件没有被重写,所以它不会被移动,除了某些情况。
在 btrfs 平衡的情况下,可能会发生这样的情况:由于 btrfs 上的 COW,这种特殊的 grub 文件(存储“大”代码的位置)会被移走,而且它被覆盖的位置也会被移走,然后 grub2 将无法启动……我在添加第二个磁盘后从“单个”转换为“raid1”时遇到了这种情况。
在这种情况下,grub 将显示救援命令行而不是启动。修复此问题的方法非常简单,只需使用具有 grub-install 命令的实时 Linux 启动(无需执行 chroot)并将 grub.cfg 所在的分区挂载为 / 或 /boot,具体取决于您的 /boot 是否与 / 分区分开;使用正确的 modu,es 参数运行 grub-install,卸载并重新启动,然后从您自己的 Linux 重新执行 grub 安装以获得相同的版本(如果您比较偏执或不喜欢弄乱版本)。
但建议的解决方法是挂载 btfrs,执行 chroot 并从您自己的 linux 重新执行 grub 安装
我更喜欢另一种方案,我总是有自己的 grub2(手动编辑 grub.cfg),它可以链式加载所有其他 linux/windows/etc 引导加载程序,这样每个系统都有自己的引导加载程序,每个系统都不需要依赖其他系统(多重引导)。此外,我在只有一个系统的计算机上也有这种方案,所以我有 ISO 循环(这样我就可以启动驻留在 .iso 文件上的 linux live 发行版),我还添加了跳转 linux 引导加载程序的选项(以防任何更新损坏其自己的引导加载程序等)和链式加载到分区第一个扇区(安装发行版引导加载程序的位置)。
这样,我就可以隔离问题,如果 Linux 发行版引导加载程序无法启动,我可以使用自己的条目启动而不是使用 chaiload 启动,然后我修复需要修复的内容,等等。
由于我发现 btrfs raid 1 让我从一些 KingDian SSD 中恢复,在长时间断电(超过一周、八天甚至更长时间)后,说一些扇区无法读取(并且如果再断电八天,不可读更改列表和无法读取的扇区将再次变为可读,并且上面有正确的数据;KingDian SSD 上确实存在奇怪的故障);我只将 btrfs raid 1 用于我自己的主要 GRUB2 引导程序和所有 linux。
是的,我有时需要修复 Linux 的 grub 启动,但几个月以来我只需要做一次,并且是在添加第二个磁盘和平衡(从单个转换为 raid1)之后,所以我可以假设这不是什么值得担心的事情,它足够安全,并且如果它失败了,只需使用 SystemRescuCd 或任何具有 grub-install 命令的发行版进行启动,您就可以直接修复它(作为紧急情况)或通过执行 chroot(推荐)。
在我了解 btrfs 之前,我一直在 RAID0 中的 NxHDD 上使用 grub2(很久以前通过 dm-raid,最近通过 LVM2),并且从未因为“sttriping”而遇到任何问题……记住不要忘记 grub-install 命令上的“modules”参数。
因此,不必担心在 btrfs 上的 RAID 0、1、10 上安装 GRUB2,但我认识的所有人都告诉我,如果是 RAID(5 或 6),最好不要在 btrfs 上使用 raid5 或 raid6。
答案2
你没有提供太多信息。例如,GRUB 是否加载?!
我刚刚在虚拟机上测试了这一点。我在单个磁盘上安装了内核为 4.9 的 Debian Stretch 和 btrfs-progs V4.7。引导加载程序是 GRUB 2.02~beta3-4 包。
安装后,我添加了 3 个额外的磁盘(总共 4 个磁盘(每个磁盘有 1 个分区))。我在所有磁盘上安装了 grub 并执行了 update-grub。
我将数据和元数据重新平衡到 RAID10。我甚至移除了 RAID10 组中的其中一个磁盘以查看发生了什么。我不得不使用 rootflags=degraded 编辑内核命令行以使用丢失的磁盘进行启动。重新连接磁盘并运行平衡(将单个块再次转换为 raid10)后,我重新整理了数据,安装了一些内容,重新平衡了几次,仍然成功启动。请注意,在这些平衡过程中,我没有在任何磁盘上运行 update-grub。
GRUB 手册还指出支持 BTRFS RAID0、RAID1、RAID10、gzip 和 lzo:https://www.gnu.org/software/grub/manual/grub.html
我自己不太了解 GRUB 的工作原理,但我只能假设 BTRFS 必须有一个转换层……例如,虚拟块 1234 指向它在磁盘上的实际位置。
根据我的测试得出的结论是,使用 btrfs raid10 启动似乎并不比使用 raid1 启动更可怕。我无法回答 Ubuntu 16.04.1 LTS 的问题,因为我没有使用它,但我建议你自己尝试一下,因为根据我的测试,它似乎运行良好。