用lsblk -f命令来察看磁盘分区(同时可以得到磁盘的UUID,之后会用到):
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 vfat 9382-DA94 /boot/efi
├─sda2 swap 103456e6-b2de-4201-ba36-06105230948a [SWAP]
├─sda3 ext4 8b65c03b-e92e-4274-a280-857b0c4f54b3 /
├─sda4 ext4 ed12ec55-204b-47e6-bb55-cbf0d69fa824 /home
├─sda5
└─sda6 ntfs OS 021AAF501AAF4011
sdb
└─sdb1 vfat 5BB5-0BFB
sr0
这里的U盘是sdb,只有一个分区sdb1。创建一个文件夹,把要用来存储Grub相关文件的U盘分区挂载到此文件夹上
如:# mount /dev/sdb1 /home/user/usb
安装Grub2,如:# grub--install --force --no-floppy --root-directory=/home/user/usb /dev/sdb (注意这里的参数是U盘,而不是分区)
安装完成之后U盘上已经有了Grub相关的文件,如:
$ tree usb/
usb/
├── archlinux-dual.iso
├── boot
│ └── grub
│ ├── fonts
│ │ └── unicode.pf2
│ ├── grub.cfg
│ ├── grubenv
│ ├── i386-pc
│ │ ├── 915resolution.mod
│ │ ├── zfsinfo.mod
│ │ └── ...
│ ├── locale
│ │ ├── ast.mo
│ │ ├── zh_CN.mo
│ │ └── ...
│ ├── themes
│ │ └── starfield
│ │ ├── blob_w.png│ │ ├── terminal_box_w.png
│ │ └── ...
│ └── x86_64-efi
│ ├── acpi.mod
│ ├── affs.mod
│ └── ...
└── EFI
└── arch
└── grubx64.efi
现在将grub的配置文件复制到U盘的对应目录中,$ "cp /boot/grub/grub.cfg /home/user/usb/boot/grub/grub.cfg"
备份grub的配置文件(这一步可以不进行,不会影响启动U盘的制作):
# mkdir -p /home/user/usb/etc/default
# cp /etc/default/grub /home/user/usb/etc/default
# cp -a /etc/grub.d /home/user/usb/etc
为U盘上的grub添加启动菜单,这里以引导Arch的镜像文件为例:
menuentry "Archlinux-x86_64.iso" --class iso {
set isofile="/archlinux-2013.04.01-dual.iso"
loopback loop (hd0,1)$isofile
linux (loop)/arch/boot/x86_64/vmlinuz archisolabel=Your_label img_dev=/dev/disk/by-uuid/5BB5-0BFB img_loop=$isofile earlymodules=loop
initrd (loop)/arch/boot/x86_64/archiso.img
}
代码很简单,这里的UUID就是上面得到的U盘存储grub相关文件的分区的UUID
当然也可以参考grub的相关文档自己添加启动项
本文根据Arch Wiki的Grub页面(https://wiki.archlinux.org/index.php/GRUB_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29)和此地址(https://blog.icehoney.me/posts/2013-04-25-grub2-boot-from-iso)的文章整理