ディスク(デバイス)全体のイメージから単一のパーティションをマウントする

ディスク(デバイス)全体のイメージから単一のパーティションをマウントする

私はディスク全体のイメージを作成した

dd if=/dev/sda of=/media/external_media/sda.img

問題は、そのディスクにあるext4ファイルシステムをマウントしたいのですが、

mount -t ext4 -o loop /media/external_media/sda.img /media/sda_image

イメージには必要なパーティションだけではなく、ディスク全体 (MBR、その他のパーティション) が含まれているため、明らかにスーパーブロック エラーが発生します。したがって、ディスク イメージをフォルダーに表示する方法を見つける必要があると思います/dev/...

誰かそのやり方を知っていますか?

PS: イメージを元のディスクに戻すことはいつでもできますddが、それは非常に不便です (OS を更新したので、そのままにしておきたいです)

答え1

イメージのパーティションレイアウトを取得する

$ sudo fdisk -lu sda.img
...
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
...
  Device Boot      Start         End      Blocks   Id  System
sda.img1   *          56     6400000     3199972+   c  W95 FAT32 (LBA)

イメージの先頭からパーティションの先頭までのオフセットを計算する

セクターサイズ*始める= (この場合) 512 * 56 =28672

オフセットを使用して/dev/loop0にマウントします

sudo losetup -o 28672 /dev/loop0 sda.img

現在、パーティションは/dev/ループ0。 あなたはできるスキャンそれをマウントするなど

sudo fsck -fv /dev/loop0
sudo mount /dev/loop0 /mnt

アンマウント

sudo umount /mnt
sudo losetup -d /dev/loop0

答え2

Ubuntu 16.04 のアップデート:新しいものを使用すると、losetupこれが簡単になります。

sudo losetup -Pf disk_image.raw

Ubuntu の古いバージョンについては、残りの回答を参照してください。


簡単な解決策は、kpartx: パーティションのレイアウトが判明し、それぞれがブロックデバイスにマップされます。その後は、必要なものをマウントするだけです。

ターミナルを開き、ディスク イメージを見つけて、次のコマンドを入力します。

$ sudo kpartx -av disk_image.raw 
add map loop0p1 (252:2): 0 3082240 linear /dev/loop0 2048
add map loop0p2 (252:3): 0 17887232 linear /dev/loop0 3084288

これによりloop0p1loop0p2の下に作成されます/dev/mapper。出力からパーティションのサイズを確認できるので、パーティションを識別するのに役立ちます。必要なパーティションをマウントするには、次のコマンドを使用します。

$ sudo mount /dev/mapper/loop0p2 /mnt

あるいは、ブロック デバイスは Nautilus によって検出され、サイド バーからマウントできます。

ここに画像の説明を入力してください

完了したら、マウントしたものをアンマウントし、デバイス マッピングを削除します。

$ sudo umount /mnt
$ sudo kpartx -d disk_image.raw

答え3

編集: で動作しますユーティリティ Linux >=2.21執筆時点ではUbuntuのバージョンは2.20のみ

から男は失敗する:

       -P, --partscan
          force kernel to scan partition table on newly created loop device

だからただ走って

$ sudo losetup -f --show -P /path/to/image.img

最初の未使用のループ デバイス上のディスク イメージのすべてのパーティションのデバイス ノードを作成し、それを標準出力に出力します。/dev/loop0デバイスを使用する場合は、少なくとも/dev/loop0p1通常どおりマウントできるものが作成されます。

答え4

losetup -Pオートメーション

losetup -PUbuntu 16.04で開始する最良の方法は、https://askubuntu.com/a/496576/52975さらに自動化するための関数を以下に示します。使用方法:

$ los my.img
/dev/loop0
/mnt/loop0p1
/mnt/loop0p2

$ ls /mnt/loop0p1
/whatever
/files
/youhave
/there

$ sudo losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                                                                      DIO
/dev/loop1         0      0         0  0 /full/path/to/my.img

$ # Cleanup.
$ losd 0
$ ls /mnt/loop0p1
$ ls /dev | grep loop0
loop0

ソース:

los() (
  img="$1"
  dev="$(sudo losetup --show -f -P "$img")"
  echo "$dev"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    echo "$dst"
    sudo mkdir -p "$dst"
    sudo mount "$part" "$dst"
  done
)
losd() (
  dev="/dev/loop$1"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    sudo umount "$dst"
  done
  sudo losetup -d "$dev"
)

ループモジュール max_part 構成

これは 16.04 より前の適切な方法です。

loopUbuntu 14.04 のカーネルに組み込まれたカーネル モジュールです。

正しく設定すれば、Linux は自動的にデバイスを分割します。

cat /sys/module/loop/parameters/max_part

loopデバイスが生成できるパーティションの数を示します。

Ubuntu 14.04 ではこれが0デフォルトであるため、自動分割は行われません。

これを変更するには、次のいずれかを追加します。

options loop max_part=31

のファイルに/etc/modprobe、または:

GRUB_CMDLINE_LINUX="loop.max_part=31"

に、/etc/default/grubそしてその後sudo update-grub

モジュール パラメータを設定する方法については、以下でも説明します。カーネルモジュールパラメータを追加するにはどうすればいいですか?

再起動後、次の操作を実行します。

sudo losetup -f --show my.img

イメージを/dev/loopXデバイスにマウントし、パーティションを/dev/loopXpYデバイスに自動的にマウントします。

したがって、再起動しても構わない場合、これが最も便利な方法です。

参照

関連情報