所以我编译了我的内核和 initrd。然后我如何创建一个图像并安装 grub 以实际从磁盘加载这个图像?我的目标不是用它创建一个可从 USB 启动的 livecd,因为有很多关于它的文章。我的目标是创建一个映像(我知道dd if=/dev/zero of=linux.img ...
我需要创建一个整体映像)并使用 dd 将该映像简单地写入磁盘的第一个扇区,然后让它从那里启动。但是,我的内核和 initrd 在那个 img 中放在哪里?就在彼此身后?该磁盘不会有任何分区。它是一个自定义内核和被剥离的最小 busybox 设置。因此,我不需要 /boot 分区,并且所有“文件”都不会存在于另一个分区上,因为不会有一个或很多文件。
我知道 MBR 是 512 字节,我假设grub
也只是将 512 字节覆盖到第一个扇区。但是我怎样才能在图像上安装 grub 呢?甚至会grub-install linux.img
工作?我知道知道grub
从正常设置中加载内核和 initrd 的位置,因为它们位于 /boot 中,但此“映像”上没有要查看的分区/boot
。我只是将 root 设置为自身吗?
任何帮助,将不胜感激
initrd创建过程:https://pastebin.com/ti9LXakx
initrd 中的当前初始化脚本:
#!/bin/sh
mount -t sysfs sysfs /sys
mount -t proc proc /proc
mount -t devtmpfs udev /dev
exec /bin/sh
512 字节对于 GRUB 来说太少了:在经典的 BIOS 引导的 MBR 分区磁盘上,GRUB 还将其自身的一部分放置在通常未使用的块 #1..#2047 中,因为现代操作系统将第一个分区的开头准确放置从磁盘开始的 1 MiB,位于块 #2048。通常它可能会使用大约 100 个这样的块,这取决于选择将哪些功能构建到 GRUB 核心映像中以及将哪些功能作为 GRUB 模块(从某些文件系统)加载。
而且您甚至没有获得 MBR 块(块 #0)中的所有 512 个字节:至少,MBR 块末尾的两个字节被告诉 BIOS 该磁盘可引导的签名占用。
GRUB 有一个内置的期望,即它在其上找到其配置文件、内核和 initrd 的磁盘/分区/逻辑卷/加密卷包含某种文件系统。如果你想通过从磁盘读取连续的块来读取内核和 initramfs,这听起来更像是古老的 LILO 引导加载程序所做的......我想知道它是否仍然适用于现代内核?
简而言之,省去分区表并不是你认为的优势。使用自定义配置,您可以让 GRUB 读取块 #A .. #B 作为内核,#(B+1).. #C 作为 initramfs 文件,但这只会让您自己的生活更加困难好理由。
并且由于您提到了 Live CD,如果您希望您的映像在刻录到 CD-ROM/DVD 或用作虚拟机中的虚拟 CD 时也能正常工作,您必须创建一个混合映像,它既可以作为 HDD 映像使用MBR 中的引导加载程序,以及带有 El Torito 引导扩展的有效 ISO9660 CD/DVD 映像——这需要在映像的不同位置有一个单独的引导加载程序。
如果你想要 UEFI 兼容性......“你必须忘掉你学到的东西。”
使用 UEFI,系统固件将期望找到一个 FAT 文件系统(最好是 FAT32,但其他形式的 FAT 也可以用于较新版本的 UEFI),并且引导加载程序作为该文件系统中具有特定名称的文件。由于文件系统已经存在以满足 UEFI 可启动性的固件要求,您不妨使用它来将内核、initramfs 和引导加载程序的配置作为常规文件放在其中。
要创建您的映像,您可以使用
losetup
将其绑定到/dev/loop<device_number>
设备,之后您可以像使用真正的磁盘一样使用该设备。如果图像包含分区表,您可以使用losetup -P
自动创建表格的分区设备/dev/loop<device_number>p<partition_number>
,以便轻松访问图像文件中的任何分区。