เมาท์พาร์ติชันเดียวจากอิมเมจของดิสก์ทั้งหมด (อุปกรณ์)


117

ฉันสร้างภาพดิสก์ทั้งหมดด้วย

dd if=/dev/sda of=/media/external_media/sda.img

ตอนนี้ปัญหาคือฉันต้องการติดตั้งระบบไฟล์ ext4 ที่อยู่บนดิสก์นั้น แต่

mount -t ext4 -o loop /media/external_media/sda.img /media/sda_image

เห็นได้ชัดว่าให้ข้อผิดพลาด superblock เนื่องจากภาพที่มีทั้งดิสก์ (MBR, พาร์ทิชันอื่น ๆ ) ไม่เพียง แต่พาร์ทิชันที่ฉันต้องการ ดังนั้นฉันคิดว่าฉันควรหาวิธีที่จะทำให้ภาพดิสก์ปรากฏใน/dev/โฟลเดอร์ ...

ไม่มีใครรู้วิธีการทำเช่นนั้น?

PS: ฉันสามารถddสำรองภาพไปยังดิสก์ดั้งเดิมได้ตลอดเวลา แต่นั่นจะไม่สะดวกมาก (ฉันอัปเดตระบบปฏิบัติการและฉันต้องการเก็บไว้ตามเดิม)

คำตอบ:


142

รับเค้าโครงพาร์ติชันของรูปภาพ

$ 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

ขอบคุณมาก! ทำงานเหมือนจับใจ! คุณทำให้วันของฉัน (และบันทึก Ocelot ผู้บริสุทธิ์จากการถูกลบอย่างไร้ความปราณี;)
Nicola Feltrin

8
อย่างน้อยในทุบตีเปลือกยังสามารถทำคณิตศาสตร์สำหรับคุณ:sudo losetup -o $((56*512)) /dev/loop0 sda.img
Enno Groper

1
มันไม่ได้มีประโยชน์อะไรนี่มันยอดเยี่ยมจริงๆ
andho

เกิดอะไรขึ้นถ้ามี. img1 และ. img2 "win8.raw1 * 2048 718847 358400 7" และ "win8.raw2 718848 52426751 25853952 7"
Enkouyami

6
mount -o loop,offset=$((56 * 512)) sda.img /mntได้ง่าย: ที่มา: madduck.net/blog/…
ostrokach

105

อัปเดตสำหรับ Ubuntu 16.04:ด้วยสิ่งใหม่losetupนี้ง่ายกว่า:

sudo losetup -Pf disk_image.raw

ดูคำตอบที่เหลือสำหรับ Ubuntu รุ่นเก่า


วิธีแก้ปัญหาอย่างง่ายคือการใช้kpartx : มันจะทำการหาเลย์เอาต์พาร์ติชั่นและแมปแต่ละอันเข้ากับอุปกรณ์บล็อก หลังจากนั้นสิ่งที่คุณต้องทำคือติดตั้งสิ่งที่คุณต้องการ

เปิด Terminal ค้นหาอิมเมจของดิสก์และป้อนคำสั่งนี้:

$ 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

คำตอบที่ยอดเยี่ยมง่ายและรวดเร็วโดยหลีกเลี่ยงขั้นตอนการคูณเป็นเรื่องที่ดี
Elder Geek

sudo apt-get install kpartx- เพื่อรับสิทธิ์เข้าถึง kpartx kpartxการเชื่อมโยงในจุดเริ่มต้นของการโพสต์เป็น 'กับดัก' ในความคิดของฉัน ลิงค์ที่บ่งบอกถึงการติดตั้งซอฟต์แวร์นั้นไม่มีข้อแม้
Hannu

1
@Hannu การเชื่อมโยงที่รวมเข้ากับ Software Center เป็นหลักปฏิบัติทั่วไปของ askubuntuถึงแม้ว่าในกรณีนี้จะสามารถเพิ่มไอคอนทั่วไปและควรอัปเดต URL
Joni

losetup -Pfได้รับการกล่าวถึงก่อนหน้านี้โดยaskubuntu.com/a/496576/52975ฉันขอแนะนำให้คุณลิงค์อย่างน้อยกับคำตอบนั้น
Ciro Santilli 新疆改造中心法轮功六四事件

1
FYI losetup -Pf ..คำสั่งจะสร้างอุปกรณ์เช่น/dev/loopXpYที่คุณยังคงต้องเมานต์ คุณสามารถหาได้Xจากการดูผลลัพธ์ของlosetupคำสั่ง Yเป็นจำนวนพาร์ทิชัน
Gunchars

26

แก้ไข : ทำงานร่วมกับutil ลินุกซ์> ตอนที่เขียนอูบุนตูมาพร้อมกับเวอร์ชั่น2.20เท่านั้น

จากการสูญเสียของมนุษย์ :

       -P, --partscan
          force kernel to scan partition table on newly created loop device

ดังนั้นเพียงแค่เรียกใช้

$ sudo losetup -f --show -P /path/to/image.img

เพื่อสร้างโหนดอุปกรณ์สำหรับทุกพาร์ติชันของดิสก์อิมเมจของคุณบนอุปกรณ์ลูปที่ไม่ได้ใช้ครั้งแรกและพิมพ์ไปยัง stdout หากใช้/dev/loop0อุปกรณ์มันจะสร้างอย่างน้อย/dev/loop0p1คุณจะสามารถเมานต์ได้ตามปกติ


