Bagaimana cara membuat gambar (.img) dari apa yang ada di kartu SD (tapi sekompleks yang asli)?

20

Saya mencoba:

sudo dd bs=4k if=/dev/mmcblk0 of=/media/1BAB47551C66A42B/raspbian_migs2.gz

Ini menciptakan file .img dengan 7,6 GB (ukuran kartu, TAPI apa yang ada di kartu memiliki 700 MB).

Dan:

sudo dd bs=4k if=/dev/mmcblk0 | gzip > /media/1BAB47551C66A42B/raspbian_migs2.gz

membuat file .gz dengan 2,7 GB.

Raspbian asli ( Debian 7 (Wheezy)) dari http://www.raspberrypi.org/downloads memiliki 494,44 MiB.

Dari apa yang ada di kartu SD, bagaimana saya bisa membuat gambar dengan ukuran yang sama?

(Saya di Ubuntu.)

mf_
sumber

Jawaban:

18

Anda menyebutkan dalam komentar kepada RooTer bahwa A) Anda telah mengurangi ukuran partisi awal gparted, tetapi ddmasih menyalin seluruh kartu, dan B) yang ingin Anda sertakan kedua partisi dalam gambar.

Masalah "A" mudah dijelaskan: Anda masih menyalin seluruh kartu karena itu yang /dev/mmcblk0dimaksud. Partisi individual tentu saja /dev/mmcblk0p1dan /dev/mmcblk0p2. Ini adalah komplikasi dalam masalah "B", tetapi Anda tidak bisa hanya ddsetiap partisi dan menggabungkan dua file bersama-sama, karena tabel partisi di awal /dev/mmcblk0 yang mengindeks awal dan panjang masing-masing partisi. Tanpa itu, gambar tidak akan dapat digunakan.

Namun, Anda bisa mendapatkan panjang masing-masing partisi fdisk -l, dan menggunakannya untuk menentukan beberapa parameter dd. Sebagai contoh:

> fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 16.1 GB, 16138633216 bytes
4 heads, 16 sectors/track, 492512 cylinders, total 31520768 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: 0x00017b69

Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1    8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2  122880    26746879    13312000   83  Linux

Unit "Start" dan "End" adalah sektor, dan perhatikan ukuran sektor diberikan, 512 byte. Untuk /dev/mmcblk0p2, 26746879 (sektor terakhir) - 122880 (sektor pertama) = 26623999/2 (untuk 2 sektor per kB) / 1024 (kB per MB) / 1024 (MB per GB) = 12,69, yang saya tumbuhkan partisi menggunakan gparted hingga 12 GB, jadi ini terlihat benar (sebenarnya saya harus menggunakan 1000 dan bukan 1024 sebagai pembagi dengan penyimpanan, yang berfungsi hingga 13,31 GB, tapi saya curiga gparted dan beberapa alat lain juga menggunakan 1024).

Jadi hal pertama yang ingin Anda periksa adalah bahwa partisi kedua Anda benar-benar ukuran yang lebih kecil dari yang Anda atur. Selanjutnya, cukup gunakan angka-angka itu dengan dd; bagi saya itu akan:

dd if=/dev/mmcblk0 of=rpi.img bs=512 count=26746880

Saya memiliki sektor tambahan di sana untuk menghindari segala jenis gangguan karena salah paham tentang cara ddkerjanya. Ada cara sederhana untuk memeriksa apakah ini berhasil:

> fdisk -l rpi.img

Disk rpi.img: 102 MB, 102400000 bytes
255 heads, 63 sectors/track, 12 cylinders, total 200000 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: 0x00017b69

Device Boot      Start         End      Blocks   Id  System
rpi.img1          8192      122879       57344    c  W95 FAT32 (LBA)
rpi.img2        122880    26746879    13312000   83  Linux

Perhatikan ada sedikit perbedaan di sini: sektor "Mulai" dan "Akhir" cocok dengan tabel partisi asli, tetapi ukuran total dalam statistik di atas hanya 102 MB! Ini karena saya benar-benar digunakan count=200000sebagai param ddkarena saya tidak benar-benar ingin repot dengan salinan 12 GB (perhatikan juga "total sektor 2.000.000"). Alasan tabel di bagian bawah tidak mencerminkan hal ini adalah karena fdisk mendapatkan informasinya dari data partisi yang disalin kata demi kata di awal gambar dari awal kartu SD, yang, seperti yang saya sebutkan pada paragraf kedua, sangat penting untuk mempertahankan. Jika saya (benar) menyalin sisanya, angka-angka akan menjadi copacetic dan gambar akan layak.

