web-dev-qa-db-ja.com

カスタムISOブートUEFIでUSBを使用しないのはなぜですか? (解決済み)

Ubuntu 18.04に基づいて、BIOSモードとUEFIモードの両方で起動するISOを作成しようとしています。 BIOSモードで起動していますが、UEFIモードで起動するのに問題があります。 USBスティックに書き込むと、ISO9660USB内にUEFIパーティションが作成されます。 UEFIモードで起動しようとすると、grubプロンプトが表示されます。

Fdisk-lの結果

larry@larry-Satellite-C55-A:~/foxclone$ fdisk -l foxclone025-02.iso
Disk foxclone025-02.iso: 660 MiB, 692060160 bytes, 1351680 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: dos
Disk identifier: 0x45d15306

Device              Boot Start     End Sectors  Size Id Type
foxclone025-02.iso1 *        0 1351679 1351680  660M  0 Empty
foxclone025-02.iso2        276    5203    4928  2.4M ef EFI (FAT-12/16/32)

EFIパーティションを作成する方法は次のとおりです。

#! /bin/sh

BOOT_IMG_DATA=$($HOME/foxclone/newiso -d)
BOOT_IMG=efi.img

mkdir -p $(dirname $BOOT_IMG)

truncate -s 4M $BOOT_IMG
mkfs.vfat $BOOT_IMG
mkdir -p $BOOT_IMG_DATA/efi/boot

grub-mkimage \
    -C xz \
    -O x86_64-efi \
    -p /boot/grub \
    -o $BOOT_IMG_DATA/efi/boot/bootx64.efi \
    boot linux search normal configfile \
    part_gpt btrfs fat iso9660 loopback \
    test keystatus gfxmenu regexp probe \
    efi_gop efi_uga all_video gfxterm font \
    echo read ls cat png jpeg halt reboot

mcopy -i $BOOT_IMG -s $BOOT_IMG_DATA/efi ::

ISOを作成する方法は次のとおりです。

#!/bin/bash

orig_iso="$HOME"/foxclone/foxclone025-01.iso
new_iso="$HOME"/foxclone/foxclone025-02.iso
new_files=$HOME/foxclone/newiso
mbr_template=isohdpfx.bin

xorriso -as mkisofs \
    -r -V 'Foxclone' \
    -o "$new_iso" \
    -J -J -joliet-long -cache-inodes \
    -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \
    -b isolinux/isolinux.bin \
    -c isolinux/boot.cat \
    -boot-load-size 4 -boot-info-table -no-emul-boot \
    -eltorito-alt-boot \
    -e --interval:appended_partition_2:all:: \
    -append_partition 2 0xef efi.img \
    -no-emul-boot -isohybrid-gpt-basdat \
    "$new_files"

ダンペットの結果

larry@larry-Satellite-C55-A:~/foxclone$ dumpet -i foxclone025-02.iso
Validation Entry:
    Header Indicator: 0x01 (Validation Entry)
    PlatformId: 0x00 (80x86)
    ID: ""
    Checksum: 0x55aa
    Key bytes: 0x55aa
Boot Catalog Default Entry:
    Entry is bootable
    Boot Media emulation type: no emulation
    Media load segment: 0x0 (0000:7c00)
    System type: 0 (0x00)
    Load Sectors: 4 (0x0004)
    Load LBA: 38 (0x00000026)
Section Header Entry:
    Header Indicator: 0x91 (Final Section Header Entry)
    PlatformId: 0xef (EFI)
    Section Entries: 1
    ID: ""
Boot Catalog Section Entry:
    Entry is bootable
    Boot Media emulation type: no emulation
    Media load address: 0 (0x0000)
    System type: 0 (0x00)
    Load Sectors: 8192 (0x2000)
    Load LBA: 275968 (0x00043600)

ラリー、これについて助けていただければ幸いです。

1
larry78723

私はその理由を十分に理解しようとするのが大好きで、そのための方法を説明するのは嫌いです。一度理解して以来、私は「私の道」を知っているでしょう。 uefiで起動するとgrubのプロンプトのみが表示される可能性が非常に高いです

