GRUB2からEXT4イメージファイルを起動する

GRUB2からEXT4イメージファイルを起動する

友人が高速 HDD を必要としていたので、私は小さな 64 GB SDD を彼女にあげました。この SSD には Linux がインストールされていました。dd を使用してパーティションのイメージを作成しました (1 つのパーティションにブート、ルート、ホーム)。

このパーティションは現在、従来の 500 GB EXT4 形式のドライブ上にあります。

持っている .img ファイルを使用して GRUB を起動する方法はありますか? SSD は戻ってきませんし、Linux インストールを最初からセットアップする手間をかけるのは面倒です。ISO イメージ用の GRUB のループバック サポートを見つけました。これは EXT4 もサポートしていますか? 具体的なものは見つからないようですし、何も破棄したくありません。

乾杯。

答え1

ファイルにパーティション テーブルが含まれていても、grub2 はそこから起動できます。ここで、(hd0,1) はファイルの場所、(loop,1) はファイル内のパーティションです。ただし、これは initramfs を起動するだけで、ファイルは実際にはマウントされません。

/etc/grub.d/40_custom

menuentry "My bootable disk image" {
    set isofile="hdd_ext4.img"
    loopback loop (hd0,1)/${isofile}
    linux (loop,1)/boot/vmlinuz-3.16.0-4-amd64 root=/dev/sda1 loop=/${isofile} ro
    initrd (loop,1)/boot/initrd.img-3.16.0-4-amd64
}

独自のマウント スクリプトを作成し、chmod a+x を実行して local-premount フォルダーにコピーします。initramfs-tools を使用して独自の "initrd.img-3.16.0-4-amd64" を作成し、それをイメージ ファイル内にコピーします。ハード コーディングする必要はなく、スクリプト内で grub エントリ ${ROOT} と ${loop} の変数を使用するだけです。

/etc/initramfs-tools/scripts/local-premount

#!/bin/sh

modprobe loop
modprobe ext4

# mount /dev/sda1 (file location)
mkdir /host
mount -n -t ext4 -o rw,data=ordered ${ROOT} /host

# kpartx add partition devmappings for hdd_ext4.img
loop_pt=$(kpartx -av /host${loop} 2>&1 | grep loop | cut -f3 -d" ")

# mount hdd_ext4.img (image file)
mount -n -t ext4 -o loop,rw,data=ordered /dev/mapper/${loop_pt} ${rootmnt}

注意: これは、kpartxがinitramfsにインストールされている場合にのみ機能します。

関連情報