私はディスク全体のイメージを作成した
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
これによりloop0p1
、loop0p2
の下に作成されます/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 -P
Ubuntu 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 より前の適切な方法です。
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
デバイスに自動的にマウントします。
したがって、再起動しても構わない場合、これが最も便利な方法です。
参照
- https://unix.stackexchange.com/questions/9099/ディスク全体のイメージからファイルシステムを読み取る
- https://superuser.com/questions/117136/how-can-i-mount-a-partition-from-dd-created-image-of-a-block-device-eg-hdd-u
- ディスク(デバイス)全体のイメージから単一のパーティションをマウントする
- https://stackoverflow.com/questions/1419489/loopback-mounting-individual-partitions-from-within-a-file-that-contains-a-parti