Cobalah. :)

goldilocks
sumber
Pada OSX, fdisk tidak dengan jelas mencetak ukuran sektor dalam byte. Sebagai gantinya, ia menawarkan "geometri: 966/255/63 [15523840 sektor]" yang mewakili silinder / kepala / sektor. Nilai bs dan hitungan apa yang harus digunakan dalam kasus ini?
Arthur Hebert
@ArthurHebert: Total byte / total sektor. Misalnya dalam kasus pertama di atas akan menjadi 16138633216/31520768 = 512, dalam yang kedua 102400000/200000 = 512.
goldilocks
1
Anda dapat menggunakan fdisk -l <device>dan itu harus mencetak tabel tanpa masuk ke mode interaktif.
berto
5

Saya kira masalahnya terletak pada sektor yang pernah digunakan yang masih memiliki kotoran di dalamnya. Setelah file dihapus, hanya metadata yang dihapus dari sistem file, bukan data itu sendiri, sehingga menyisakan beberapa angka nol acak alih-alih mudah dikompresi dengan blok nol saja.

Solusi mudah, tetapi membutuhkan penulisan ulang semua ruang kosong pada kartu. Ingatlah bahwa umur kartu SD terbatas oleh jumlah penulisan ulang, jadi ini bukan metode yang disukai.

dd bs=4M if=/dev/zero of=/root/junk
sync
rm junk

Solusi yang lebih terlibat, karena Anda perlu menginstal zerofree di komputer lain yang tidak akan menggunakan kartu SD pada saat itu.

zerofree /dev/mmcblk0p2

Untuk lebih lanjut baca di http://intgat.tigress.co.uk/rmy/uml/index.html

Yang harus Anda ingat adalah bahwa melakukan dd dari / dev / mmcblk0 Anda menyalin seluruh perangkat, bahkan jika partisi lebih kecil. Jika Anda menggunakan raspi-config untuk memperluas partisi utama sebelum melakukan salah satu metode di atas, Anda akan baik-baik saja.

NB. Jika Anda tidak keberatan mengubah format file gambar, Anda dapat menggunakan partimage yang untuk sistem file yang dikenal menghilangkan blok yang dibebaskan bahkan jika masih ada sedikit kotoran di dalamnya. Sekali lagi partimage paling baik digunakan ketika filesystem tidak dipasang untuk menghindari korupsi cadangan. Anda mungkin bisa lolos dengan remount hanya-baca, tapi saya akan menyerahkannya pada kebijaksanaan Anda.

Simpatisan
sumber
sebagai bagian dari pencarian saya berusaha untuk mendapatkan ini dilakukan, saya menggunakan GParted untuk mengurangi partisi sdcard untuk acomodate hanya data yang saya miliki, maka saya mencoba dd ing dan hasilnya file yang 7.6GB sama, tidak bisa partimage Hemat 2 partisi (/ boot + /) ke dalam 1 gambar
mf_
mungkin saya tidak membuatnya cukup jelas - itu akan membuat perbedaan ketika Anda mengompresnya, seperti yang Anda coba dengan gzip sebelumnya.
RooTer
mengisi kartu dengan cara ini akan menyebabkan banyak siklus tulis dan akan memperpendek umur kartu. cobadd bs=4M if=/dev/zero of=/root/junk
nc4pk
@ disadap-keluar thx, diedit;)
RooTer
4

Jawaban singkat - gunakan kartu SD 2GB.

Jawaban panjang, ddtidak tahu di mana data "baik" berakhir, Anda harus mengatakannya entah bagaimana.

Ada dua cara, yang paling mudah adalah menggunakan kartu SD 2GB, yang secara otomatis akan berhenti menyalin melebihi 2GB dan akan menghasilkan file terkompresi 500MB seperti yang Anda inginkan.

