SD karttaki görüntüden (.img) nasıl oluşturulur (ancak orijinal görüntü kadar kompakt)?


20

Denedim:

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

7,6 GB'lık bir .img dosyası oluşturur (kart boyutu, ANCAK kartın içindekiler 700 MB'dir).

Ve:

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

2,7 GB ile bir .gz dosyası oluşturur.

Orijinal Raspbian ( Debian 7 den (Hışıltılı)) http://www.raspberrypi.org/downloads 494,44 MiB sahiptir.

SD kartta bulunanlardan görüntüyü benzer boyutta nasıl yapabilirim?

(Ubuntu'dayım.)


Yanıtlar:


18

RooTer'a yaptığı bir yorumda A) ilk bölüm boyutunu küçülttüğünüzü gparted, ancak ddyine de tüm kartı kopyaladığınızı ve B) görüntüye her iki bölümü de eklemek istediğinizi belirtiyorsunuz.

"A" sorununu açıklamak kolaydır: kartın tamamını hala kopyalıyorsunuz, çünkü bunun /dev/mmcblk0anlamı budur . Bireysel bölümler elbette /dev/mmcblk0p1ve /dev/mmcblk0p2. Bu, "B" sayısındaki karmaşıklıktır, ancak başında her bir bölümün başlangıcını ve uzunluğunu endeksleyen ddbölüm tablosu nedeniyle her bölümü basitçe birleştiremez ve iki dosyayı birleştiremezsiniz /dev/mmcblk0. Bu olmadan, görüntü kullanılamaz.

Bununla birlikte, her bir bölümün uzunluğunu elde edebilir fdisk -lve bunu için bazı parametreleri belirlemek için kullanabilirsiniz dd. Örneğin:

> 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

"Başlangıç" ve "Bitiş" birimleri sektörlerdir ve sektör boyutunun verildiğine dikkat edin, 512 bayt. İçin /dev/mmcblk0p2, 26746879 (son sektör) - 122880 (ilk sektör) = 26623999/2 (kB başına 2 sektörler için) / 1024 (MB başına kB) / 1024 (GB başına MB) Ben Gparted'tan kullanarak bölümü büyüdü ki, 12.69 = 12 GB'a kadar, bu yüzden doğru görünüyor (gerçekten 13.31 GB'a kadar çalışan depolama ile bölen olarak 1000 değil 1024 kullanmalıyım, ancak şüpheli ve bazı diğer araçlar da 1024 kullandığından şüpheleniyorum).

Kontrol etmek istediğiniz ilk şey, ikinci bölümünüzün gerçekten ayarladığınız daha küçük boyut olmasıdır. Sonra, bu sayıları sadece dd; benim için:

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

Nasıl ddçalıştığının yanlış anlaşılmasından kaçınmak için orada ekstra bir sektör var . Bunun işe yarayıp yaramadığını kontrol etmenin basit bir yolu var:

> 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

Burada biraz tutarsızlık olduğuna dikkat edin: "Başlat" ve "Bitiş" sektörleri orijinal bölüm tablosuyla eşleşir, ancak istatistiklerin üstündeki toplam boyut yalnızca 102 MB'dir! Bunun nedeni, aslında 12 GB'lık bir kopyayla uğraşmak istemediğim için aslında count=200000param olarak kullandım dd. Alttaki tablonun bunu yansıtmamasının nedeni, fdisk'in, SD kartın başlangıcından itibaren görüntünün başlangıcında kopyalanan bölüm verilerinden bilgilerini almasıdır; bu, ikinci paragrafta belirttiğim gibi hayati önem taşır korumak için. Gerisini kopyalamış olsaydım, sayılar copacetic olurdu ve görüntü uygun olurdu.

Bir deneyin. :)


OSX'te fdisk, sektör boyutunu bayt cinsinden net bir şekilde yazdırmaz. Bunun yerine silindirleri / kafaları / sektörleri temsil eden "geometri: 966/255/63 [15523840 sektörler]" sunar. Bu durumda hangi bs ve count değerleri kullanılmalıdır?
Arthur Hebert

@ArthurHebert: Toplam bayt / toplam sektör. Yukarıdaki ilk durumda, bu ikinci 102400000/200000 = 512'de 16138633216/31520768 = 512 olacaktır.
goldilocks

1
Bunu kullanabilirsiniz fdisk -l <device>ve bu etkileşimli moda geçmeden tabloyu yazdırmalıdır.
berto

5

Sorunun, hala kirleri olan sektörlerde kullanıldığını tahmin ediyorum. Dosya silindikten sonra, verilerin kendisinden değil, yalnızca meta veriler dosya sisteminden kaldırılır, böylece yalnızca sıfır blokları sıkıştırmak yerine rastgele tek sıfırlar bırakır.

Kolay çözüm, ancak karttaki tüm boş alanların yeniden yazılmasını gerektirir. SD kart ömrünün yeniden yazma sayısıyla sınırlı olduğunu unutmayın, bu nedenle bu tercih edilen bir yöntem değildir.

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

O zaman bu SD kartı kullanmayacak başka bir bilgisayara sıfırdan ücretsiz yüklemeniz gerektiğinden daha kapsamlı bir çözüm .

zerofree /dev/mmcblk0p2

Daha fazla bilgi için http://intgat.tigress.co.uk/rmy/uml/index.html

Ne hatırlamak zorunda yapıyor dd bölümleri daha küçük olsa bile, tüm cihaz kopyalama / dev / mmcblk0 arasında. Yukarıdaki yöntemlerden birini yapmadan önce ana bölümü genişletmek için raspi-config kullandıysanız iyi olacaksınız.

PS Biçim görüntü dosyasını değiştirmenin sakıncası yoksa, bilinen dosya sistemleri için, içinde hala bir miktar kir olsa bile serbest bırakılan blokları atlayan partimage kullanabilirsiniz . Yedekleme bozulmasını önlemek için dosya sistemi monte edilmediğinde tekrar partimage kullanılması en iyisidir. Muhtemelen onu salt okunur olarak yeniden monte etmekle kurtulabilirsiniz, ama sizin takdirinize bırakacağım.


bunu yapmaya çalışırken benim arayışımın bir parçası olarak, sadece sahip olduğum verileri karşılamak için sdcard bölümünü azaltmak için gparted kullanılır, sonra dd ing denedim ve sonuçları aynı 7.6GB dosya, partimage 2 bölüm kaydedemezsiniz (/ boot + /) 1 resme
mf_

belki yeterince açıklığa kavuşturmadım - daha önce gzip ile denediğiniz gibi, sıkıştırdığınızda bir fark yaratmalıdır.
RooTer

kartı bu şekilde doldurmak bir sürü yazma döngüsüne neden olacak ve kartın ömrünü kısaltacaktır. deneyindd bs=4M if=/dev/zero of=/root/junk
nc4pk

@
tapped

4

Kısa cevap - 2GB SD kart kullanın.

Uzun cevap, dd"iyi" verinin nerede bittiği hakkında hiçbir fikri yok, bunu bir şekilde anlatmak zorundasınız.

İki yolu vardır, en kolayı 2GB SD kartı kullanmaktır, bu da otomatik olarak 2GB'ın ötesinde kopyalamayı durduracak ve istediğiniz gibi 500MB sıkıştırılmış dosyaya neden olacaktır.

Diğer bir yol, daha karmaşık olanı, bölüm tablonuzdan doğru veri boyutunu hesaplamak ve bu doğru boyutu ddkomut verilecek bir parametre olarak belirtmektir . Bu amaçla bs=XXX(blok boyutu) ve count=XXX(blok sayısı) parametrelerini kullanabilirsiniz. Örneğin, 10 bs=10MMB'lık blok boyutu (bu, komutları kullandığınız 4k blok boyutuna kıyasla çok daha hızlı bir count=200şekilde kopyalar ) ve 10MB * 200 = 2000MB (2GB) kopyalamayı belirtebilirsiniz. SD kart bölüm şemasına göre blok boyutunu ve blok sayısını ayarlamanız gerekebilir .


1
ddBelirli bir boyut vermek ASLA HİÇBİRyapmaz . Bu, dosya sistemindeki tüm gerçek verilerin cihazın başında düzgün bir şekilde düzenlendiğini varsayar, bu nedenle 8 GB'lik bir bölümde 2GB varsa, sadece ilk 2GB'yi kopyalamanız gerekir. Bu yanlış. Bu 2 GB veri, özellikle mevcut tüm bloklar en az bir kez kullanılıncaya kadar blokları iki kez yeniden kullanmayan modern SD kartlara tüm alana dağıtılır (buna aşınma tesviyesi denir ve kartın ömrünü uzatır).
goldilocks

@goldilocks tüm bölümleri mümkün olan en büyük boyuta (yalnızca veri) küçültmek için sdcard'ı yeniden boyutlandırırsam ne olur?
mf_

@goldilocks lütfen, soruyu ve cevabı daha dikkatli bir şekilde okuyun, vahşi hayal gücünüzün bir şekilde söylediği gibi, 8GB'lık bir SD kartta 2GB'lık bölümden, 8GB'lık bölümdeki 2GB'lık verilerden bahsediyorum.
lenik

1
lenik: Evet biraz şaşırdım, seni bu şekilde yorumladım, tüm özür dilerim - maalesef gönderiyi düzenlemedikçe downvote'umu tersine çeviremem: / hala bu cevabın özellikle yararlı olduğunu düşünmüyorum (suç yok - - çünkü bu sadece bir bölüm değil, bunun nasıl yapılacağına dair talimatlar yine yararlı değil), ama bunu yapacağım. @mf_ Evet, bu yapılabilir (cevabımı okudun mu? Çalışacak ...)
goldilocks

@goldilocks Cevabı düzenledim. Özellikle de aynı cevabı verdiğinizde, sadece daha fazla ayrıntı ile neden yararlı olmadığını bilmiyorum.
lenik

1

dd - copy and convertistediğiniz işi yapmak için doğru araç değildir. Önyükleme sektörlerini, formatlama cihazlarını ve her türlü düşük seviyeli görevi kopyalamak için harika olan düşük seviyeli, sektörlere göre kopyalama (ve dönüştürme) aracıdır. Kullandığınızda dd, Dosya Sistemi Yapısı'na dahil olmasa bile görüntüyü sektörlere göre kopyalıyorsunuz.

Raspberry Pi Vakfı tarafından sağlanan görüntüler, yükleme komut dosyaları, unzipping ikili dosyalar ve ilk kurulum ile özel olarak derlenmiş görüntülerdir, daha sonra yine de internetten güncellemeler almanız gerekir - Ki bu tamamen kasıtlı ama bu şekilde çalışmak için oldukça görev.

Boş sektörleri kopyalamaktan kaçınmak için popüler bir çözüm, Dosya Düzeyi kopya sistemi kullanmaktır - ve CloneZilla, CD'den önyüklenebilir, benzerdir, ye olde Norton Ghostancak klonezilla Linux (ve daha fazlası) dosya sistemlerini destekler. Bu nedenle, yalnızca kullanımda olan dosyaları kopyalar ve yalnızca bu dosyalardan bir kap oluşturur. Boyutu önemli ölçüde azaltır!


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.