web-dev-qa-db-ja.com

GRUB NTFSパーティションからISO /ディスクイメージを起動

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

私は以前に質問があったことを知っています: Grub-ntfsパーティションからdebian isoファイルを起動してそれをインストールします ですが、承認された回答はありません-そのため、私はもう一度質問します。また、いくつかの修正済みでコンパイル済みのカーネルではなく、自分のカーネルを使用したいと思います。

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

これは、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
}
2
Jussi Hietanen

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

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

ソリューションの動作理論:NTFSパーティションをマウントできるように、ntfs-3gおよびfusefsパッケージをinitramfsに追加しました。また、実際のマウントフックの前にロードする必要がある新しい 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でマウントされたディスクイメージ内にext4またはLinux rootfsを含むパーティションが与えられます。
  4. システムは初期のユーザー空間を終了します。 newrootは、NTFSループでマウントされたイメージファイルのrootfsパーティションに設定されます。
  5. Ta-dah、NTFSパーティション内のディスクイメージ/ isoイメージから実行される読み取りと書き込みの権限を持つ実行中のLinuxシステムを取得しました。
4
Jussi Hietanen