GRUB2 实用技巧

优质
小牛编辑
133浏览
2023-12-01

如何给GRUB2菜单加上背景图?

首先制作一张PNG格式的图片,分辨率最好是"1024x768"以保证较好的兼容性。然后将这张图片放到"$prefix/themes/1024x768.png"("$prefix"是GRUB2的安装目录)。然后在'grub.cfg'中加入如下内容:

set gfxmode=1024x768,auto
insmod gfxterm
insmod png
terminal_output  gfxterm
background_image $prefix/themes/1024x768.png

如何让GRUB2显示中文界面(包括显示中文菜单项)?

由于GRUB2在内部使用UTF-8编码,并且所有文本文件(包括'grub.cfg')也都被假定为使用UTF-8编码,为了避免乱码,请务必以UTF-8编码保存'grub.cfg'文件。

set gfxterm_font=unicode
set lang=zh_CN
set locale_dir=$prefix/locale
insmod gfxterm
terminal_output  gfxterm
loadfont unicode

如何更改GRUB2的字体?

如果你认为默认的unicode字体在1024x768或更高分辨率的屏幕上显得太小,或者你认为默认的字体不好看,想换换口味,那么如何自己动手制作一个pf2字体呢?那就要用到"grub-mkfont"工具。下面的示例展示了如何从一个ttc字体(文泉驿等宽微米黑)制作一个24px大小的pf2字体:

grub-mkfont -i1 -n WenQuanYiMicroHeiMono24px -o WenQuanYiMicroHeiMono24px.pf2 -s24 -v wqy-microhei.ttc

将制作好的字体文件(WenQuanYiMicroHeiMono24px.pf2)放到"$prefix/fonts"目录中,修改'grub.cfg'文件中的两行:

set gfxterm_font=WenQuanYiMicroHeiMono24px
loadfont WenQuanYiMicroHeiMono24px

[注意]你最好使用等宽中文字体(推荐使用文泉驿等宽正黑或者等宽微米黑),否则可能会让GRUB2的字体间距过大,十分难看。

如何使用GRUB2引导WindowsPE的ISO文件?

GRUB4DOS有一个非常酷的'磁盘映射'功能,能够用于启动WinPE的ISO文件。其实,将GRUB2配合MEMDISK工具使用,同样可以引导各种映像文件,包括ISO文件与软/硬盘映像。

首先,你必须安装或者下载"syslinux"软件包,从中提取出"memdisk"文件(可能位于'/usr/share/syslinux/memdisk'或'bios/memdisk/memdisk'),然后将它复制到GRUB2的安装目录中(本文假定其位于"winpe"子目录中,也就是"$prefix/winpe/memdisk")。

然后,将你想要引导的WindowsPE的ISO文件放到某个地方(本文假定其位于"$prefix/winpe/WinPE.ISO")。当然,为了节约磁盘空间,你也可以用gzip对ISO文件进行压缩,不过这个示例中没有这么做。

最后,在'grub.cfg'中加入如下菜单项(如果你对ISO进行了gzip压缩,那么还需要额外再加上"insmod gzio"命令):

menuentry "[BIOS] Windows PE" --unrestricted {
  linux16  $prefix/winpe/memdisk iso raw
  initrd16 $prefix/winpe/WinPE.ISO
}

[注意]与GRUB4DOS一样,由于MEMDISK对各种映像文件的模拟是通过在实模式下拦截BIOS的 INT 13h 与 INT 15h 调用来实现的,所以有很大的局限性:

  • 只能用于BIOS模式启动,不能用于UEFI模式启动
  • 模拟出来的软盘/光盘/硬盘设备只能被基于实模式的操作系统所识别(DOS,FreeDOS),不能被基于保护模式的操作系统所识别(Windows,Linux,BSD)
  • 从实用的角度来说,只能用于引导WinPE的ISO以及基于DOS/FreeDOS的映像,不能用于引导各种Linux的LiveCD ISO以及微软原版的Windows ISO安装光盘。

[释疑]不要将MEMDISK与GRUB2的"memdisk.mod"模块混淆,他们是两个毫不相干的东西。"memdisk.mod"模块的作用是为'core.img'提供内存盘支持,其目的是为了让GRUB2能够正确识别启动设备。如果把'core.img'比作Linux内核,那么"memdisk.mod"模块的作用就相当于为'core.img'这个"内核"提供了'initramdisk',用以加载磁盘与文件系统驱动,从而让GRUB2可以访问磁盘,进而加载其他的模块。但是实际上,在绝大多数情况下,更本不需要使用"memdisk.mod",因为在'grub-install'的时候,这些驱动已经被嵌入到'core.img'中了。如果你还是不明白"memdisk.mod"模块的作用的话,那就忘记它的存在吧,因为你更本不需要知道有这个东西,就像你不需要了解全部GRUB2模块一样。仅仅是因为这两个东西的名字相同,我才在这里多罗嗦了几句而已。

如何使用GRUB2引导WindowsPE的WIM文件?

由于GRUB2不能在UEFI模式下对ISO文件进行仿真,那么我们应该如何在UEFI模式下引导WindowsPE呢?答案是必须使用WIM格式的WindowsPE。
具体说来就是首先用GRUB2链式加载微软的"bootmgfw.efi"引导管理器,然后再由"bootmgfw.efi"根据BCD文件的指引去启动WindowsPE。