Cara lain, yang lebih rumit yang terlibat, adalah menghitung ukuran data yang benar dari tabel partisi Anda dan menentukan ukuran yang benar ini sebagai parameter untuk ddperintah. Anda dapat menggunakan parameter bs=XXX(ukuran blok) dan count=XXX(jumlah blok) untuk tujuan itu. Misalnya, Anda dapat menentukan bs=10Mukuran blok 10MB (yang pasti akan membuat penyalinan jauh lebih cepat dibandingkan dengan ukuran blok 4k yang Anda gunakan dalam perintah Anda) dan count=200untuk menyalin 10MB * 200 = 2000MB (2GB). Anda mungkin perlu menyesuaikan ukuran blok dan jumlah blok menurut skema partisi kartu SD Anda .

lenik
sumber
1
Memberikan ddukuran tertentu tidak akan pernah berhasil. Itu mengandaikan semua data aktual dalam sistem file disusun dengan rapi di awal perangkat, jadi jika Anda memiliki 2GB pada partisi 8 GB Anda hanya perlu menyalin 2GB pertama. Ini salah. Data 2 GB itu akan tersebar di seluruh ruang, terutama pada kartu SD modern yang tidak menggunakan kembali blok dua kali sampai semua blok yang tersedia telah digunakan setidaknya satu kali (ini disebut leveling keausan dan memperpanjang umur kartu).
goldilocks
@goldilocks bagaimana jika saya mengubah ukuran sdcard untuk mengecilkan semua partisi ke ukuran maksimum yang dimungkinkan (hanya data) ??
mf_
@goldilocks tolong, baca pertanyaan dan jawabannya lebih hati-hati, saya berbicara tentang partisi 2GB pada kartu SD 8GB, bukan tentang data 2GB pada partisi 8GB, seperti yang dibayangkan oleh imajinasi liar Anda.
lenik
1
lenik: Ya saya agak kaget saya menafsirkan Anda seperti itu, semua permintaan maaf - sayangnya saya tidak dapat membalikkan downvote saya kecuali Anda mengedit posting: / meskipun saya masih tidak berpikir jawaban ini sangat berguna (jangan tersinggung - - karena ini bukan hanya partisi , instruksi tentang cara melakukan itu, sekali lagi, tidak berguna), tetapi saya akan melakukannya. @ mf_ Ya, itu bisa dilakukan (apakah Anda membaca jawaban saya? Ini akan berhasil ...)
goldilocks
@goldilocks Saya sudah mengedit jawabannya. Tidak tahu mengapa itu tidak berguna, terutama ketika Anda memberikan jawaban yang sama persis, hanya dengan lebih banyak detail.
lenik
1

dd - copy and convertbukan alat yang tepat untuk melakukan pekerjaan yang Anda minta. Ini adalah level rendah, salinan sektor per sektor (dan konversi), yang bagus untuk menyalin sektor boot, memformat perangkat, dan segala macam tugas tingkat rendah. Saat Anda menggunakan, ddAnda menyalin sektor per sektor ke gambar, bahkan jika itu tidak termasuk dalam Struktur Sistem File.

Gambar-gambar yang disediakan oleh yayasan Raspberry Pi, adalah gambar yang dikompilasi khusus dengan skrip instal, unzip binari dan pengaturan awal, setelah itu Anda harus mendapatkan pembaruan dari internet - Yang semuanya disengaja tetapi cukup tugas untuk membuatnya bekerja seperti ini.

Salah satu solusi populer untuk menghindari penyalinan sektor kosong adalah dengan menggunakan sistem penyalinan Level File - dan CloneZilla berdiri sendiri, dapat di-boot dari CD, mirip dengan ye olde Norton Ghosttetapi clonezilla mendukung sistem file Linux (dan banyak lagi). Jadi, itu hanya akan menyalin file yang sedang digunakan dan membuat wadah dari file-file itu saja. Mengurangi ukuran secara signifikan!

Piotr Kula
sumber
1

Saya punya pertanyaan yang persis sama dan ingin alat yang mudah digunakan. Setelah mencari dan tidak menemukan yang saya tulis mkimg.sh . Saya menguraikan proses yang saya gunakan di: /raspberrypi//a/37899/32585

berto
sumber