จะค้นหาประเภทไฟล์ img และติดตั้งอย่างไร?


36

ฉันต้องติดตั้งไฟล์. img แต่ไม่ทราบว่าเป็นไฟล์. img ฉันจะหาไฟล์. img ประเภทใดได้บ้าง

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

คำตอบ:


34

fdisk -l <img file>ลองใช้คำสั่ง โดยทั่วไปถ้า.imgไฟล์ทั้งหมดเป็นดิสก์จากการพูดของ KVM VM พวกเขากำลังเทคนิคดิสก์เสมือนจริง

ตัวอย่าง

ฉันมี CentOS KVM VM ซึ่งแสดงเช่นนั้นด้วยfileคำสั่ง:

$ 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

ทำงานfdiskกับมัน

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

หากคุณต้องการติดตั้งหนึ่งในพาร์ติชั่นเหล่านี้คุณสามารถทำได้ดังนี้:

fdisk (เอาต์พุตกระบอกสูบ)
  • ขนาดบล็อก 512 ไบต์และบล็อกเริ่มต้นคือ 63
  • ออฟเซ็ตคือ 512 * 63 = 32256
fdisk (ภาคเอาท์พุท)
  • block-size 512 ไบต์และ start-block คือ 1
  • ออฟเซ็ตคือ 512 * 1 = 512

ดังนั้นคำสั่ง mount จะเป็น:

ในกระบอกสูบ
$ mount -o loop,offset=32256 centostest.img /mnt/tmp

หากต้องการเมาท์พาร์ติชันอื่น (512 * 208845 = 106928640):

$ mount -o loop,offset=106928640 centostest.img /mnt/tmp
ในภาค
$ mount -o loop,offset=512 centostest.img /mnt/tmp

หากต้องการเมาท์พาร์ติชันอื่น (512 * 14 = 7168):

$ mount -o loop,offset=7168 centostest.img /mnt/tmp

บันทึก

วิธีนี้จะใช้งานได้หากการเมานต์สามารถกำหนดประเภทของระบบไฟล์ภายใน "พาร์ติชัน" ที่คุณพยายามเมาต์ คุณอาจต้องรวม-t autoหรือเจาะจงและบอกmountว่ามันเป็น-t ext4ตัวอย่าง

อ้างอิง


# 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 - คุณสามารถโพสต์ความคิดเห็นเหล่านี้เป็นอัปเดตสำหรับคำถามของคุณได้หรือไม่ ฉันไม่เห็นว่าเกิดอะไรขึ้น
slm

@Luigi - ไม่มีการรับประกันที่-t autoสามารถระบุประเภทของพาร์ติชันได้ คุณจะต้องลองคนอื่นดูว่าอะไรดี
slm

วิธีกำหนดออฟเซ็ตสำหรับพาร์ติชั่นที่ 2? ทำไม 512x14 และพาร์ติชันที่ 1 ของฉันW95 FAT16 (LBA) -t vfatล้มเหลวในการติดตั้งพาร์ติชันที่ 1 ของฉัน
Necktwi

21

ใช้partedเพื่อระบุค่าชดเชย

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) 

ตอนนี้คุณมีค่าออฟเซ็ตและคุณสามารถใช้ค่าเหล่านี้เพื่อเมานต์ระบบไฟล์

# 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
คำตอบหนึ่งหรือสองบรรทัดมักถูกพิจารณาว่าไม่มีประโยชน์ พิจารณาขยายคำอธิบายคำแนะนำหรือลิงก์ไปยังเอกสารที่เกี่ยวข้องหรือแหล่งข้อมูลที่เป็นประโยชน์
HalosGhost

ดีกว่าแน่นอนด้วยคำอธิบายเล็กน้อยคำตอบที่มีประสิทธิภาพที่สุดสำหรับฉันที่นี่ขอบคุณ Fayiz / HalosGhost!
tisc0

แบ่งเป็นส่วน: ฉลากดิสก์ที่ไม่รู้จัก
user180574

1

ดูเหมือนว่า @slm มีคณิตศาสตร์ว้าวุ่นใจหรืออย่างน้อยก็ไม่ตรงกับfdisk -lผลลัพธ์ จากการแก้ไขดูเหมือนว่าการเพิ่มuพารามิเตอร์เพื่อ fdisk เปลี่ยนจากถังเพื่อภาค? Dunno แต่มันไม่ได้ทำอะไรเลยตั้งแต่เริ่มต้นควรเป็นเซ็กเตอร์

ในภาพของฉัน:

$ 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

ที่ไหน

offset = Block size from 'Units' x Fdisk 'Start' column

ในตัวอย่างของฉัน fdisk กำลังพูดว่าเริ่มต้นที่ 2048 * 512 บล็อกขนาด = 1048576


1

เวอร์ชันที่ทันสมัยของfileคำสั่งรายงาน startector ด้วยวิธีที่สะดวกกว่า fdisk หรือแยกส่วน:

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

เอาต์พุตแบบหนึ่งบรรทัดสามารถเขียนสคริปต์เช่นนี้:

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 ระบบอัตโนมัติ

สคริปต์ต่อไปนี้จะเมาต์พาร์ติชันทั้งหมดของรูปภาพโดยอัตโนมัติ

การใช้งาน:

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

ผ่านการทดสอบใน Ubuntu 16.04

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.