Bagaimana me-mount gambar sd-card yang dibuat dengan dd?

21

Saya telah membuat gambar kartu SD Raspberry Pi saya menggunakan dd:

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

SD-card mencakup dua partisi (satu vfat, satu ext4) yang secara otomatis dipasang ketika saya pasang kartu.

Pertanyaan saya: Bagaimana saya bisa me-mount partisi ini dari file .img?


Keterangan lebih lanjut:

$ 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
MrD
sumber
Anda ingin memasang gambar tanpa menulisnya ke kartu SD?
OrangeTux
Ya, saya ingin memiliki akses penuh ke sistem file yang disimpan dalam file .img sehingga saya dapat menyalin / memodifikasi / menghapus / etc. file tanpa memiliki kartu SD
MrD
Mungkin pertanyaan ini membantu Anda.
OrangeTux
Sayangnya ini tidak berhasil, coba kedua upaya. Yang pertama tidak membuat perangkat / dev / loop0p1. Yang kedua (saya sudah menghitung titik awalnya sesuai) melempar wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or helper program, or other errormasalah
MrD
Selain itu, sudo fdisk -l /dev/loop0klaim: Disk / dev / loop0 tidak mengandung tabel partisi yang valid.
MrD

Jawaban:

33

Untuk menghindari perlunya membuat gambar terpisah untuk setiap partisi atau memasang utilitas seperti kpartx, Anda dapat memasang setiap partisi secara terpisah dengan menentukan offsetdalam mountperintah.

Pertama, periksa partisi dalam file gambar dan tentukan offset dengan menggunakan 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

Ambil Startsektor partisi yang Anda inginkan dan gandakan nilainya dengan Unitsukurannya. Jadi, jika Anda menginginkan partisi kedua, Anda akan mendapatkannya 540672 * 512 = 276824064.

Sekarang buat folder dan pasang partisi:

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

Setelah Anda selesai melakukan apa yang Anda inginkan dengan data partisi:

sudo umount rpi_partition2/
rm -r rpi_partition2/
Makanan ternak
sumber
17

Setelah beberapa pengujian tambahan saya menemukan solusinya sendiri: kpartx

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

Perintah ini dibuat /dev/mapper/loop0p1dan /dev/mapper/loop0p2. Setelah itu, partisi ini dapat dipasang lurus ke depan:

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

jika tujuan Anda adalah untuk mengeksplorasi atau memodifikasi konten partisi (sistem file), baris perintah ini akan me-mount sistem file dump kartu sd my_sdcard_dump.img ke direktori 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 ]
davlar
sumber
0

Berurusan dengan gambar seluruh disk dengan banyak partisi cukup rumit . Linux tidak dirancang untuk membaca tabel partisi dari file biasa, bahkan ketika dilampirkan ke perangkat loopback, jadi Anda harus hati-hati mengidentifikasi offset partisi dan meneruskannya ke mountperintah.

Cara yang lebih disukai adalah membuat gambar terpisah dari setiap partisi:

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

Sekarang Anda dapat dengan mudah memperlakukan file-file ini seolah-olah mereka adalah partisi individual pada disk, memasangnya seperti yang biasa Anda lakukan pada partisi disk nyata, dengan memetakannya ke perangkat loop . Perangkat loop, atau perangkat loopback, adalah perangkat virtual yang menyediakan lapisan terjemahan untuk Linux untuk memperlakukan file sebagai perangkat blok (seperti disk atau partisi).

Perangkat loop biasanya /dev/loop0melalui /dev/loop8. Identifikasi perangkat loop yang tidak digunakan dengan losetupperintah:

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

Tanggapan ini menunjukkan perangkat loop yang tidak ditetapkan. Sekarang kita dapat menetapkan perangkat loop ke salah satu file gambar kita:

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

Tidak adanya output dari perintah ini menunjukkan keberhasilan. Sekarang /dev/loop0untuk sebagian besar keperluan secara fungsional setara dengan /dev/sdf1kartu SD Anda, dan Anda dapat memasangnya seperti biasa:

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

Ulangi proses menggunakan perangkat loop lain untuk me-mount partisi lain. Setelah selesai, unmount sistem file dan lepaskan perangkat loop:

sudo umount /dev/loop0
sudo losetup -d /dev/loop0
tgies
sumber
Saya ingin menghindari membuat dua file gambar, karena - di antara alasan-alasan kecil lainnya - saya ingin mendistribusikan gambar ke orang lain sehingga mereka dapat menggunakannya untuk menginisialisasi kartu SD mereka. Oleh karena itu, partisi yang berbeda seperti / boot dll harus dalam satu file.
MrD