操作系统开发 - 在disk image上安裝grub2

網上很少關於grub2在disk image上的安裝方法,所以寫這編教程:


Makefile:

dd if=/dev/zero of=hd.img count=20 bs=1047675
./createPartition.sh
kpartx -a hd.img
mkfs.vfat /dev/mapper/loop0p1
mount /dev/mapper/loop0p1 1
mkdir -p 1/boot/grub
cp grub.cfg 1/boot/grub/grub.cfg
cp testing_kernel 1/boot



echo "(hd0) /dev/loop0" > device.map
echo "set prefix=(hd0,msdos1)/boot/grub" > mycfg.cfg
~/grub2/bin/grub-mkimage --config=mycfg.cfg -p /boot -O i386-pc -o 1/boot/grub/core.img loadenv chain biosdisk part_dvh part_msdos msdospart part_gpt exfat ext2 fat vbe vga ntfs echo test configfile minicmd hdparm normal
cp ~/grub2/lib/grub/i386-pc/boot.img 1/boot/grub/
~/grub2/sbin/grub-bios-setup -m device.map -d 1/boot/grub /dev/loop0
sleep 1
umount 1
kpartx -d hd.img


grub.cfg:

set timeout=15
set root=(hd0,msdos1)
#set default=0 # Set the default menu entry
 
menuentry "china ar" {
   insmod ext2
   set root=(hd0,msdos1)
   chainloader +1
#   multiboot /boot/testing_kernel   # The multiboot command replaces the kernel command
#   boot
}


menuentry "OS Name 2" {
   multiboot /boot/testing_kernel   # The multiboot command replaces the kernel command
   boot
}


creeatePartition.sh:

#!/bin/bash




cat <<EOM| fdisk hd.img
n
p
1




t
c
w
EOM


echo ok # you need this line


### 解决 Grub 配置过程中的 `failed to get canonical path` 错误 当执行 `$ sudo update-grub2` 或者运行 `grub-mkconfig` 命令时,如果遇到错误 `/usr/sbin/grub-probe: error: failed to get canonical path of /cow.`[^1],这通常是因为系统正在使用临时文件系统的覆盖层(overlayfs),而 GRUB 工具无法解析这些路径。 #### 可能的原因分析 此问题的根本原因在于某些 Linux 发行版(如 Ubuntu Live CD 或基于 RAM 的环境)会利用 overlay 文件系统来创建可写入的文件系统层。这种机制可能导致 GRUB 探测工具尝试获取设备的实际路径失败[^3]。 --- #### 方法一:禁用 OverlayFS 并重新生成 GRUB 配置 可以通过挂载实际磁盘而非虚拟文件系统的方式解决问题: ```bash sudo mount --bind /dev/sdaX /mnt/target_root_fs sudo grub-install --root-directory=/mnt/target_root_fs /dev/sdY sudo chroot /mnt/target_root_fs update-grub exit ``` 上述命令中: - 将目标分区替换为具体的根文件系统位置(例如 `/dev/sda1` 替代 `/cow` 路径)。 - 使用 `--root-directory` 参数指定真实的根目录而不是临时文件系统。 这种方法可以绕过 overlay 层并直接操作物理存储设备。 --- #### 方法二:修改 GRUB 配置以支持 UUID 标识符 GRUB 默认会在生成启动菜单时通过 UUID 来识别根文件系统[^2]。因此,在配置文件中显式设置 UUID 是一种有效方法。 编辑 GRUB 配置文件 `/etc/default/grub`: ```bash sudo nano /etc/default/grub ``` 找到以下行并将参数更改为如下形式: ```plaintext GRUB_CMDLINE_LINUX_DEFAULT="root=UUID=<your-root-partition-uuid>" ``` 保存更改后更新 GRUB: ```bash sudo update-grub ``` 要查找当前根分区的 UUID,可以运行以下命令: ```bash lsblk -f | grep ext4 # 如果您的文件系统不是 ext4,请调整过滤器。 ``` 或者直接查看 `/proc/mounts` 中的内容以确认根分区的具体 UUID。 --- #### 方法三:切换到非 live 环境下安装 GRUB 对于运行在 LiveCD 上的操作系统而言,由于其依赖于内存中的临时文件系统,可能会频繁触发此类错误。建议将操作系统正式安装至硬盘上后再完成 GRUB 安装流程。 具体步骤包括但不限于: 1. 启动标准安装程序; 2. 执行完整的磁盘分区与格式化; 3. 在新环境中初始化 GRUB--- #### 总结 以上三种方式分别针对不同场景提供了解决方案。优先推荐 **方法一** 和 **方法二**,因为它们能够在现有环境下快速修复问题;而对于长期使用的稳定部署,则应考虑采用 **方法三** 进行彻底迁移。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值