วิธีการเมานต์ภาพการ์ด SD ที่สร้างด้วย dd?


21

ฉันสร้างรูปภาพของการ์ด Raspberry Pi ของฉันโดยใช้dd:

sudo dd if=/dev/sdf of=/home/myusername/raspberry-backup-2014-04-10.img

การ์ด SD มีสองพาร์ติชัน (หนึ่ง vfat หนึ่ง ext4) ซึ่งติดตั้งโดยอัตโนมัติเมื่อฉันเสียบการ์ด

คำถามของฉัน: ฉันจะติดตั้งพาร์ทิชันเหล่านี้จากไฟล์. img ได้อย่างไร


รายละเอียดเพิ่มเติม:

$ fdisk -l raspberry-backup-2014-04-10.img 

Disk raspberry-backup-2014-04-10.img: 3974 MB, 3974103040 bytes
255 heads, 63 sectors/track, 483 cylinders, total 7761920 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
Disk identifier: 0x000981cb

                          Device Boot      Start         End      Blocks   Id  System
raspberry-backup-2014-04-10.img1            8192      122879       57344    c  W95 FAT32 (LBA)
raspberry-backup-2014-04-10.img2          122880     7761919     3819520   83  Linux

คุณต้องการที่จะเมานต์ภาพโดยไม่ต้องเขียนลงในการ์ด SD?
OrangeTux

ใช่ฉันต้องการเข้าถึงระบบไฟล์ที่เก็บไว้ในไฟล์. img เพื่อให้ฉันสามารถคัดลอก / แก้ไข / ลบ / ฯลฯ ได้ ไฟล์ที่ไม่มีการ์ด SD
MrD

บางทีคำถามนี้อาจช่วยคุณได้
OrangeTux

น่าเสียดายที่นี่ใช้งานไม่ได้ลองทั้งสองครั้ง อันแรกไม่ได้สร้างอุปกรณ์ / dev / loop0p1 คนที่สอง (ฉันได้คำนวณจุดเริ่มต้นแล้ว) ทำให้wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or helper program, or other errorเกิดปัญหา
นาง

นอกจากนี้การsudo fdisk -l /dev/loop0อ้างสิทธิ์: ดิสก์ / dev / loop0 ไม่มีตารางพาร์ติชันที่ถูกต้อง
MrD

คำตอบ:


33

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

ก่อนอื่นให้ตรวจสอบพาร์ติชั่นในไฟล์อิมเมจและกำหนดออฟเซ็ตโดยใช้fdisk:

$ fdisk -u -l rpi_image280914 

Disk rpi_image280914: 16.0 GB, 16012804096 bytes
255 heads, 63 sectors/track, 1946 cylinders, total 31275008 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
Disk identifier: 0x000cdac7

           Device Boot      Start         End      Blocks   Id  System
rpi_image280914p1   *        2048      514047      256000    c  W95 FAT32 (LBA)
rpi_image280914p2          540672    31242239    15350784   83  Linux

ใช้Startเซกเตอร์ของพาร์ติชันที่คุณต้องการและคูณค่านั้นด้วยUnitsขนาด 540672 * 512 = 276824064ดังนั้นหากคุณต้องการพาร์ทิชันที่สองคุณจะได้รับ

ตอนนี้สร้างโฟลเดอร์และติดตั้งพาร์ทิชัน:

mkdir rpi_partition2
sudo mount -o loop,offset=276824064 rpi_image280914 rpi_partition2/

เมื่อคุณทำสิ่งที่คุณต้องการด้วยข้อมูลพาร์ติชัน:

sudo umount rpi_partition2/
rm -r rpi_partition2/

17

หลังจากการทดสอบเพิ่มเติมฉันพบวิธีแก้ปัญหาด้วยตัวเอง: kpartx

sudo kpartx -a raspberry-backup-2014-04-10.img

คำสั่งนี้จะถูกสร้างขึ้นและ/dev/mapper/loop0p1 /dev/mapper/loop0p2หลังจากนั้นพาร์ติชันเหล่านี้สามารถติดตั้งตรงไปข้างหน้า:

