我用以下命令製作了整個磁碟的映像
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
將映像備份到原始磁碟,但這會非常不方便(我更新了作業系統,我想保持原樣)
答案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/loop0。你可以FSCK它,安裝它等等
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 的其餘答案。
一個簡單的解決方案是使用克帕特克斯:它將計算出分區佈局並將每個分區映射到區塊設備。之後您所要做的就是安裝您想要的。
開啟終端,找到磁碟映像,然後輸入以下命令:
$ 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
編輯: 與util-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
表示設備可以產生多少個分區。
0
Ubuntu 14.04 上預設是這樣,這就是為什麼不會發生自動分割的原因。
要更改它,我們可以添加:
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/reading-a-filesystem-from-a-whole-disk-image
- 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