【问题标题】:create pure uefi bootable iso from directory从目录创建纯 uefi 可启动 iso
【发布时间】:2019-12-14 18:47:52
【问题描述】:

我创建了一个实时 Linux 系统,我想创建一个能够启动 uefi 的 iso 文件,不需要旧的 BIOS。

我有一个包含 EFIBOOT 文件的文件夹(包含 Refind 启动管理器和我的 efi 启动内核 (Linux-Sytem.efi))

EFITBOOT

efi
    ├── boot
    │   ├── bootx64.efi
    │   └── refind.conf
    └── gentoo
        └── Linux-Sytem.efi

和一个包含系统映像的文件夹:

system/
└── Linux-Sytem.img

我现在的猜测是我必须创建一个包含 EFIBOOT 结构的 efi 兼容 (fat16/32) efi.img。

然后我必须以某种方式创建iso,将efi.img和系统结构放在一起......

我看过各种使用 grub 来执行此操作的教程,但它们都使用双启动选项(用于 uefi 和 bios)...

没有 grub 工具和纯 uefi 怎么办?

(如果将 EFIBOOT 和系统结构复制到正确的分区/格式化的 USB 驱动器,我非常确信它可以正常工作。它可以毫无问题地启动)

【问题讨论】:

    标签: boot iso uefi


    【解决方案1】:

    这对我有用,但可能是错误的:

    首先,我创建一个disk.iso,上面有两个分区,一个EFI分区和一个SYSTEM分区,整个img将是1.4GB(100MB用于EFI分区,其余用于SYSTEM分区):

    dd if=/dev/zero of=disk.iso bs=1M count=1400
    

    然后我用 fdisk GPT Table 对 disk.iso 文件进行分区:

    fdisk disk.iso
    # press
    g # create GPT-Table
    n # new partition
    1 # partition number
    ENTER # select default
    +100M # set size to 100MB
    t # set partition type
    1 # to EFI SYSTEM
    n # new partition
    ENTER # default partition number
    ENTER # default 1st sector
    ENTER # default last sector
    w # write changes to file and exit
    

    然后显示分区布局:

    fdisk -l disk.iso
    Disk disk.iso: 1.4 GiB, 1468006400 bytes, 2867200 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: D7DD43FA-30B6-2445-B34C-F4DB7B5D6F37
    
    Device      Start     End Sectors  Size Type
    disk.iso1    2048  206847  204800  100M EFI System
    disk.iso2  206848 2867166 2660319  1.3G Linux filesystem
    

    使用 losttup 从 disk.iso 循环挂载两个分区,以将两个分区格式化为所需的格式(EFI 为 fat16,SYSTEM 为 ext4),并在需要时额外为它们分配标签...使用 fdisk START END 值乘以扇区大小来设置边界:

    losetup --offset $((512*2048)) --sizelimit $((512*206847)) --show --find disk.iso
    # /dev/loop0
    losetup --offset $((512*206848)) --sizelimit $((512*2867166)) --show --find disk.iso
    # /dev/loop1
    mkfs.fat -F16 /dev/loop0
    mkfs.ext4 /dev/loop1
    tune2fs -L "SYSTEM" /dev/loop1  # assign label SYSTEM to SYSTEM-Partition
    

    挂载两个分区并将对应的内容复制到其中:

    mkdir /mnt/p1 /mnt/p2
    mount /dev/loop0 /mnt/p1/
    mount /dev/loop1 /mnt/p2/
    cp -a efi /mnt/p1/
    cp -a system/* /mnt/p2/
    umount /mnt/p1 /mnt/p2
    

    卸载两个循环设备:

    losetup -d /dev/loop0 /dev/loop1 
    

    disk.iso 现在可以启动了。 Iso 使用 qemu-kvm 和 virt-manager 测试,作为 CDROM 介质插入。未经真实刻录磁盘测试!

    【讨论】:

    • 完美!比所有复杂的启动映像要容易得多。就我而言,我只需要 EFI 工具,因此我只需将整个磁盘作为一个分区进行 fdisk,然后通过我的 IODD 进行挂载、复制和引导。谢谢!
    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 2015-01-01
    • 2021-09-14
    • 2019-10-04
    相关资源
    最近更新 更多