64位UEFI下的Grub2和rEFInd引导多启动移动硬盘(MacOS + Win10 + Win11 + Ubuntu + Fedora + OpenSUSE + Archlinux + Gentoo + Debian + RHEL + SLES)

最近研究了一下如何制作多启动移动硬盘,其中包含的操作系统有2个MacOS安装盘,Win10安装盘,Win11安装盘,Ubuntu,Fedora,OpenSUSE,Archlinux,Gentoo,Debian,RHEL,SLES。这里的启动器包括rEFInd (0.13.3.1)和Grub2 (2.06)。这里的Linux版本选择涵盖了最常用的服务器版本,分别是从Debian,RedHat,SUSE三大主流服务器过来的,具体的Linux族谱详情可以参考wiki上面的介绍。

移动硬盘的分区

这里我的移动硬盘大小是1TB(实际是931.5GB),具体GPT分区方案如图所示:
硬盘分区
稍微解释一下:

  1. 第一个分区EFI主要用来安装引导器,也就是grub2或者rEFInd,这里的目录结构为EFI-grub/BOOT/XXX和EFI-refind/BOOT/XXX。因为两个引导器可能导致目录混乱,所以安装的时候都是EFI/BOOT/XXX,需要启用哪个就保留EFI的名字,否则用EFI-xxx来重命名。
    a. 如果用grub2,命令大致是:grub-install.exe --removable --no-floppy --target=x86_64-efi --boot-directory=X:\EFI\BOOT --efi-directory=X:\
    其中,grub的配置文件存放在X:\EFI\BOOT\grub\文件夹下,grub产生的bootx64.efi存放在X:\EFI\BOOT\下。
    b. 如果用rEFInd,可以用sudo ./refind-install --usedefault /dev/sdx1,这样会把所有文件安装在/dev/sdx1/EFI/BOOT/下面。
  2. 紧接着的两个分区是macOS Mojave和macOS Monterey的安装盘,这个安装盘的制作方法非常简单,下载好镜像,然后用镜像里面的createinstallmedia命令就可以了,注意分区不要选到其他分区了。分区大小只要比安装盘的略大一点就好了。
  3. 再下来的Buffer分区是一个空分区,这个分区主要是用来调整前后分区大小的,比如上一个macOS的后一个版本的安装镜像比现在的要大,那么就用这个空间来扩展。
  4. 接着两个windows的安装盘分区,一个是Win10,一个是Win11。
  5. 接着是我存放数据的分区,也是最大的分区。
  6. 最后的是LINUX分区,这个分区的格式一定要注意,EXT2是我试过比较合适的,因为有些镜像比较大,FAT32不能够很好的支持,这个分区放到最后也有利于从前面一个分区进行分区扩展。

注意:首先安装两个macOS系统,这个没什么好说的,然后把Win10和Win11的安装盘文件解压到各自对应的分区的根目录。

附上我的目录结构:

基于rEFInd启动器的多启动移动硬盘的制作

在Linux分区创建不同的文件夹存放不同的Linux ISO文件,同时,要把各个Linux的引导(类似initrd的)和内核文件(类似vmlinuz的)从对应的ISO文件解压出来放到和ISO文件同层的地方。

注意:这里有一个例外,就是Debian系的,其他所有的引导和内核文件都是通过解压iso文件里面对应的内容到iso外面,但是,debian里面的那两个文件不管用!!!解决方法是去https://mirrors.tuna.tsinghua.edu.cn/debian/dists/Debian11.3/main/installer-amd64/current/images/hd-media/下载standard loader文件(无桌面),即vmlinuz和initrd,或者去https://mirrors.tuna.tsinghua.edu.cn/debian/dists/Debian11.3/main/installer-amd64/current/images/hd-media/gtk/下载graphical loader文件(有桌面),即vmlinuz和initrd。

rEFInd的安装

