Libreboot 在 X60 上的应用,第三部分:修改启动菜单
在本系列第一篇文章中,我解释了 Libreboot 自由软件 BIOS 项目背后的基本原理,以及您可能想要用它替换 BIOS 的原因。我在后续文章中描述了如何在 ThinkPad X60 上安装 Libreboot。在本系列的最后一篇文章中,我将解释如何执行一个至今我尚未解释的主要任务:如何修改默认的 GRUB 启动菜单。
传统的 BIOS 为用户提供了一个配置菜单,用户可以在其中更改启动顺序并启用和禁用设备。通常,键盘上会有一个指定的按键(Esc、F11 和 F12 很常见),这样您就可以选择您的启动设备,而不是使用默认顺序。使用 Libreboot,所有设备设置都在 ROM 本身内部设置,您可以使用 GRUB 菜单来选择启动设备。
现有的 GRUB 菜单提供了许多常见的启动选项,这些选项有望在您的系统上工作。默认菜单项尝试从第一个分区启动,之后,还有选项可以启动可移动设备,最后还有一个选项可以搜索和加载硬盘驱动器上可能存在的任何本地 GRUB 配置。理想情况下,这个默认菜单应该足够了,但在某些情况下(例如启动 Tails USB 磁盘),可能需要进行一些调整。
一方面,如果您熟悉 GRUB 命令,您可以使用正确的咒语在运行时启动几乎任何您想要的设备。另一方面,每次您想要启动某些内容时都输入 GRUB 命令可能很痛苦,因此如果您发现自己调整默认菜单项来启动特殊设备,您可能想要更永久地修改 GRUB 菜单。
我建议您直接从 GRUB 启动菜单中试验示例 GRUB 配置更改,因为它允许您直接编辑任何菜单项的配置。这样,您可以快速测试任何示例更改,而无需经历写入和刷新新 ROM 的完整过程。一旦您知道您想要进行的更改,您就可以开始使其永久生效。
设置如果您已经按照本系列的前两篇文章进行操作,您应该已经下载并验证了 Libreboot 二进制文件,并在 X60 上安装了 Libreboot。让我们从这一点开始,打开终端并切换到包含所有 Libreboot 二进制文件、ROM 和支持脚本的 libreboot_bin 目录。您在设置 Libreboot 时应该已经安装了 Libreboot 构建依赖项,但如果没有,如果您使用的是基于 Debian 或基于 Arch 的发行版,请首先运行 deps-trisquel 或 deps-parabola 脚本。如果您使用的是其他发行版,请检查这些脚本安装的软件包,并将它们映射到您的发行版的软件包名称。
Libreboot ROM 实际上包含一个名为 CBFS 的小型文件系统,因此要编辑它,您需要安装 cbfstool 二进制文件。在 libreboot_bin 目录中有一个名为 builddeps-cbfstool 的脚本,因此运行该脚本,您应该会在 libreboot_bin 下看到出现 cbfstool 和 rmodtool 二进制文件
$ ./builddeps-cbfstool
修改 ROM
一旦 cbfstool 安装完成,下一步是选择要修改的 ROM,以便您可以查看其中的文件并提取 GRUB 配置的副本。对于本示例,我将使用 Libreboot 本身提供的 ROM 之一。首先,运行 cbfstool
以及 ROM 的路径和 print
参数。print
参数将列出 ROM 内的所有文件
$ ./cbfstool bin/x60/libreboot_usqwerty_vesafb.rom print
libreboot_usqwerty_vesafb.rom: 2048 kB, bootblocksize 1424,
↪romsize 2097152, offset 0x0
alignment: 64 bytes, architecture: x86
Name Offset Type Size
cmos_layout.bin 0x0 cmos_layout 1788
cmos.default 0x740 cmos_default 256
fallback/romstage 0x880 stage 50924
fallback/ramstage 0xcfc0 stage 81695
fallback/payload 0x20f40 payload 541644
etc/ps2-keyboard-spinup 0xa5380 raw 8
config 0xa53c0 raw 4504
background.jpg 0xa6580 raw 67907
dejavusansmono.pf2 0xb6f00 raw 100513
grub.cfg 0xcf800 raw 1637
grubtest.cfg 0xcfec0 raw 1629
(empty) 0xd0580 null 1242264
如您所见,有两个不同的 GRUB 配置文件:grub.cfg 和 grubtest.cfg。前者是加载的默认 GRUB 配置,后者可以由前者加载以测试新配置。事实是,如果您在 GRUB 配置中犯了一些重大错误,您可能会将自己锁定在系统之外(或至少使其非常困难),因此以安全的方式验证您的更改非常重要。推荐的工作流程是首先修改 grubtest.cfg,更新 ROM 并用它刷新您的 BIOS,然后在 GRUB 菜单中选择加载 grubtest.cfg 的选项。然后,您可以在将相同的更改复制到 grub.cfg 之前验证您的配置是否有效。
考虑到这一点,首先使用 cbfstool
提取 grubtest.cfg 文件
$ ./cbfstool bin/x60/libreboot_usqwerty_vesafb.rom extract
↪-n grubtest.cfg -f grubtest.cfg
在这里,您没有传递 print
,而是将 extract
命令传递给 cbfstool
以及两个新参数。-n
选项指定要提取的 CBFS 文件系统中的文件名,-f
选项指定本地文件系统上文件副本的名称。由于 grub.cfg 文件引用了这个特定的文件名,因此最好保持它不变。
grubtest.cfg 将在文件顶部包含许多 GRUB 设置,但更有趣的设置将在 menuentry
部分中找到
menuentry 'Load Operating System' {
set root='ahci0,msdos1'
linux /vmlinuz root=/dev/sda1
initrd /initrd.img
}
menuentry 'Parse ISOLINUX menu (USB)' {
set root='usb0'
syslinux_configfile -i (usb0)/isolinux/isolinux.cfg
}
menuentry 'Parse ISOLINUX menu (CD)' {
set root='ata0'
syslinux_configfile -i (ata0)/isolinux/isolinux.cfg
}
例如,以上三个部分分别用于启动来自第一个磁盘、USB 磁盘和 CD 的 Linux 内核的菜单项。例如,如果您发现您的根分区不是 /dev/sda1 而是 /dev/sda2,您将编辑第一个 menuentry
部分以反映这一点。在我的情况下,我注意到 1.3 版本之前创建的 Tails live USB 磁盘需要一组特殊的启动选项。经过一些实验,我想出了以下 GRUB 添加
menuentry 'Tails (USB)' {
set root='usb0,gpt1'
syslinux_configfile -i (usb0,gpt1)/syslinux/live486.cfg
}
快速警告
一旦您进行了更改,就该将修改后的 grubtest.cfg 复制到您的 ROM 了。如果您使用的是标准 Libreboot ROM 之一,我建议首先为您的更改制作一个副本。这很重要,因为默认的 Libreboot ROM 是使用 ROM 的特定空白部分创建的,以便与初始刷新良好配合。我个人通过尝试使用我的自定义 ROM 首次刷新而使 X60 变砖,因此保留原始 ROM 的完整性是值得的
$ cp bin/x60/libreboot_usqwerty_vesafb.rom
bin/x60/libreboot_usqwerty_vesafb-custom.rom
现在从您的自定义 ROM 中删除旧的 grubtest.cfg,并使用 print
命令确认它不再存在
$ ./cbfstool bin/x60/libreboot_usqwerty_vesafb-custom.rom remove
↪-n grubtest.cfg
$ ./cbfstool bin/x60/libreboot_usqwerty_vesafb-custom.rom print
libreboot_usqwerty_vesafb-custom.rom: 2048 kB,
↪bootblocksize 1424, romsize 2097152, offset 0x0
alignment: 64 bytes, architecture: x86
Name Offset Type Size
cmos_layout.bin 0x0 cmos_layout 1788
cmos.default 0x740 cmos_default 256
fallback/romstage 0x880 stage 50924
fallback/ramstage 0xcfc0 stage 81695
fallback/payload 0x20f40 payload 541644
etc/ps2-keyboard-spinup 0xa5380 raw 8
config 0xa53c0 raw 4504
background.jpg 0xa6580 raw 67907
dejavusansmono.pf2 0xb6f00 raw 100513
grub.cfg 0xcf800 raw 1637
(empty) 0xcfec0 deleted 1688
(empty) 0xd0580 null 1242264
现在您已准备好添加您的自定义版本,并使用 print
命令确认它存在
$ ./cbfstool bin/x60/libreboot_usqwerty_vesafb-custom.rom
↪add -n grubtest.cfg -f grubtest.cfg -t raw
$ ./cbfstool bin/x60/libreboot_usqwerty_vesafb-custom.rom print
libreboot_usqwerty_vesafb-custom.rom: 2048 kB, bootblocksize 1424,
↪romsize 2097152, offset 0x0
alignment: 64 bytes, architecture: x86
Name Offset Type Size
cmos_layout.bin 0x0 cmos_layout 1788
cmos.default 0x740 cmos_default 256
fallback/romstage 0x880 stage 50924
fallback/ramstage 0xcfc0 stage 81695
fallback/payload 0x20f40 payload 541644
etc/ps2-keyboard-spinup 0xa5380 raw 8
config 0xa53c0 raw 4504
background.jpg 0xa6580 raw 67907
dejavusansmono.pf2 0xb6f00 raw 100513
grub.cfg 0xcf800 raw 1637
grubtest.cfg 0xcfec0 raw 1629
(empty) 0xd0580 null 1242264
刷新 BIOS
Now you can flash your BIOS with the modified ROM. You can use the flashrom utility that's included inside your Libreboot binary directory. If you are running this from the same system you used to install Libreboot in the first place, you already should have flashrom built and available. Otherwise, if you are running this from a system like Tails, or if you haven't yet installed flashrom, first run thebuilddeps-flashrom
script from the base of the libreboot_bin directory as root. When you are ready to flash your BIOS, make sure you are in the libreboot_bin directory and run:$ sudo ./flashrom/flashrom -p internal -w bin/x60/libreboot_usqwerty_vesafb-custom.rom flashrom v0.9.7-unknown on Linux 3.16.0-4-586 (i686) flashrom is free software, get the source code at ↪http://www.flashrom.org Calibrating delay loop... delay loop is unreliable, trying ↪to continue OK. coreboot table found at 0xcf6bd000. Found chipset "Intel ICH7M". Enabling flash write... OK. Found Macronix flash chip "MX25L1605D/MX25L1608D/MX25L1673E" ↪(2048 kB, SPI) mapped at physical address 0xffe00000. Reading old flash chip contents... done. Erasing and writing flash chip... Erase/write done.
Of course, replace the above ROM with the full path to your custom ROM. Once the flash succeeds, reboot your machine and at the boot menu, select the menu item that switches you to your custom grubtest.cfg. You then should see whatever changes you made, and you can attempt to boot from them. If everything works as expected, you are ready to make it the default. If not, especially if your changes made GRUB not work at all, just be glad it's the test file. You've been given a second chance to iterate through grubtest.cfg until it does work, and then you can move on.
Warning: make sure before you move on from here that you have completely tested your grubtest.cfg changes and everything works as expected.
Edit the Default MenuBoot back in to your system and go back to your working directory. Since grubtest.cfg works, the next step is to create a copy of it named grub.cfg that you will use as the default GRUB config. The official Libreboot documentation for the GRUB menu lists this following sed script that will do all of the work of creating a grub.cfg based on your grubtest.cfg, but it will change the menu entries to make sure they still reference grubtest.cfg and grub.cfg where appropriate (be sure to run this in the directory that contains your custom grubtest.cfg):
$ sed -e 's:(cbfsdisk)/grub.cfg:(cbfsdisk)/grubtest.cfg:g' ↪-e 's:Switch to grub.cfg:Switch to grubtest.cfg:g' ↪< grubtest.cfg > grub.cfg
Now you can repeat the steps you performed to delete and re-add grubtest.cfg from the ROM, only this time with grub.cfg:
$ ./cbfstool bin/x60/libreboot_usqwerty_vesafb-custom.rom ↪remove -n grub.cfg $ ./cbfstool bin/x60/libreboot_usqwerty_vesafb-custom.rom print $ ./cbfstool bin/x60/libreboot_usqwerty_vesafb-custom.rom add ↪-n grub.cfg -f grub.cfg -t raw $ ./cbfstool bin/x60/libreboot_usqwerty_vesafb-custom.rom print
Confirm that grub.cfg has been added properly to your ROM, and then flash your BIOS with the new custom ROM:
$ sudo ./flashrom/flashrom -p internal -w bin/x60/libreboot_usqwerty_vesafb-custom.rom
Once you reboot, you should be able to use your new modified GRUB menu. Just be sure to take the extra steps of validating changes with grubtest.cfg first each time you do this—you wouldn't want to get locked out of your system!