您尚未登录。

#1 2015-09-10 01:55:36

泉夏禾
会员
注册时间: 2014-03-01
帖子: 38

[非水] 通过GRUB从单个USB设备引导多个iso9660镜像(UEFI/BIOS两用U盘多启动方案)

(其实这篇备忘本来应该放在我的博客中的,不过鉴于我一直搭不好博客环境;先前的静态博客环境被我给删了,懒的再搭,就先贴在这里好了。希望能有用。)

基本思路:分别安装GRUB(一次为BIOS安装,另一次为UEFI安装)于同一个设备(本文中为U盘)上,两种系统有两个不同的配置文件。
需求:

  • 过程中不使用Windowz;

  • 目标BIOS应该可以从GPT磁盘上成功引导(注:据说某些buggy的系统,如某些i原厂板,不支持自使用GPT的磁盘上以Legacy模式引导);

  1. 给U盘以GPT分区,视容量可分二到三个区(或更多):

    • 一个「BIOS boot」区:GRUB在以传统(Legacy)方式自使用GPT的存储设备引导时需要用到此区,不需要格式化,1MiB就好。类型编号:fdisk中为4,gdisk中为ef02

    • 一个「EFI System」区:主板上的UEFI固件会在使用GPT的存贮设备中搜寻这个类型的分区中的EFI executable,格式为FAT32(vfat),尺寸按需分配(至少260MiB,见)。类型编号:fdisk中为1,gdisk中为ef00

    • (可选)一个ext4区:这个就看U盘的尺寸了,如果是8G或16G的话可能会需要再分个ext4出来(请记得FAT32不支持4GiB以上文件)

    分完之后的输出(fdisk -l截取):

    Disk /dev/sdb: 14.9 GiB, 16008609792 bytes, 31266816 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: A72C7351-ACF1-4BA6-857B-C682AFB678FB
    
    Device      Start      End  Sectors  Size Type
    /dev/sdb1    2048     4095     2048    1M BIOS boot
    /dev/sdb2    4096   536575   532480  260M EFI System
    /dev/sdb3  536576 31266782 30730207 14.7G Linux filesystem
  2. 格式化分区:

    • EFI System区,FAT32(/dev/sdb2,其中150909_EFI是卷标):

      # mkfs.vfat -F 32 -n 150909_EFI /dev/sdb2
    • 可选的ext4(/dev/sdb3,150909为卷标,选项为闪存设备优化,按需调整):

      # mkfs.ext4 -b 4096 -c -O ^has_journal -L 150909 -m 0 /dev/sdb3
      # tune2fs -i 0 /dev/sdb3
  3. 挂载ESP(EFI System分区)并安装GRUB(BIOS):

    # mount /dev/sdb2 /mnt
    # grub-install --boot-directory=/mnt/boot --target=i386-pc --compress=xz --locales= --themes= /dev/sdb
  4. 挂载分区并往里面复制iso镜像。

  5. 编辑GRUB配置(BIOS),本例中位于/mnt/boot/grub/grub.cfg,以下为样板,其中isofile指定的是iso在分区中的路径,变量volume_label为分区卷标:

    insmod acpi
    insmod all_video
    insmod gfxterm
    loadfont /boot/grub/fonts/unicode.pf2
    set gfxmode=auto
    set gfxpayload=keep
    export gfxmode
    export gfxpayload
    terminal_input console
    terminal_output gfxterm
    
    set volume_label=150909
    export volume_label
    
    search --set=root --label $volume_label
    
    set default=0
    set timeout=-1
    
    menuentry '[loopback]archlinux-2015.09.06-x86_64' {
    	set isofile='/data/iso/archlinux-2015.09.06-x86_64.iso'
    	loopback loop $isofile
    	linux (loop)/arch/boot/x86_64/vmlinuz archisolabel=ARCH_201509 img_label=$volume_label img_loop=$isofile earlymodules=loop
    	initrd (loop)/arch/boot/x86_64/archiso.img
    }
    menuentry 'Boot HDD' {
    	chainloader +1
    }
    
    menuentry 'Reboot'{
    	reboot
    }
    
    menuentry 'Halt'{
    	halt
    }
  6. 安装GRUB(UEFI):

    # mkdir -p /mnt/EFI/boot
    # echo 'configfile ${cmdpath}/grub.efi.cfg' > /tmp/grub.tmp
    # grub-mkstandalone -O x86_64-efi --modules='part_gpt' --fonts=unicode --locales= --themes= -o /mnt/EFI/boot/bootx64.efi boot/grub/grub.cfg=/tmp/grub.tmp
  7. 配置GRUB(UEFI),本例中位于/mnt/EFI/boot/grub.efi.cfg,配置文件样板与刚才的一样。

如需要更多引导项(Fedora・Ubuntu 等),参见这里

最近编辑记录 泉夏禾 (2015-09-14 14:58:19)


The community-maintained ArchWiki is the primary resource that should be consulted if issues arise.

离线

#2 2015-09-10 01:56:30

泉夏禾
会员
注册时间: 2014-03-01
帖子: 38

Re: [非水] 通过GRUB从单个USB设备引导多个iso9660镜像(UEFI/BIOS两用U盘多启动方案)

参考出处:ArchWiki:UEFI ArchWiki:GRUB


The community-maintained ArchWiki is the primary resource that should be consulted if issues arise.

离线

#3 2015-09-11 14:48:57

32idea
烟波浩渺,画船听雨
注册时间: 2011-08-20
帖子: 41

Re: [非水] 通过GRUB从单个USB设备引导多个iso9660镜像(UEFI/BIOS两用U盘多启动方案)

感谢分享,这个还真是近来比较关心的事情,可以机子都太老,没一个支持uefi的

离线

页脚