NTFS パーティションからの GRUB ブート ISO/ディスク イメージ

NTFS パーティションからの GRUB ブート ISO/ディスク イメージ

PC 上の既存の NTFS パーティションから Linux ライブ システムを含む ISO を起動しようとしています。PC には UEFI があり、ハード ディスクは GPT でパーティション分割されているため、GRUB4DOS は使用できません。これは実行できるのでしょうか?

この質問は以前にもされたことがあることを私は知っています:Grub - ntfs パーティションから Debian ISO ファイルを起動してインストールするしかし、そこには承認された回答がないので、再度質問しています。また、固定されコンパイル済みのカーネルではなく、独自のカーネルを使用したいと思います。

他の回答から判断すると、何らかのカスタマイズされたカーネル ファイル (EFI パーティションに配置すると想定) を含める必要があり、これにより、NTFS 自体から残りの ISO(?) をロードできるようになるようです。

これは、GRUBエントリを実行するだけで、FATパーティションで既に実行できます。

menuentry "Boot LINUX FROM ISO FILE" {
  set iso_path=/path_to/image_on_FAT_filesystem.iso
  loopback loop (hdX,msdosY)$iso_path
  linux (loop)/path_to/vmlinuz nomagic base_only norootcopy from=$iso_path
}

答え1

したがって、解決策として;

背景: 私はArch Linuxを使用しています。mkinitcpioinitramfs (および初期のユーザー空間(!)) を生成します。NTFS からファイルシステム イメージを起動しているため、initramfs を微調整する必要があります。GRUB とその ntfs モジュールを使用して、NTFS パーティションからカーネルと initramfs を読み取ることができます (GRUB ntfs モジュールは ro です)。この後、完全な読み取り/書き込みアクセスのために、initramfs から NTFS パーティションをマウントする必要があります。

ソリューションの動作原理: NTFSパーティションをマウントできるように、initramfsにntfs-3gとfusefsパッケージを追加しました。また、新しいmkinitcpio フック実際のマウントフックの前にロードする必要がある。フックは、次のようなパラメータ(これらはGRUBからカーネル引数として与えられる)を取得する単純なシェルスクリプトである。

menuentry "Boot LINUX FROM ISO FILE" {
  insmod ntfs
  set root='(hdX,Y)'
  linux /in_ntfs/vmlinuz-linux root=UUID=*GPT_UUID_OF_ROOTFS_ON_DISK_IMAGE* image_path=*path_to_disk_image_on_NTFS* image_hd=*GPT_UUID_OF_NTFS_DISK*
  initrd /in_ntfs/initrd.img
}
  1. NTFS パーティション内のディスク イメージの場所 (image_path)
  2. NTFS パーティション GPT GUID (image_hd)
  3. ディスクイメージに複数のパーティションが含まれている場合、rootfs UUID(ルート)

ディスクマウントに関するブート手順:

  1. initcpioフックはNTFSパーティションをマウントします
  2. initcpioフックはNTFSパーティションからディスクイメージをループデバイスとしてマウントします。
  3. ここで通常のマウントフックが実行され、ステップ2でマウントされたディスクイメージ内のLinuxルートファイルシステムを含むext4または任意のパーティションが与えられます。
  4. システムは初期ユーザースペースを終了し、newroot は NTFS ループマウントされたイメージ ファイルの rootfs パーティションに設定されます。
  5. なんと、NTFS パーティション内のディスク イメージ/ISO イメージから読み取りおよび書き込み権限を持つ実行中の Linux システムを取得できました。

関連情報