2019-01-23 11:28:41
本文意在通过Ubuntu 16.04 的ISO 制作一个支持UEFI 启动的Ubuntu To Go U盘。
之前参考了别的文章,成功做成了同时支持Bios 和UEFI 的U 盘系统,但需要联网才能安装EFI 的Grub2。
个人觉得ISO 文件本身就支持UEFI,何不直接从镜像文件提取启动文件。
通过摸索,提取了ISO 中的EFI 文件夹,使用strings EFI/grubx64.efi 查看其源码,发现它会读取EFI 盘根目录下的/boot/grub/grub.cfg 配置文件,从而得到启发总结出了以下制作步骤。
http://releases.ubuntu.com/xenial/ubuntu-16.04.5-desktop-amd64.iso
http://www.diskgenius.cn
http://haozip.2345.cc/
以我的Chipfancier 256GB 为例,使用DiskGenius 设置为GPT 类型,分区如下
大小 | 格式 | 备注 |
---|---|---|
200MB | FAT32 | EFI 区分 |
100GB | EXT4 | Ubuntu 安装于此,挂载根目录/ |
133GB | exFat | 用于储存文件,exFat 格式通用于Windows、MacOSX、Linux |
2GB | FAT32 | 存放安装盘ISO,Grub2 引导的iso 文件只能在Fat32 |
另外,64GB U 盘用MBR 类型,建议分区如下,安装完毕后可间第三个分区合并到第二分区
大小 | 格式 | 备注 |
---|---|---|
200MB | FAT32 | 主分区,激活,EFI 区分 |
50GB | EXT4 | 主分区,Ubuntu 安装于此,挂载根目录/ |
2GB | FAT32 | 主分区,存放安装盘ISO |
** 用解压软件将ubuntu-16.04.5-desktop-amd64.iso 下的EFI 文件夹整个拷到第一个分区 **
# EFI 文件夹应该包含以下内容
# UEFI 系统会搜索所有FAT32 磁盘根目录下的EFI/BOOT/BOOTx64.efi(不分大小写)
|____EFI
|____BOOT
|____BOOTx64.EFI <-- 由shimx64.efi 改名而来,针对主板开启了SecureBoot
|____grubx64.efi <-- 如果关闭了SecureBoot 可直接将grubx64.efi 改名为bootx64.efi
** 在第一个分区创建/boot/grub/grub.cfg,里面包含了启动Ubuntu 的命令,但装完系统后修改完才能用 **
set timeout=10
menuentry "Ubuntu 16.04 LTS" {
set uuid=0dcc1a29-32ad-4c59-a14d-ab0d9b3c1c00
search --no-floppy --fs-uuid --set=ubdisk $uuid
#search.fs_uuid $uuid ubdisk # same as above
set root=($ubdisk)
linux /boot/vmlinuz-4.15.0-29-generic root=UUID=$uuid
initrd /boot/initrd.img-4.15.0-29-generic
}
submenu "Others" {
menuentry "Reboot" {
reboot
}
menuentry "Halt" {
halt
}
}
** 在最后一个分区创建ISO 文件夹,将ubuntu-16.04.5-desktop-amd64.iso 拷入ISO,并创建/ISO/set-hdisk-source.txt,其内容是引导U 盘上iso 文件的命令 **
set isofile=/ISO/ubuntu-16.04.5-desktop-amd64.iso
loopback loop $hdisk$isofile
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash
initrd (loop)/casper/initrd
boot
** 最终形成的文件系统树状图 **
|____第一分区,即EFI 分区
| |____EFI
| | |____BOOT
| | |____BOOTx64.EFI
| | |____grubx64.efi
| |____boot
| |____grub
| |____grub.cfg
|____最后分区,即保存ISO 的分区
| |____ISO
| |____ubuntu-16.04.5-desktop-amd64.iso
| |____set-hdisk-source.txt
ls # 查看当前有哪些盘符,例如存放iso 的磁盘是(hd0,gpt4)
ls (hd0, # 这时候按Tab 键会有提示,该硬盘下有哪些分区,以及分区的UUID 及格式类型等信息
通过以下命令引导U盘上的iso 文件,FAT32 会将一切字母变成小写,source 相当于读取了一个批处理文件
set hdisk=(hd0,gpt4)
source $hdisk/iso/set-hdisk-source.txt
sudo -s # 切换到root 用户
umount -l /isodevice # 卸载iso 挂载的盘符,否则无法对U 盘进行写入操作
ubiquity --no-bootloader # 千万不要用桌面的安装图标直接安装,否则UEFI 引导文件会被修改
fdisk -l # 查找U 盘的设备名,通过分区类型及数量判断,例如/dev/sdb
blkid | grep sdb # 查看各个磁盘的UUID,主要关注U 盘的第一、第二个分区的UUID
mount /dev/sdb2 /mnt
mount /dev/sdb1 /mnt/boot/efi
vi /mnt/etc/fstab # 将最后一行的UUID 改成U 盘第一个盘即EFI 分区的UUID
# /etc/fstab 最后一行影响的是新系统/boot/efi 目录的挂载
# Ubuntu 在安装的时候会将Windows 的ESP 分区挂载到/boot/efi
# 在MacBook 上启动报错就是因为/boot/efi 挂载的设备不存在
# 所以,将/boot/efi 挂载点设置为U 盘就不会找不到设备了
vi /mnt/boot/efi/boot/grub/grub.cfg # 将set uuid=U盘第二个盘即Ext4 分区的UUID
# 这里设置的是告诉Grub2,Ubuntu 的安装位置,UUID 是磁盘的唯一标识,除非格式化才会改变
# 以上vi 都修改完文件后卸载挂载的磁盘并重启系统
umount /mnt/boot/efi
umount /mnt
init 6 # 重启系统
关闭电脑后,拔掉U 盘,在安装过程中,Ubuntu 还是向UEFI 写了点东西,以我的X270 原系统Windows8.1 为例。
进入Windows 用DiskGenius 浏览ESP 分区,并将EFI 文件夹下的ubuntu 文件夹删除即可。
https://www.littleqiu.net/archives/771
https://zhuanlan.zhihu.com/p/27871019
https://medium.com/@mmiglier/ubuntu-installation-on-usb-stick-with-pure-efi-boot-mac-compatible-469ad33645c9
https://askubuntu.com/questions/500295/booting-ubuntu-iso-file-from-grub-menu
https://stackoverrun.com/cn/q/9723219
https://askubuntu.com/questions/784928/install-ubuntu-to-usb-drive-and-boot-it-to-uefi-and-bios-system