第一步,从例如"微PE"这样的作品中提取"WEPE64.WIM"与"WEPE.SDI"(BOOT.SDI)文件。
第二步,从Win10的原版安装光盘中提取"bootmgfw.efi"文件(/efi/boot/bootx64.efi)。
第三步,将提取的三个文件放置到一个FAT32或NTFS磁盘分区上,这里假定放到'(hd0,gpt3)/winpe/'目录中。
第四步,仿照下面的命令序列编写一个BCD文件:

bcdedit /createstore  BCD

bcdedit /store BCD /create {dddddddd-dddd-dddd-dddd-dddddddddddd} /device
bcdedit /store BCD /set {dddddddd-dddd-dddd-dddd-dddddddddddd} RAMDISKSDIDEVICE BOOT
bcdedit /store BCD /set {dddddddd-dddd-dddd-dddd-dddddddddddd} RAMDISKSDIPATH "\winpe\WEPE.SDI"

bcdedit /store BCD /create {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} /d "UEFI Windows PE x64" /application OSLOADER
bcdedit /store BCD /set {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} DEVICE RAMDISK=[BOOT]\winpe\WEPE64.WIM,{dddddddd-dddd-dddd-dddd-dddddddddddd}
bcdedit /store BCD /set {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} HIGHESTMODE YES
bcdedit /store BCD /set {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} OSDEVICE RAMDISK=[BOOT]\winpe\WEPE64.WIM,{dddddddd-dddd-dddd-dddd-dddddddddddd}
bcdedit /store BCD /set {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} SYSTEMROOT "\Windows"
bcdedit /store BCD /set {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} WINPE YES
bcdedit /store BCD /set {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} LOCALE "zh-CN"
bcdedit /store BCD /set {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} NX OptIn
bcdedit /store BCD /set {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} PAE ForceEnable
bcdedit /store BCD /set {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} detecthal Yes
bcdedit /store BCD /set {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} DEBUGSTART DISABLE
bcdedit /store BCD /set {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} RECOVERYENABLED NO
bcdedit /store BCD /bootems {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} OFF
bcdedit /store BCD /ems {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} OFF
bcdedit /store BCD /bootdebug {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} OFF
bcdedit /store BCD /debug {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} OFF
bcdedit /store BCD /event {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa} OFF

bcdedit /store BCD /create {bootmgr} /d "Windows PE Boot Manager"
bcdedit /store BCD /set {bootmgr} DEVICE BOOT
bcdedit /store BCD /set {bootmgr} LOCALE "zh-CN"
bcdedit /store BCD /set {bootmgr} nointegritychecks Yes
bcdedit /store BCD /displayorder {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa}
bcdedit /store BCD /default {aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa}
bcdedit /store BCD /timeout 10
第五步,将生成的BCD文件同样放置到'(hd0,gpt3)/winpe/'目录中。
最后,在'grub.cfg'中加入如下菜单项:

menuentry 'UEFI Windows PE Boot Manager' --unrestricted {
  chainloader (hd0,gpt3)/winpe/bootmgfw.efi
}

如何使用GRUB2引导(硬盘安装) Gentoo LiveCD 的ISO文件?

以"install-amd64-minimal-*.iso"为例。
第一步,将ISO中的'/boot/{gentoo,gentoo.igz}'、'/image.squashfs'三个文件放到'(hd0,gpt3)/os/gentoo/'目录中;
第二步,将ISO中的'/livecd'放到相同分区(hd0,gpt3)的根目录下;
最后,在'grub.cfg'中加入如下菜单项:

menuentry "Gentoo Minimal Install LiveCD" --unrestricted {
  linux  (hd0,gpt3)/os/gentoo/gentoo cdroot looptype=squashfs loop=/os/gentoo/image.squashfs
  initrd (hd0,gpt3)/os/gentoo/gentoo.igz
}

[提示]'livecd'是寻找'image.squashfs'所在磁盘分区的关键。

[提示] Gentoo LiveCD 亦可使用与其他Linux发行版的LiveCD类似的方法启动(也就是使用"isoboot="参数)。

如何使用GRUB2引导(硬盘安装)各种 Linux LiveCD 的ISO文件?

首先需要说明的是,这里给出的方法,只适用于提供了"img_loop="或"iso-scan/filename="或"fromiso="或"isoboot="或"isoloop="之类参数的LiveCD。

下面以 Ubuntu 的 LiveCD 为例说明。首先,假定你将ISO文件放在'(hd0,gpt3)/ISO/Ubuntu.iso';然后,在'grub.cfg'中加入如下菜单项:

menuentry "Ubuntu LiveCD" --unrestricted {
  loopback loop0 (hd0,gpt3)/ISO/Ubuntu.iso
  linux  (loop0)/casper/vmlinuz boot=casper iso-scan/filename=/ISO/Ubuntu.iso
  initrd (loop0)/casper/initrd.lz
}

[说明]这里给出的方法,其实就是各种"硬盘安装 XX Linux"的翻版,只不过不再需要将"vmlinuz"与"initrd"从ISO中解压出来而已。

更多其它发行版的实例,请继续阅读下面的内容。