下面介绍如何在不安装Linux系统的情况下,在U盘上安装grub。之所以这样干是因为我折腾引导的目标之一是制作一个UEFI+BIOS双引导、WinPE&Linux多启动的U盘。
在U盘上安装grub分为如下两步:
下面只涉及UEFI分区U盘上的grub安装方法
准备一个U盘,确保里面没有什么重要数据,插入到一个Linux系统中,下面以Ubuntu为例,U盘在系统中是/dev/sdb
使用fdisk
工具给U盘分区。
需要做如下工作:
fdisk
的话,t
选项,然后选1w
写入修改的内容,下面是结果示例(其他两个分区后面讲解)Disk /dev/sdb: 14.6 GiB, 15707668480 bytes, 30679040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 8F60A66B-D42D-4CC5-BC31-7C2CC9DB78B6
Device Start End Sectors Size Type
/dev/sdb1 2048 6293503 6291456 3G EFI System
/dev/sdb2 6293504 6301695 8192 4M BIOS boot
/dev/sdb3 6301696 18884607 12582912 6G Microsoft basic data
分区建立好之后,需要给分区建立文件系统。
EFI分区的文件系统类型必须是FAT,推荐FAT32。
$ sudo mkfs.fat -F 32 /dev/sdb1
挂载EFI分区到系统,并且新建一个boot
目录
# mount /dev/sdb1 /mnt
# mkdir /mnt/boot
调用grub-install
$ sudo grub-install --efi-directory=/mnt --boot-directory=/mnt/boot --removable /dev/sdb
注意上面是/dev/sdb
,是整个磁盘设备,而不是分区/dev/sdb1
上面命令执行之后,生成/mnt/EFI/boot/bootx64.efi
,系统启动时会调用这个EFI application,其实就是grub。
同时会在/mnt/boot/grub/
生成grub相关文件,其中包括配置文件grub.cfg
。
解释一下几个参数的含义:
--efi-directory
指明了存放EFI application的位置。
--boot-directory
指明用于存放grub相关文件的位置。
--removable
如果不加这个参数,grub的efi文件就会被放到/EFI/<对应系统>/grubx64.efi
,比如/EFI/ubuntu/grubx64.efi
。如果加上,就会直接放到/EFI/boot/bootx64.efi
为了兼容BIOS,我们需要再分一个分区,用于存放grub,同时标记为Boot Partition
,分区的结果如下:
Device Start End Sectors Size Type
/dev/sdb1 2048 6293503 6291456 3G EFI System
/dev/sdb2 6293504 6301695 8192 4M BIOS boot
然后再调用grub-install安装,同样安装的时候把存放grub相关文件的分区(这里就是EFI分区)挂载上
$ sudo grub-install --boot-directory=/mnt/boot --target=i386-pc /dev/sdb
到这U盘就被分成了两个分区,剩余空间当然是想怎么用就怎么用,比如完全可以分一个区用来装普通文件,这样U盘既能当启动盘,又能方便地存储数据,不会像烧录ISO那样烧了就不能存别的东西了。
上面简单说了下如何在U盘中安装grub,使得U盘可引导,这为接下来使用grub启动其他系统(比如说WinPE和Ubuntu)提供了条件。