分享一下我的refind.conf,这里面的主题是用了https://github.com/Pr0cella/rEFInd-glassy,安装方法参考主题里面的位置做相应修改就好了。

timeout 60
use_nvram false
scanfor manual
include \EFI\BOOT\themes\glassy\theme.conf

menuentry "Windows 10 Setup" {
    icon \EFI\BOOT\themes\glassy\icons\os_win.png
    volume "Windows10"
    loader \EFI\boot\bootx64.efi
}

menuentry "Windows 11 Setup" {
    icon \EFI\BOOT\themes\glassy\icons\os_win8.png
    volume "Windows11"
    loader \EFI\boot\bootx64.efi
}

menuentry "Install macOS Mojave" {
    icon \EFI\BOOT\themes\glassy\icons\os_mac.png
    volume "Install macOS Mojave"
    loader \System\Library\CoreServices\boot.efi
}

menuentry "Install macOS Monterey" {
    icon \EFI\BOOT\themes\glassy\icons\os_mac_alt.png
    volume "Install macOS Monterey"
    loader \System\Library\CoreServices\boot.efi
}

menuentry "Ubuntu 20.04 LTS" {
    icon \EFI\BOOT\themes\glassy\icons\os_ubuntu.png
    volume "LINUX"
    loader /ubuntu/vmlinuz
    initrd /ubuntu/initrd
    options "iso-scan/filename=/ubuntu/jammy-desktop-amd64.iso file=/cdrom/preseed/ubuntu.seed quiet splash=silent"
}

menuentry "Fedora Workstation 35" {
    icon \EFI\BOOT\themes\glassy\icons\os_fedora.png
    volume "LINUX"
    loader /fedora/vmlinuz
    initrd /fedora/initrd.img
    options "iso-scan/filename=/fedora/Fedora-Workstation-Live-x86_64-35-1.2.iso root=live:CDLABEL=Fedora-WS-Live-35-1-2 rd.live.image nomodeset quiet rhgb"
}

menuentry "OpenSUSE Leap 15.3.3" {
    icon \EFI\BOOT\themes\glassy\icons\os_opensuse.png
    volume "LINUX"
    loader /opensuse/linux
    initrd /opensuse/initrd
    options "install=hd:/opensuse/openSUSE-Leap-15.3-3-DVD-x86_64-Media.iso splash=silent"
}

menuentry "Arch Linux" {
    icon \EFI\BOOT\themes\glassy\icons\os_arch.png
    volume "LINUX"
    loader /archlinux/vmlinuz-linux
    initrd /archlinux/initramfs-linux.img /archlinux/intel-ucode.img
    options "img_dev=/dev/disk/by-label/LINUX img_loop=archlinux/archlinux-2022.05.01-x86_64.iso"
}

menuentry "Gentoo Linux" {
    icon \EFI\BOOT\themes\glassy\icons\os_gentoo.png
    volume "LINUX"
    loader /gentoo/gentoo
    initrd /gentoo/gentoo.igz
    options "root=/dev/ram0 init=/linuxrc dokeymap looptype=squashfs loop=/image.squashfs cdroot isoboot=/gentoo/install-amd64-minimal-20220508T170538Z.iso"    
}

menuentry "Debian 11.3.0" {
    icon \EFI\BOOT\themes\glassy\icons\os_debian.png
    volume "LINUX"
    loader /debian/vmlinuz
    initrd /debian/initrd.gz
    options "findiso=/debian/debian-11.3.0-amd64-DVD-1.iso splash=silent"
}

menuentry "RHEL 9.0" {
    icon \EFI\BOOT\themes\glassy\icons\os_redhat.png
    volume "LINUX"
    loader /redhat/vmlinuz
    initrd /redhat/initrd.img
    options "inst.repo=hd:LABEL=LINUX:/redhat/rhel-baseos-9.0-x86_64-dvd.iso quiet"
}

