web-dev-qa-db-ja.com

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

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

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を更新したので、そのままにしておきたい)

113
Nicola Feltrin

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

$ 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)

イメージの開始からパーティションの開始までのオフセットを計算

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

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

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

現在、パーティションは/ dev/loop0にあります。 fsck、マウントなどができます

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

アンマウント

Sudo umount /mnt
Sudo losetup -d /dev/loop0
140
arrange

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

これにより、loop0p1の下にloop0p2および/dev/mapperが作成されました。出力から、パーティションを識別するのに役立つパーティションのサイズを確認できます。必要なものをマウントできます:

$ Sudo mount /dev/mapper/loop0p2 /mnt

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

enter image description here

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

$ Sudo umount /mnt
$ Sudo kpartx -d disk_image.raw
105
Joni

編集util-linux> = 2.21で動作します。執筆時点では、ubuntuにはバージョン2.20のみが付属しています

Fromman losetup

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

だからただ走る

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

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

26
Ludovic Ronsin

gnome-disk-image-mounterを試してください:

gnome-disk-image-mounter sda.img

いいえSudoは不要です。 USBドライブと同様に、/media/your_user_name/partition_nameにマウントされます。

9
Mihai Capotă

losetup -Pオートメーション

losetup -Pは、 https://askubuntu.com/a/496576/52975 で説明されているように、Ubuntu 16.04以降の最良の方法です。さらに自動化する機能があります。使用法:

$ 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"
)

loop module max_part config

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

loopは、Ubuntu 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デバイスに自動的にマウントします。

したがって、これはリブートする場合に最も便利な方法です。

こちらもご覧ください

Losetupを使用して、ディスクイメージ全体を添付します。

# Sudo losetup /dev/loop2 sda.img

次にmdadmを使用してmdデバイスを作成すると、すべてのパーティションに対してブロックデバイスが作成されます。

# Sudo mdadm --build --level=0 --force --raid-devices=1 /dev/md2 /dev/loop2
mdadm: array /dev/md2 built and started.

パーティションデバイスが表示されます。

nile-172-b0fef38-76:/mnt/sdb1 # ls -l /dev/md2*
brw-rw---- 1 root disk   9, 2 Oct 10 12:37 /dev/md2
brw-rw---- 1 root disk 259, 0 Oct 10 12:37 /dev/md2p1
5
Mike Bappe

私の意見では、最も簡単な方法は、前述のmount -o loop,offset=...を使用することです StackOverflowのこの回答で 。アイデアは次のとおりです。

fdisk -l $IMAGE
# calculate the offset in bytes
mount -o loop,offset=$OFFSET $IMAGE $MOUNTPOINT

マウントされたパーティションをアンマウントした後にループデバイスを削除する必要がないため、この方法が最適です。

タスクをさらに単純化するために(頻繁に行う場合に必要です)、私のスクリプトmountimgを使用してすべてを行うことができます。 https://github.com/AlexanderAmelkin/mountimg から取得して、次のように使用します。

mountimg /media/external_media/sda.img 2 /media/sda_image

必要に応じて、ファイルシステムのタイプとその他の追加マウントオプションを指定することもできます。

mountimg /media/external_media/sda.img 2 /media/sda_image -t vfat -o codepage=866,iocharset=utf-8

パーティションの処理が完了したら、単にumount it:

umount /media/sda_image
3