web-dev-qa-db-ja.com

grub:ISOパーティションを起動する方法

ISOファイルをパーティションにコピーしました(つまり、dd if = isofile of =/dev/sdb1)。 GRUB経由でそのパーティションを起動するにはどうすればよいですか?

チェーンローダー(hd1,0)+1だけで試してみると、実行可能形式が不明と表示されます。

6
Albert

ISOファイルからの起動に関する質問 に関する私の回答を参照してください。それを出発点として、古いハードドライブでいくつかのテストを実行しました。以前に Grub2を構成 から マルチISOを起動 フラッシュドライブを使用したことがあるので、次のようにしました。

  1. 古いハードドライブにいくつかのパーティションを作成します。これはUSB-IDEアダプターを使用して行われたため、ドライブは/ dev/sdbとして表示されます。

    • パーティション1:FAT32、サイズが最大2GB
    • パーティション2:フォーマットされていない


  2. 最初のパーティションを/ mntにマウントし、システムからドライブにGrubのコピーをインストールしました。

    Sudo grub-install --no-floppy --root-directory=/mnt /dev/sdb
    


  3. ISOを2番目のパーティションに「焼き付け」ました。

    Sudo dd if=avg.iso /dev/sdb2
    


  4. これはAVGウイルススキャナーISOです。マルチISOフラッシュドライブでは、これを使用してISOを直接起動します。

    menuentry "AVG Rescue CD" {
       loopback loop /iso/avg.iso
       linux (loop)/isolinux/vmlinuz max_loop=255 vga=791 init=linuxrc iso-scan/filename=/iso/avg.iso
       initrd (loop)/isolinux/initrd.lzm
    }
    

    ハードドライブのパーティションからこれを機能させるには、loopbackコマンドをnixし、ルートデバイスなどを設定する必要があります。 Grub2にルートデバイスを自動的に検出させる試みはすべて失敗したので、パーティションに直接向けました。これは機能しますが、Grubのデバイス列挙に注意してください。起動しようとしているドライブが(hd0)ではない可能性があります。 ISOパーティションの有効なエントリは次のとおりです。

    menuentry "AVG Rescue CD" {
       linux (hd0,2)/isolinux/vmlinuz max_loop=255 vga=791 init=linuxrc
       initrd (hd0,2)/isolinux/initrd.lzm
    }
    

    これにより、起動可能なISOオンパーティションが作成されます。

これは、Grub2がISO9660ファイルシステムを読み取ることができるため、この特定のISOがパーティション上のISOに対応できるOSをロードしているため、およびカーネルがロードする実質的にすべてがinitrd


Grub4DOSまたはGrub1を使用している場合は、チェーンローダーで同様のトリックを引き出すことができる場合があります。これがWin7ISOを直接起動するように機能すると仮定します( ソース ):

title Windows 7
  map (hd0,0)/win7.iso (hd32)
  map --hook
  chainloader (hd32)

この変更で運が良かったかもしれません(ISOを2番目のプライマリパーティション(hd0,1)に「焼き付けた」と仮定します。それ以外の場合は、適切なパーティションに置き換えます)。

title Windows 7
  map (hd0,1) (hd32)
  map --hook
  chainloader (hd32)

あなたはこれで逃げることもできます:

title Windows 7
  chainloader (hd0,1)

ただし、ISOは実際にはドライブから起動するように構成されていないため、他の問題が発生する可能性があります。

3
quack quixote

Grub4DOS (最後の公式ビルド)を使用してそれを行うことができた方法は次のとおりです。

Grub4DOSは boot iso images ができるので、パーティションに対してそれを実行できるはずです。
isoパーティションを新しいドライブにマップし、次のコマンドで起動します。

title Boot ISO Partition
    map (hd0,7) (0xff)
    map --hook
    chainloader (0xff)

しかし、これは機能せず、ディスク全体がマップされています。

幸い、mapは最初の引数として「ファイルまたはブロックリスト」を取ることができます。

  1. パーティションに必要なブロック数を確認します。

    $ Sudo fdisk -l /dev/sda
    ...
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda8            5948        6087     1124518+   b  W95 FAT32
    

    1.1Gbパーティションを作成したので、ここで1124518 * 2 = 2249036を使用する必要があります。
    (技術的には2249037ですが、問題ではありません)

  2. 次に、ブロックリストをgrubに渡します。

    title Boot ISO Partition
        map --heads=0 --sectors-per-track=0 (hd0,7)0+2249036 (0xff)
        map --hook
        chainloader (0xff)
    

    そしてそれは動作します!

ノート:

  • サイズを間違えると、grubがそれをキャッチします(mapコマンドはパーティションの境界を超えて失敗します)。
    小さすぎると起動しない可能性があります。
  • (hd32)の代わりに(0xff)を使用することもできます。
  • 4.5bバージョンを試したことがないため、問題が修正される可能性があります。

Grub2からGrub4DOSをチェーンロードするには:

menuentry "Boot ISO Partition" {
        root (hd0,1)
        set opts='map --heads=0 --sectors-per-track=0 (hd0,7)0+2249036 (0xff);
                  map --hook;
                  chainloader (0xff) '
        linux16 /boot/grub4dos/grub.exe --config-file=$opts
}

これを/boot/grub/grub.cfg(またはおそらくより良い/etc/grub.d/40_custom)に追加します。
(最初のパーティションのgrub.exe/boot/grub4dosがあると仮定)


結論:実際にはかなりクールです。

  • Isolinux /イメージが使用しているブートローダーにチェーンロードします。
    したがって、起動エクスペリエンスはcdまたはusbスティックとまったく同じです。
  • 新しいISOを試すために必要なのは、パーティションに追加して再起動することだけです。
  • Usbよりも高速(特にssd!)で、 isoのループマウント (ubuntuベースのisos)よりも効率的です。
  • memdisk のように、イメージをディスクから読み取る必要はありません。

これは、すべてのハイブリッドISOで機能するはずです。それらはiso9660パーティションでファイルを見つけることができるので、ubuntuライブイメージや他のLinuxisosでうまく機能します。リアルモード(DOS)でも問題ありません。 WindowsISOは対応できません。

グジン ところでもできます。

1
lemonsqueeze

内蔵ドライブからgrubを使用してLiveUSBを起動します

BalenaEtcher、dd、またはISO9660ファイルを使用するその他の方法を使用して作成されたLive USBの起動に問題がある場合は、内蔵ドライブのgrubを使用して起動できる場合があります。

次のmenuentryを内蔵ドライブのgrubメニューに追加してみてください

menuentry "Ubuntu - flash drive" {
 search --set=root --fs-uuid xxxx-xx-xx-xx-xx-xx-xx
    set gfxpayload=keep
    linux   ($root)/casper/vmlinuz$casper_flavour  file=/cdrom/preseed/ubuntu.seed quiet splash  ---
    initrd  ($root)/casper/initrd$casper_flavour
}

ここで、xxxx-xx-xx-xx-xx-xx-xxはライブUSBのUUIDです。

この方法は、ISO9660ファイルを起動するライブUSBまたは永続USBで機能するはずです。

0
C.S.Cameron