Câu trả lời:
Hãy thử chạy lệnh fdisk -l <img file>
. Thông thường nếu các .img
tệp là toàn bộ đĩa từ máy ảo KVM thì về mặt kỹ thuật chúng là đĩa ảo.
Tôi đã có một máy ảo CentOS KVM xuất hiện như vậy với file
lệnh:
$ file centostest.img
centostest.img: x86 boot sector; partition 1: ID=0x83, active, starthead 1, startsector 63, 208782 sectors; partition 2: ID=0x8e, starthead 0, startsector 208845, 20755980 sectors, code offset 0x48
Chạy fdisk
với nó:
$ sudo /sbin/fdisk -lu /kvm/centostest.img
last_lba(): I don't know how to handle files with mode 81ed
You must set cylinders.
You can do this from the extra functions menu.
Disk /kvm/centostest.img: 0 MB, 0 bytes
255 heads, 63 sectors/track, 0 cylinders, total 0 sectors
Units = sectors of 1 * 512 = 512 bytes
Device Boot Start End Blocks Id System
/kvm/centostest.img1 * 63 208844 104391 83 Linux
/kvm/centostest.img2 208845 20964824 10377990 8e Linux LVM
Partition 2 has different physical/logical endings:
phys=(1023, 254, 63) logical=(1304, 254, 63)
Nếu bạn muốn gắn kết một trong những phân vùng này, bạn có thể làm như sau:
fdisk (đầu ra xi lanh)Vì vậy, lệnh mount sẽ là:
trong xi lanh$ mount -o loop,offset=32256 centostest.img /mnt/tmp
Để gắn kết phân vùng khác (512 * 208845 = 106928640):
$ mount -o loop,offset=106928640 centostest.img /mnt/tmp
trong các lĩnh vực
$ mount -o loop,offset=512 centostest.img /mnt/tmp
Để gắn kết phân vùng khác (512 * 14 = 7168):
$ mount -o loop,offset=7168 centostest.img /mnt/tmp
Điều này sẽ chỉ hoạt động nếu mount có thể xác định loại hệ thống tập tin trong "phân vùng" mà bạn đang cố gắn kết. Bạn có thể cần bao gồm -t auto
, hoặc cụ thể và nói mount
rằng đó là -t ext4
ví dụ.
# fdisk -l gmapsupp.img Disk gmapsupp.img: 0 MB, 0 bytes 255 heads, 63 sectors/track, 0 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System gmapsupp.img1 1 9 65536 0 Empty Partition 1 has different physical/logical endings: phys=(1023, 15, 8) logical=(8, 40, 32) Partition 1 does not end on cylinder boundary.
-t auto
có thể xác định loại phân vùng. Bạn sẽ phải thử người khác để xem những gì hoạt động.
W95 FAT16 (LBA)
-t vfat
không thể gắn kết phân vùng thứ nhất của tôi.
Sử dụng parted
để xác định giá trị bù.
root@mysystem:~/# parted myimage.img
GNU Parted 2.3
Using /root/myimage.img
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) u
Unit? [compact]? B
(parted) print
Model: (file)
Disk /root/myimage.img: 8589934592B
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 32256B 254983679B 254951424B primary ext3 boot
2 254983680B 1274918399B 1019934720B primary linux-swap(v1)
3 1274918400B 3323013119B 2048094720B primary ext3
4 3323013120B 8587192319B 5264179200B primary ext3
(parted)
Bây giờ bạn có các giá trị bù và bạn có thể sử dụng các giá trị đó để gắn kết các hệ thống tập tin.
# mount -o loop,offset=32256 myimage.img /mnt/disk1
# mount -o loop,offset=1274918400 myimage.img /mnt/disk2
# mount -o loop,offset=3323013120 myimage.img /mnt/disk3
Có vẻ như @slm có một số phép toán hay, hoặc ít nhất là không khớp với fdisk -l
đầu ra. Từ các sửa đổi, có vẻ như việc thêm u
tham số vào fdisk đã thay đổi từ hình trụ sang các ngành? Dunno, nhưng nó không làm bất cứ điều gì của tôi vì mặc định sẽ là các ngành.
Trên hình ảnh của tôi:
$ fdisk -l bone-debian-7.5-2015-01-14-beaglebone.img
Disk bone-debian-7.5-2015-01-14-beaglebone.img: 3.7 GiB, 3965190144 bytes, 7744512 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
bone-debian-7.5-2015-01-14-beaglebone.img1 * 2048 198655 98304 e W95 FAT16 (LBA)
bone-debian-7.5-2015-01-14-beaglebone.img2 198656 3481599 1641472 83 Linux
$ sudo mount -t vfat -o loop,offset=1048576,ro bone-debian-7.5-2015-01-14-beaglebone.img /mnt
Ở đâu
offset = Block size from 'Units' x Fdisk 'Start' column
Trong ví dụ của tôi, fdisk đang nói bắt đầu từ 2048 * 512 kích thước khối = 1048576.
Một phiên bản hiện đại của file
lệnh báo cáo bộ khởi động theo cách thuận tiện hơn nhiều so với fdisk hoặc chia tay:
file $img
Armbian_jw.img: DOS/MBR boot sector; partition 1 : ID=0x83, start-CHS (0x40,0,1), end-CHS (0x3ff,3,32), startsector 8192, 2883584 sectors
Đầu ra một lớp này có thể được viết theo kịch bản như sau:
startsector=$(file $img | sed -n -e 's/.* startsector *\([0-9]*\),.*/\1/p')
offset=$(expr $startsector '*' 512)
echo $offset
4194304
sudo mount -o loop,offset=$offset $img /mnt
losetup -P
tự động hóa
Các tập lệnh sau tự động gắn kết tất cả các phân vùng của một hình ảnh.
Sử dụng:
$ 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
Nguồn:
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"
)
Đã thử nghiệm trong Ubuntu 16.04.
# mount -t auto -o ro,loop,offset=512 gmapsupp.img /mnt/iso/
\mount: you must specify the filesystem type