通常、(別名ubuntu)のようなDebianでは、2012年に有名なmjg59によってかなり前に開始された「埋め込みfat-efi-partition」には、grub.cfgを含む「memdisk」があります(実際にはgrub.cfgが横に埋め込まれています) efi.img)次のgrug.cfg(「カスタム」「ユーザー」の最終的なgrub.cfg)をどこで見るかを指示します-必要に応じて呼び出します-しかし、それはisoimageのgrub.cfg(isofsに表示されるもの)である必要がありますツリー構造-isotree/boot/grub/grub.cfg +もちろん、grubを完全にサポートするためのgrubのツリー。)grub-mkimageのディレクティブ-p/boot/grubは、grubがgrubを参照するためのプレフィックス/ boot/grubを示します。 .cfgですが、それでも脂肪の空間にあります。isotree空間を表示できる理由はありません!

Grub-mkimageには、isoツリーのgrub.cfgに「到達」できるようにするモジュールのディレクティブ-m memdisk.tarが付いたmemdiskが必要です。memdiskは、isoツリーのディレクティブを探して読み取るためのディレクティブを含む一種のtarfsです。 grub.cfg

この「何とか何とか」を説明するために

1「your」isoをgrubのプロンプトで起動したら、「ls」と入力して、grubが認識できるすべてのディスクドライブを表示します。「memdisk」は表示されません。

2 UEFIモード(ほぼ)で任意のubuntu(疑似)「iso」イメージ(疑似とは、pureisoではない、別名isohybridはpureisoではない)で起動して、「Try ubuntu ... blabla」タイプ「ESC」を取得するgrubのコンソールに入り、もう一度「ls」と入力して、isoimageと比較します。

grub> ls(memdisk)/このtarfsディスクの背後にあるものを確認します。最終的には

grub> cat(memdisk)/grub.cfgまたは類似の(memdisk)/boot/grub/grub.cfgを使用して、パーティションを切り替え、isoツリーのgrub.cfgを取得する方法を確認します。

3ショートカットを試してください:efi.imgをubuntuのefi.imgに置き換えるだけです; ubuntuの埋め込まれたgrub.cfgでは$ isotree/.disk/[info mini-info]にファイルが存在する必要があるので、mkdir $ isotree/.diskのようなものをisotreeに追加し、$ isotree/.disk/infoにタッチする必要があります。 xorrisoでisoを構築する可能性は高いですが、それは学習するのに悪い方法です

4最後にディレクティブ「-mmemdsk」を使用してgrub-mkimageを再構築します。ここで、「tar cf memdsk grub.cfg」grub.cfgは、ubuntuから手動で盗むものです。自分で書くほうがいい

5 uefiでusb上のubuntu.isoイメージを起動するには、

  Type ESC to get into grub console
  Check your isofs partition as hd0 (since you booton it) by
      grub>ls (hd0)/   this will reveal the isofs tree
  Chroot to isofs partition with
      grub>set root=(hd0)

標準的な方法でgrubconfigを切り替えますgrub> configfile /boot/grub/grub.cfg

B grub-cmd "syslinux_configfile"(通常はgoogle_searchに表示されません!!!)を使用してgrub構成を切り替えますgrub> syslinux_configfile /isolinux/isolinux.cfg

  Observe and play (where is legacy-bios or uefi boot now ?)

That's it

ワンジ

https://sourceforge.net/projects/toysbox/files/Exo_on_grub-mkimage/ を参照してください

https://sourceforge.net/projects/toysbox/files/practice_on_bootx64.efi/Practices_on_bootx64.pdf/download
1
wangji

問題が発生する可能性のある微妙なことが十分にありますが、スクリプトに明らかな誤りは見られませんが、それは間違いがないという意味ではありません。他に何もない場合は、トピックに関する優れた Rodの本 をチェックしてください。多分 私のISOジェネレータスクリプト -それはあなたの特定のタスクにとって非常に複雑です(そして私にはまだ単純すぎます)しかし、多分あなたはそこで重要な何かを見つけます。

PS:スクリプトは refind に基づいていることに注意してください(これは私にとってそれらの本と同じくらい素晴らしいです);グラブサポートを追加する取り組みが進行中ですが、まだありません。

その間、実際にUbuntu 18.04に縛られておらず、UEFIブート機能を備えたカスタムISO(署名付きシムを含む)だけが必要な場合は、かもしれませんALTの mkimage に興味があり、上記のスクリプトはその一部であり、 mkimage-profiles は、後続の配布構成を構築するためのフレームワークを提供します画像のベイク処理(例: ALT Starterkits はそれを使用して作成され、 9.0リリース ;派生物の作成は非常に簡単で技術的である傾向がありますが、ほとんどのドキュメントは今ではロシア語で)

恥知らずなプラグで申し訳ありませんが、私はたまたまALT LinuxでUEFIサポートを行い、mpを設計した人です-だから尋ねるのに抵抗できませんでした:-)

1