Làm thế nào để tìm loại tập tin img và gắn kết nó?


36

Tôi phải gắn một tệp .img nhưng tôi không biết đó là loại .img. Làm thế nào tôi có thể tìm ra loại tập tin .img là gì?

# mount -t auto -o ro,loop gmapsupp.img /mnt/iso/
mount: you must specify the filesystem type
# file -k gmapsupp.img 
gmapsupp.img: x86 boot sector, code offset 0x0
#

Câu trả lời:


34

Hãy thử chạy lệnh fdisk -l <img file>. Thông thường nếu các .imgtệp là toàn bộ đĩa từ máy ảo KVM thì về mặt kỹ thuật chúng là đĩa ảo.

Thí dụ

Tôi đã có một máy ảo CentOS KVM xuất hiện như vậy với filelệ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 fdiskvớ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)
  • kích thước khối 512 byte và khối bắt đầu là 63.
  • Giá trị bù là 512 * 63 = 32256.
fdisk (đầu ra của ngành)
  • kích thước khối 512 byte và khối bắt đầu là 1.
  • Giá trị bù là 512 * 1 = 512.

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

CHÚ THÍCH

Đ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 mountrằng đó là -t ext4ví dụ.

Tài liệu tham khảo


# mount -t auto -o ro,loop,offset=512 gmapsupp.img /mnt/iso/\mount: you must specify the filesystem type
Luigi

# 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.
Luigi

@Luigi - bạn có thể đăng những bình luận này dưới dạng cập nhật cho câu hỏi của bạn không? Tôi không thể thấy những gì đang xảy ra.
slm

@Luigi - không có gì đảm bảo -t autocó 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.
slm

Làm thế nào để xác định bù cho phân vùng thứ 2? Tại sao 512x14? và phân vùng thứ 1 của tôi W95 FAT16 (LBA) -t vfatkhông thể gắn kết phân vùng thứ nhất của tôi.
Necktwi

21

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

1
Câu trả lời một hoặc hai dòng thường được coi là không hữu ích. Xem xét mở rộng giải thích về đề xuất của bạn hoặc liên kết đến tài liệu có liên quan hoặc các tài nguyên hữu ích.
HalosGhost

Chắc chắn tốt hơn với một chút giải thích, câu trả lời hiệu quả nhất cho tôi ở đây, cảm ơn Fayiz / HalosGhost!
tisc0

chia tay: nhãn đĩa không được nhận dạng
user180574

1

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 utham 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.


1

Một phiên bản hiện đại của filelệ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

1

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.