我正在尝试准备一个可以写入磁盘或使用 PXE 启动的映像。
一些背景信息:我创建了一个映像,使用 sfdisk(MBR)对其进行分区,为整个磁盘和主分区创建循环设备,将主分区格式化为 ext4,挂载它并使用 debootstrap 安装基本系统 + 内核和 grub-pc 包,然后生成 initramfs,将 dev、proc 和 sys 挂载到分区根目录并安装 grub。
fdisk -l
/dev/loop0(整个图像的循环设备)的输出:
Disk /dev/loop0: 1,1 GiB, 1211572224 bytes, 2366352 sectors
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: 0xfdf8e68d
Device Boot Start End Sectors Size Id Type
/dev/loop0p1 * 2048 2097151 2095104 1023M 83 Linux
/dev/loop0p2 2097152 2359295 262144 128M 82 Linux swap / Solaris
Grub 安装命令:
chroot $ROOT grub-install --target=i386-pc /dev/loop0
chroot $ROOT update-grub
Grub 配置似乎已正确生成,并且检测到了内核和 initramfs。但是当我尝试使用生成的映像启动系统时,grub2 找不到任何分区:
Loading boot sector... booting...
error: no such device: some-file-system-UUID
error: unknown filesystem.
Entering rescue mode...
grub rescue> ls
(hd0)
grub rescue> insmod ext2
grub rescue> ls
(hd0)
我的 grub 安装步骤可能出了什么问题?为什么 grub2 看不到 fdisk 输出中存在的分区?
PS:BIOS 设置为传统模式。我还用 kvm 测试了我的图像,结果完全相同。
答案1
这可能太晚了,但对我来说,我需要使用以下方法挂载 /dev/loopX 分区
losetup -P -n /dev/loop0 test.img
这样就创建了一个 /dev/loop0p1,我可以在上面挂载并安装 grub。你还应该确保已经在镜像中安装了 Linux 内核,如下所示:
sudo chroot /mnt apt-get install linux-image
然后就可以在/dev/loop0上重新安装grub并update-grub
成功运行了。