2
ฉันจะหาเวอร์ชั่นนี้ได้จากlosetupที่ไหน? อันที่ฉันมีใน Ubuntu 14.04 มี manpage ตั้งแต่เดือนกรกฎาคม 2003 (util-linux) และไม่มีตัวเลือก `-P '(หรืออย่างอื่น) สำหรับการสแกนพาร์ติชัน
Hannu

1
ขออภัยฉันทำผิดพลาดฉันใช้ตัวเลือกนี้กับ Arch Linux ซึ่งมาพร้อมกับแพ็คเกจ util-linux รุ่นใหม่กว่า ดูเหมือนว่าอูบุนตูติดอยู่อย่างน่าเศร้าในเวอร์ชั่น 2.20.1 ซึ่งเผยแพร่เมื่อวันที่มกราคม 2555! --partscanตัวเลือกที่ได้รับการแนะนำในutil ลินุกซ์ 2.21
Ludovic Ronsin

1
ดีgnome-disksมีตัวเลือกที่จะติดภาพดิสก์และมันเป็นพาร์ทิชัน (<- นั่นคือสำหรับการติดตั้งและทุบตี / การใช้เทอร์มินัลDisksในประพบว่ามันเกินไป)
Hannu

2
นี้ควรจะเป็นคำตอบที่ได้รับการยอมรับ ...
matthid

@matthid เป็นไปได้ไหมที่จะเปลี่ยนคำตอบที่ยอมรับได้? นี่เป็นสิ่งที่ดี (และคำตอบ kpartx ขึ้นอยู่กับเวอร์ชันนี้losetup) แต่มันใหม่กว่าสามปีกว่าคำตอบที่ยอมรับ - ซึ่งเป็นวิธีการทำในเวลานั้น
Auspex

9

ลองgnome-disk-image-mounter:

gnome-disk-image-mounter sda.img

ไม่sudoจำเป็น มันจะถูกติดตั้งที่/media/your_user_name/partition_nameเช่นเดียวกับไดรฟ์ USB


1
ทำงานได้ดีในวันที่ 16.04 ฉันเพิ่งติดตั้ง 18.04 ใหม่และเครื่องมือขอรหัสผ่าน sudo เพื่อเข้าถึง / dev / loopXX อุปกรณ์เสมือน :(
Laurent

7

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 config

นี่เป็นวิธีการที่ดีก่อน 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/grubsudo update-grub

จะตั้งค่าพารามิเตอร์โมดูลได้อย่างไร : วิธีการเพิ่มพารามิเตอร์โมดูลเคอร์เนล

หลังจากรีบู๊ตเมื่อคุณ:

sudo losetup -f --show my.img

มันติดภาพไปยัง/dev/loopXอุปกรณ์และพาร์ทิชันโดยอัตโนมัติไปยัง/dev/loopXpYอุปกรณ์

ดังนั้นนี่เป็นวิธีที่สะดวกที่สุดถ้าคุณเต็มใจที่จะรีบูต

ดูสิ่งนี้ด้วย


5

ใช้ losetup เพื่อแนบภาพดิสก์ทั้งหมด

# sudo losetup /dev/loop2 sda.img

จากนั้นใช้ mdadm เพื่อสร้างอุปกรณ์ md และอุปกรณ์บล็อกจะถูกสร้างขึ้นสำหรับพาร์ติชันทั้งหมด

# sudo mdadm --build --level=0 --force --raid-devices=1 /dev/md2 /dev/loop2
mdadm: array /dev/md2 built and started.

ตอนนี้คุณควรเห็นอุปกรณ์พาร์ทิชัน

nile-172-b0fef38-76:/mnt/sdb1 # ls -l /dev/md2*
brw-rw---- 1 root disk   9, 2 Oct 10 12:37 /dev/md2
brw-rw---- 1 root disk 259, 0 Oct 10 12:37 /dev/md2p1

นั่นเป็น :) เคล็ดลับตลก
โยฮัน Boule

4

วิธีที่ง่ายที่สุดในความคิดของฉันคือการใช้mount -o loop,offset=...เป็นที่กล่าวถึงในคำตอบนี้ใน StackOverflow แนวคิดมีดังนี้:

fdisk -l $IMAGE
# calculate the offset in bytes
mount -o loop,offset=$OFFSET $IMAGE $MOUNTPOINT

วิธีนี้ดีที่สุดเพราะไม่จำเป็นต้องลบอุปกรณ์ลูปหลังจากที่คุณขยายพาร์ติชันที่เมาท์

เพื่อให้งานง่ายขึ้น (ซึ่งจำเป็นหากคุณทำบ่อย) คุณอาจใช้สคริปต์ของฉันmountimgเพื่อทำทุกอย่างให้คุณ เพิ่งได้รับจากhttps://github.com/AlexanderAmelkin/mountimg และใช้ดังนี้:

mountimg /media/external_media/sda.img 2 /media/sda_image

คุณอาจระบุประเภทของระบบไฟล์และตัวเลือกการเมาท์อื่น ๆ ได้เช่นกันหากคุณต้องการ:

mountimg /media/external_media/sda.img 2 /media/sda_image -t vfat -o codepage=866,iocharset=utf-8

เมื่อคุณทำพาร์ติชั่นเสร็จแล้วumountก็:

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