Làm cách nào để gắn hình ảnh thẻ sd được tạo bằng dd?


21

Tôi đã tạo một hình ảnh của thẻ SD Raspberry Pi của mình bằng cách sử dụng dd:

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

Thẻ SD bao gồm hai phân vùng (một vfat, một ext4) được gắn tự động khi tôi cắm thẻ vào.

Câu hỏi của tôi: Làm cách nào tôi có thể gắn các phân vùng này từ tệp .img?


Thêm chi tiết:

$ 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

Bạn muốn gắn hình ảnh mà không ghi nó vào thẻ SD?
OrangeTux

Có, tôi muốn có quyền truy cập đầy đủ vào hệ thống tệp được lưu trữ trong tệp .img để tôi có thể sao chép / sửa đổi / xóa / vv. các tệp không có thẻ SD
MrD

Có lẽ câu hỏi này giúp bạn.
OrangeTux

Thật không may, điều này không làm việc, đã thử cả hai lần. Cái đầu tiên không tạo ra thiết bị / dev / loop0p1. Cái thứ hai (tôi đã tính điểm bắt đầu tương ứng) đưa ra một wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or helper program, or other errorvấn đề
MrD

Ngoài ra, sudo fdisk -l /dev/loop0khiếu nại: Disk / dev / loop0 không chứa bảng phân vùng hợp lệ.
MrD

Câu trả lời:


33

Để tránh phải tạo các hình ảnh riêng biệt cho từng phân vùng hoặc cài đặt một tiện ích như thế nào kpartx, bạn có thể gắn từng phân vùng riêng lẻ bằng cách chỉ định một offsettrong mountlệnh.

Đầu tiên kiểm tra các phân vùng trong tệp hình ảnh và xác định phần bù bằng cách sử dụng 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

Lấy Startkhu vực của phân vùng bạn muốn và nhân giá trị đó với Unitskích thước. Vì vậy, nếu bạn muốn phân vùng thứ hai, bạn sẽ nhận được 540672 * 512 = 276824064.

Bây giờ tạo một thư mục và gắn kết phân vùng:

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

Khi bạn đã hoàn thành việc bạn muốn với dữ liệu phân vùng:

sudo umount rpi_partition2/
rm -r rpi_partition2/

17

Sau một số thử nghiệm bổ sung, tôi đã tìm thấy giải pháp cho mình: kpartx

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

Lệnh này được tạo /dev/mapper/loop0p1/dev/mapper/loop0p2. Sau đó, các phân vùng có thể được gắn thẳng về phía trước:

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

1

nếu mục tiêu của bạn là khám phá hoặc sửa đổi nội dung của một phân vùng (hệ thống tệp), dòng lệnh này sẽ gắn hệ thống tệp của thẻ sd kết xuất my_sdcard_dump.img vào thư mục 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

Xử lý một hình ảnh của toàn bộ đĩa với nhiều phân vùng là khá khó khăn . Linux không được thiết kế để đọc bảng phân vùng trong một tệp thông thường, ngay cả khi được gắn vào thiết bị loopback, do đó bạn phải xác định cẩn thận các phần bù của các phân vùng và chuyển chúng vào mountlệnh.

Cách tốt nhất là tạo các hình ảnh riêng biệt của từng phân vùng:

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

Bây giờ bạn có thể dễ dàng xử lý các tệp này như thể chúng là các phân vùng riêng lẻ trên một đĩa, gắn chúng như bạn thường làm phân vùng đĩa thực, bằng cách ánh xạ chúng vào một thiết bị lặp . Thiết bị lặp, hay thiết bị loopback, là một thiết bị ảo cung cấp lớp dịch cho Linux để coi tệp là một thiết bị khối (như đĩa hoặc phân vùng).

Các thiết bị vòng lặp thường /dev/loop0thông qua /dev/loop8. Xác định một thiết bị lặp không sử dụng bằng losetuplệnh:

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

Phản hồi này cho thấy một thiết bị vòng lặp chưa được gán. Bây giờ chúng ta có thể gán thiết bị lặp cho một trong các tệp hình ảnh của mình:

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

Sự vắng mặt của đầu ra từ lệnh này cho thấy thành công. Giờ đây, /dev/loop0đối với hầu hết các mục đích có chức năng tương đương với /dev/sdf1thẻ SD của bạn và bạn có thể gắn nó như bình thường:

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

Lặp lại quá trình sử dụng một thiết bị lặp khác để gắn kết phân vùng khác. Khi bạn hoàn tất, ngắt kết nối các hệ thống tệp và hủy gán các thiết bị lặp:

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

Tôi muốn tránh tạo hai tệp hình ảnh, bởi vì - trong số các lý do nhỏ khác - tôi muốn phân phối hình ảnh cho người khác để họ có thể sử dụng nó để khởi tạo thẻ SD của họ. Do đó, các phân vùng khác nhau như / boot, v.v. phải nằm trong một tệp.
MrD
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.