所以我编译了我的内核和 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 中的当前 init 脚本:
#!/bin/sh
mount -t sysfs sysfs /sys
mount -t proc proc /proc
mount -t devtmpfs udev /dev
exec /bin/sh
答案1
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>
来允许轻松访问映像文件内的任何分区。