menuentry "SLES 15 SP4" {
    icon \EFI\BOOT\themes\glassy\icons\os_suse.png
    volume "LINUX"
    loader /suse/linux
    initrd /suse/initrd
    options "splash=silent quiet nomodeset install=hd:/suse/SLE-15-SP4-Full-x86_64-PublicRC-202204-Media1.iso"
}

theme.conf如下:

hideui hints
icons_dir \EFI\BOOT\themes\glassy\icons

banner \EFI\BOOT\themes\glassy\background.png
banner_scale fillscreen

selection_big   \EFI\BOOT\themes\glassy\icons\selection_big.png
selection_small \EFI\BOOT\themes\glassy\icons\selection_small.png

font \EFI\BOOT\themes\glassy\fonts\nimbus-mono-28.png
showtools reboot, shutdown

基于Grub2启动器的多启动移动硬盘的制作

用Grub2的好处是不用从Linux ISO文件里面解压出来引导所需的文件,每个文件夹下只需要一个Linux ISO文件就好了(Debian除外)。在EFI\boot下面的grub文件夹下,如果没有grub.cfg,手动添加就好了,因为我用了tela主题,所以在grub/themes/文件夹下面有tela文件夹。简要介绍一下如何使用tela:

  1. 从GitHub克隆tela这个仓库。
  2. 将仓库目录下的tela整个文件夹放到/grub/themes/下面。
  3. 在仓库目录assets/backgrounds文件夹下面选出来一张喜欢的背景图片,命名为background.png放到/grub/themes/tela下面。
  4. 将仓库目录assets/icons/color文件夹下面的所有文件复制到/grub/themes/tela/icons文件夹下(这里先新建这个icons文件夹)。
  5. 从仓库目录assets/progressbar下面挑选出一张喜欢的进度条图片重命名为progress_highlight_c.png放到/grub/themes/tela下面。

注意:下面的--class选项的名称要和icons下面所选的图片名称一样,比如--class suse匹配icons/下面suse.png这张图片。

下面,贴出我用的grub.cfg,里面针对某些Linux的参数可以通过这些Linux ISO文件里面的grub.cfg可以找到,例如CDLABEL。

set default=0
set timeout=60 

# Disk format modules
insmod part_gpt
insmod fat
insmod ext2

# Video support modules
insmod all_video
insmod efi_gop
insmod efi_uga
insmod video_bochs
insmod video_cirrus

# Image support modules
insmod png
insmod jpeg

# Enable grub graphic terminals
set gfxterm=auto
set gfxpayload=keep
terminal_output gfxterm

# Set grub2 themes
loadfont /EFI/BOOT/grub/themes/tela/JetBrainsMonBold24.pf2
set theme=/EFI/BOOT/grub/themes/tela/theme.txt
export theme

# Loopback modules
insmod loopback

menuentry "Windows 10 Setup" --class win10 {
    search --no-floppy --label "Windows10" --set root
    chainloader /efi/boot/bootx64.efi
}

menuentry "Windows 11 Setup" --class win11 {
    search --no-floppy --label "Windows11" --set root
    chainloader /efi/boot/bootx64.efi
}

menuentry "Install macOS Mojave" --class mojave {
   search --no-floppy --label "Install macOS Mojave" --set root
   chainloader /System/Library/CoreServices/boot.efi
}

menuentry "Install macOS Monterey" --class monterey {
   search --no-floppy --label "Install macOS Monterey" --set root
   chainloader /System/Library/CoreServices/boot.efi
}

menuentry "Ubuntu 20.04 LTS" --class ubuntu {
    search --no-floppy --label "LINUX" --set root
    set iso_file=/ubuntu/jammy-desktop-amd64.iso
    loopback loop ${iso_file}
    linux (loop)/casper/vmlinuz iso-scan/filename=${iso_file} file=/cdrom/preseed/ubuntu.seed quiet splash=silent
    initrd (loop)/casper/initrd
}