sudo mount -o rw -t ext4 /dev/mapper/loop0p2 mount_target/

1

ถ้าเป้าหมายของคุณคือการสำรวจหรือปรับเปลี่ยนเนื้อหาของพาร์ทิชัน (File System) ที่บรรทัดคำสั่งนี้จะติดตั้งระบบไฟล์ของการ์ด SD การถ่ายโอนข้อมูลmy_sdcard_dump.imgลงในไดเรกทอรีmount_dir

part_id=2; INFILE=my_sdcard_dump.img; MOUNTPT=mount_dir PARTITION=${part_id}; sudo mount "$INFILE" "$MOUNTPT" -o loop,offset=$[ `/sbin/sfdisk -d "$INFILE" | grep "start=" | head -n $PARTITION | tail -n1 | sed 's/.*start=[ ]*//' | sed 's/,.*//'` * 512 ]

0

การจัดการกับภาพของดิสก์ทั้งที่มีหลายพาร์ติชันเป็นค่อนข้างยุ่งยาก Linux ไม่ได้ออกแบบมาเพื่ออ่านตารางพาร์ติชั่นจากไฟล์ปกติ, แม้ว่าจะต่อกับอุปกรณ์ลูปแบ็ค, ดังนั้นคุณต้องระบุออฟเซ็ตของพาร์ติชั่นอย่างระมัดระวังและส่งต่อไปยังmountคำสั่ง.

วิธีที่ดีกว่าคือการสร้างอิมเมจแยกกันของแต่ละพาร์ติชัน:

sudo dd if=/dev/sdf1 of=/home/myusername/raspberry-backup-sdf1-2014-04-10.img
sudo dd if=/dev/sdf2 of=/home/myusername/raspberry-backup-sdf2-2014-04-10.img

ตอนนี้คุณสามารถรักษาไฟล์เหล่านี้ราวกับว่าพวกเขาแต่ละพาร์ทิชันบนดิสก์การติดตั้งพวกเขาตามปกติพาร์ทิชันดิสก์จริงโดยการทำแผนที่ไปยังอุปกรณ์ห่วง อุปกรณ์ลูปหรืออุปกรณ์ลูปแบ็คเป็นอุปกรณ์เสมือนที่ให้เลเยอร์การแปลสำหรับลีนุกซ์เพื่อใช้ไฟล์เป็นอุปกรณ์บล็อก (เช่นดิสก์หรือพาร์ติชั่น)

อุปกรณ์ห่วงมักจะผ่าน/dev/loop0 /dev/loop8ระบุอุปกรณ์ลูปที่ไม่ได้ใช้ด้วยlosetupคำสั่ง:

$ sudo losetup /dev/loop0
loop: can't get info on device /dev/loop0: No such device or address

การตอบสนองนี้บ่งชี้ว่าอุปกรณ์ลูปที่ไม่ได้กำหนด ตอนนี้เราสามารถกำหนดอุปกรณ์วนรอบให้กับหนึ่งในไฟล์ภาพของเรา:

$ sudo losetup /dev/loop0 /home/myusername/raspberry-backup-sdf1-2014-04-10.img

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

sudo mount -t vfat /dev/loop0 /media/sdimage-1

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

sudo umount /dev/loop0
sudo losetup -d /dev/loop0

ฉันต้องการหลีกเลี่ยงการสร้างไฟล์ภาพสองไฟล์เพราะ - ด้วยเหตุผลเล็ก ๆ น้อย ๆ อื่น ๆ - ฉันต้องการแจกจ่ายภาพให้กับคนอื่น ๆ เพื่อให้พวกเขาสามารถใช้เพื่อเริ่มต้นการ์ด SD ของพวกเขาด้วย ดังนั้นพาร์ติชั่นต่าง ๆ เช่น / boot เป็นต้นต้องอยู่ในไฟล์เดียว
MrD
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.