我在启动 Debian 8 系统时遇到问题,在该系统上我将根分区从单个硬盘驱动器迁移到 RAID1 (mdraid)。
每次启动时,我都会收到以下 grub 错误:
Gave up waiting for root device. Common problems:
- Boot args (cat /proc/cmdline)
- Check rootdelay= (did the system wait long enough?)
- Check root= (did the system wait for the right device?)
- Missing modules (cat /proc/modules; ls /dev)
ALERT! /dev/disk/by-uuid/2ab18cb4-a23d-4e5c-b37d-cbd3077b878c does not exist.
Dropping to a shell!
modprobe: module ehci-orion not found in modules.dep
(initramfs)
/dev/md0没有启动,所以找不到根分区:
(initramfs) ls /dev/md*
ls: /dev/md*: No such file or directory
(initramfs)
不过,我可以手动启动突袭:
(initramfs) mdadm --assemble --scan
mdadm: /dev/md0 has been started with 2 drives.
(initramfs) ls /dev/md*
/dev/md0
仅当我手动创建目录时系统才会启动/dev/disk/by-uuid和链接MD0:
(initramfs) mkdir /dev/disk/by-uuid
(initramfs) ln -s /dev/md0 /dev/disk/by-uuid/2ab18cb4-a23d-4e5c-b37d-cbd3077b878c
我希望有人能帮我弄清楚为什么 grub 不自行启动 md 设备。我在互联网上搜索并尝试了所有我能找到的东西,但没有成功。我现在真的迷路了。
我想通过以下方式启动BIOS 传统, 不是UEFI。
仅有的两个连接的硬盘驱动器(SSD!)被格式化为GPT分区表和以下分区(完全一样):
1 1049kB 2097kB 1049kB bios_grub
2 2150MB 12,9GB 10,7GB ext4 raid
(grub 电脑需要从第一个分区启动GPT驱动器)
Raid1(v0.90 元数据)直接格式化为外部4。
通过实时系统 chroot,我安装了grub 电脑到/dev/sda和/dev/sdb,改变了我的系统表,跑update-grub
和update-initramfs -u -k all
。
blkid
:
/dev/sda2: UUID="b59d3baf-346b-568d-03a2-8b26060640c5" TYPE="linux_raid_member" PARTUUID="0609ba5b-9065-41f8-80ed-6832e3236ec9"
/dev/sdb2: UUID="b59d3baf-346b-568d-03a2-8b26060640c5" TYPE="linux_raid_member" PARTUUID="24ee1040-02dd-4867-b4da-5be11d59bdcd"
/dev/md0: UUID="2ab18cb4-a23d-4e5c-b37d-cbd3077b878c" TYPE="ext4"
/dev/sda1: PARTUUID="df5161cf-b5b3-422c-9ed2-90a7750ac265"
/dev/sdb1: PARTUUID="7d20b55b-ba50-4187-b05e-ae1f18b21de3"
mdadm.conf包含(仅!)以下内容mdadm --detail --scan
:
ARRAY /dev/md0 metadata=0.90 UUID=b59d3baf:346b568d:03a28b26:060640c5
这是我的摘录/boot/grub/grub.cfg:
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod part_gpt
insmod diskfilter
insmod mdraid09
insmod ext2
set root='mduuid/b59d3baf346b568d03a28b26060640c5'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint='mduuid/b59d3baf346b568d03a28b26060640c5' 2ab18cb4-a23d-4e5c-b37d-cbd3077b878c
else
search --no-floppy --fs-uuid --set=root 2ab18cb4-a23d-4e5c-b37d-cbd3077b878c
fi
echo 'Linux 3.16.0-4-amd64 wird geladen …'
linux /boot/vmlinuz-3.16.0-4-amd64 root=UUID=2ab18cb4-a23d-4e5c-b37d-cbd3077b878c ro rootdelay=20
echo 'Initiale Ramdisk wird geladen …'
initrd /boot/initrd.img-3.16.0-4-amd64
答案1
实际上不是 grub 执行此操作,而是 initramfs。在 Debian 上,默认的 initramfs 实现是在initramfs-tools
包裹。您的 initramfs 能够挂载根文件系统的具体操作取决于许多因素,包括上次调用initramfs
时安装了哪些软件包(软件包可以添加钩子脚本来扩展功能)update-initramfs
以及它们的配置方式。
由于问题似乎是您的 mdraid 设备没有被重建,我怀疑您的mdadm
软件包配置不正确。首先尝试解决这个问题:
sudo dpkg-reconfigure mdadm
之后,initramfs 应该会自动更新。
如果这不能解决问题,并且作为迁移到软件 RAID 的一部分,您创建了一个新文件系统,那么您可能fstab
拥有旧文件系统的 UUID,该 UUID 现在不再与新文件系统匹配。检查一下:
grep $(blkid /dev/md0) /etc/fstab
如果没有产生输出,则进行编辑/etc/fstab
以将根设备指定的 UUID 替换为 的输出blkid /dev/md0
,然后再次运行update-initramfs
。