menuentry "Fedora Workstation 35" --class fedora {
    search --no-floppy --label "LINUX" --set root
    set iso_file=/fedora/Fedora-Workstation-Live-x86_64-35-1.2.iso
    loopback loop ${iso_file}
    linux (loop)/isolinux/vmlinuz iso-scan/filename=${iso_file} root=live:CDLABEL=Fedora-WS-Live-35-1-2 rd.live.image splash=silent
    initrd (loop)/isolinux/initrd.img
}

menuentry "OpenSUSE Leap 15.3.3" --class opensuse {
    search --no-floppy --label "LINUX" --set root
    set iso_file=/opensuse/openSUSE-Leap-15.3-3-DVD-x86_64-Media.iso
    loopback loop ${iso_file}
    linux (loop)/boot/x86_64/loader/linux install=hd:${iso_file} splash=silent
    initrd (loop)/boot/x86_64/loader/initrd
}

menuentry "Arch Linux" --class arch {
    search --no-floppy --label "LINUX" --set root
    set iso_file=/archlinux/archlinux-2022.05.01-x86_64.iso
    loopback loop ${iso_file}
    linux (loop)/arch/boot/x86_64/vmlinuz-linux img_dev=/dev/disk/by-label/LINUX img_loop=${iso_file}
    initrd (loop)/arch/boot/x86_64/initramfs-linux.img (loop)/arch/boot/intel-ucode.img
}

menuentry "Gentoo Linux" --class gentoo {
    search --no-floppy --label "LINUX" --set root
    set iso_file=/gentoo/install-amd64-minimal-20220508T170538Z.iso
    loopback loop ${iso_file}
    linux (loop)/boot/gentoo root=/dev/ram0 init=/linuxrc dokeymap looptype=squashfs loop=/image.squashfs cdroot isoboot=${iso_file} splash=silent
    initrd (loop)/boot/gentoo.igz
}

menuentry "Debian 11.3.0" --class debian {
    search --no-floppy --label "LINUX" --set root
    set iso_file=/debian/debian-11.3.0-amd64-DVD-1.iso
    loopback loop ${iso_file}
    linux /debian/vmlinuz findiso=${iso_file} splash=silent
    initrd /debian/initrd.gz
}

menuentry "RHEL 9.0" --class redhat {
    search --no-floppy --label "LINUX" --set root
    set iso_file=/redhat/rhel-baseos-9.0-x86_64-dvd.iso
    loopback loop ${iso_file}
    linux (loop)/isolinux/vmlinuz inst.repo=hd:LABEL=LINUX:${iso_file} quiet
    initrd (loop)/isolinux/initrd.img
}

menuentry "SLES 15 SP4" --class suse {
    search --no-floppy --label "LINUX" --set root
    set iso_file=/suse/SLE-15-SP4-Full-x86_64-PublicRC-202204-Media1.iso
    loopback loop ${iso_file}
    linux (loop)/boot/x86_64/loader/linux splash=silent quiet install=hd:${iso_file} nomodeset
    initrd (loop)/boot/x86_64/loader/initrd
}

menuentry 'NixOS Gnome 23.05' {
    search --no-floppy --label "LINUX" --set root
    set isofile="/latest-nixos-gnome-x86_64-linux.iso"
    loopback loop "$isofile"
    linux (loop)/boot/bzImage init=/nix/store/qfk353msxsvs123wsjyvmwil7qvs2pnn-nixos-system-nixos-23.05.1375.9790f3242da/init findiso="$isofile" rd.live.image root=LABEL=LINUX quiet splash
    initrd (loop)/boot/initrd
}

menuentry "Reboot" --class reboot {
    reboot
}

menuentry "Shutdown" --class shutdown {
    halt
} 

最后附上我个人的grub2和rEFInd的最终文件压缩包

EFI-grub
EFI-refind

posted @ 2020-03-01 12:26  alexanderzjs  阅读(6213)  评论(0编辑  收藏  举报