Grub2

在 mdadm RAID1 上引導所需的 GRUB 模組

  • April 14, 2015

我有一個mdadm-managed RAID1,上面有一個 EXT4 分區(其中包含 OS 文件和 GRUB 的文件/boot/grub),我想知道 GRUB 需要哪些模組和哪些配置才能從它啟動。

最低要求grub.cfg如下:

set timeout=1

set root='mduuid/ce16c757e4752e4fa9a2fd4935df1aef'

menuentry 'Arch Linux' {
linux /boot/vmlinuz-linux root=UUID=05dddf23-1d9f-417e-b3f8-2281a328dc0b rw
initrd /boot/initramfs-linux.img
}

是的,這與由 生成的長長的垃圾流有很大不同grub-mkconfig,正如您所看到的,此設置似乎不需要任何模組。

我的特定設置是 MBR 格式化磁碟上的單個分區,我在該磁碟上組裝了 RAID1 陣列和該陣列上的 EXT4 分區。

root變數設置為RAID 陣列mduuid/xxxUUID,您可以通過mdadm --examine /dev/sdX在作為 RAID 陣列一部分的磁碟或分區上執行來獲得該 UUID。這不是 RAID 頂部的 EXT4 文件系統的 UUID,不要使用報告的 UUID,lsblk因為它只會為您提供無法在該處工作的分區的 UUID。

您還可以使用創建時指定的 RAID 陣列標籤將root變數設置為 ( )。有關指定根設備的其他方法,請查看文件md/...``mdadm ... -N "some label" ...

核心參數行上的 UUID 是位於 RAID 陣列頂部的文件系統的 UUID - 可以通過執行以下命令獲得lsblk -o NAME,UUID

NAME                                      UUID
loop0                                     
└─loop0p2                                 ce16c757-e475-2e4f-a9a2-fd4935df1aef
 └─md127                                 05dddf23-1d9f-417e-b3f8-2281a328dc0b
loop1                                     
└─loop1p2                                 ce16c757-e475-2e4f-a9a2-fd4935df1aef
 └─md127                                 05dddf23-1d9f-417e-b3f8-2281a328dc0b

它是對應於mdXXX設備節點的節點——05dddf23-1d9f-417e-b3f8-2281a328dc0b在我的例子中。不要使用底層分區的 UUID -loopXp2在這個例子中。


作為獎勵,如果你想在 QEMU/KVM 虛擬機中試驗 GRUB ,這裡有一些可怕的 shell 腳本可以工作。

要創建一些原始磁碟,它們必須是“原始”才能在主機上掛載,您不能使用 qcow2 或 vmdk :

qemu-img create -f raw driveX.img XXXG # name and size

要使用兩個磁碟、一個 ISO(在本例中是 Archlinux 但它可以是任何東西)和基本網路訪問來啟動 VM:

/path/to/qemu-system-x86_64 -m 512 -cpu host -smp 2,cores=2,sockets=1 -machine q35,accel=kvm -balloon none -device ahci,id=ahci -drive if=none,file=drive1.img,format=raw,cache=none,aio=native,id=hdd1 -device ide-hd,bus=ahci.0,drive=hdd1 -drive if=none,file=drive2.img,format=raw,cache=none,aio=native,id=hdd2 -device ide-hd,bus=ahci.1,drive=hdd2 -drive if=none,file=arch.iso,format=raw,cache=none,aio=native,id=iso,snapshot=on -device ide-cd,bus=ahci.2,drive=iso -device pci-ohci,id=ohci -device usb-kbd,bus=ohci.0 -device usb-mouse,bus=ohci.0 -netdev user,id=net0 -device e1000-82545em,autonegotiation=on,netdev=net0 -realtime mlock=on

在主機上掛載 VM 分區的腳本,確保在執行 QEMU 之前停止它以避免損壞分區:

losetup -P -f drive1.img # create loopback device nodes for the virtual disks
losetup -P -f drive2.img

mdadm --assemble /dev/md/root /dev/loop0p1 /dev/loop1p1 # assemble the RAID
# some distributions will auto-detect and assemble them so it sometimes fails
# running this script a second time usually succeeds in mounting it anyway
# if it failed the first time - I don't have time to fix the real issue

mount "/dev/md/root" rootfs # mount the root FS of the VM in this directory

要解除安裝的腳本,在啟動 VM 備份之前執行它(為了安全起見多次執行):

umount rootfs # umount the FS

mdadm --stop /dev/md127 # sometimes the array appears under these names
mdadm --stop /dev/md126 # so we stop them as well just to be safe
mdadm --stop /dev/md/root # the correct name

losetup -D # detach all loop device nodes

引用自:https://unix.stackexchange.com/questions/196212