SDカードの内容からイメージ(.img)を作成する方法(元のイメージと同じくらいコンパクト)?


20

私は試した:

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

7.6 GBの.imgファイルを作成します(カードサイズ、ただしカードにあるものは700 MBです)。

そして:

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

2.7 GBの.gzファイルを作成します。

http://www.raspberrypi.org/downloadsからの元のRaspbian(Debian 7(Wheezy))には494.44 MiBがあります。

SDカードの内容から、サイズが似た画像を作成するにはどうすればよいですか?

(私はUbuntuを使用しています。)


回答:


18

RooTerへのコメントで、A)で初期パーティションサイズを縮小したgpartedが、ddまだカード全体をコピーしていること、およびB)両方のパーティションをイメージに含めることを述べています。

問題「A」は簡単に説明できます/dev/mmcblk0。カード全体をコピーしているのは、それが言及しているためです。個々のパーティションはもちろんある/dev/mmcblk0p1/dev/mmcblk0p2。これは問題 "B"の複雑さですが、dd各パーティション/dev/mmcblk0 の先頭と長さをインデックスする先頭のパーティションテーブルのため、各パーティションを単純に2つのファイルを連結することはできません。これがないと、イメージは使用できなくなります。

ただし、から各パーティションの長さを取得しfdisk -l、それを使用してのいくつかのパラメーターを決定できますdd。例えば:

> 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

「開始」および「終了」ユニットはセクターであり、セクターサイズが512バイトであることに注意してください。の場合/dev/mmcblk0p2、26746879(最後のセクター)-122880(最初のセクター)= 26623999/2(kBあたり2セクター)/ 1024(kBあたりkB)/ 1024(GBあたりMB)= 12.69、gpartedを使用してパーティションを拡大しました12 GBまでなので、これは正しいようです(実際、ストレージの除数として1024ではなく1000を使用する必要があります。これは13.31 GBになりますが、gpartedなどのツールも1024を使用していると思われます)。

したがって、最初に確認する必要があるのは、2番目のパーティションが実際に設定した小さいサイズであることです。次に、これらの数値をdd;で使用します。私にとっては:

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

どのようにdd機能するかを誤解することで、あらゆる種類のオフを回避するために、余分なセクターがあります。これが機能したかどうかを確認する簡単な方法があります。

> 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

ここで少し不一致があることに注意してください。「開始」および「終了」セクターは元のパーティションテーブルと一致しますが、統計の上部の合計サイズはわずか102 MBです!これは、実際にcount=200000パラメーターとして使用したのは、実際ddには12 GBのコピーに煩わされたくなかったからです(「合計200000セクター」にも注意してください)。一番下の表にこれが反映されない理由は、fdiskがSDカードの先頭からイメージの先頭に逐語的にコピーされたパーティションデータから情報を取得しているためです。維持する。残りを(適切に)コピーしていた場合、数値は一致し、イメージは実行可能になります。

試してみてください。:)


OSXでは、fdiskはセクターサイズをバイト単位で明確に出力しません。代わりに、シリンダー/ヘッド/セクターを表す「ジオメトリ:966/255/63 [15523840セクター]」を提供します。この場合、bsとcountのどの値を使用する必要がありますか?
アーサーヒーバート

@ArthurHebert:合計バイト数/合計セクター。その上に第一の場合において、例えば512 = 200000分の102400000秒で、512 = 31520768分の16138633216あろう
びき

1
使用できfdisk -l <device>、対話モードに移行せずにテーブルを印刷する必要があります。
-berto

5

問題は、かつて使用されたセクターにまだ汚れが残っていることにあると思います。ファイルが削除されると、メタデータのみがファイルシステムから削除され、データ自体は削除されないため、ゼロのみのブロックを簡単に圧縮するのではなく、ランダムなゼロを残します。

簡単な解決策ですが、カードのすべての空き領域を書き換える必要があります。SDカードのライフスポーンは書き換え回数によって制限されるため、これは推奨される方法ではありません。

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

そのSDカードを使用しない別のコンピューターにzerofreeをインストールする必要があるため、より複雑なソリューション。

zerofree /dev/mmcblk0p2

詳細については、http://intgat.tigress.co.uk/rmy/uml/index.htmlをご覧ください。

覚えておく必要があるのは、/ dev / mmcblk0のddを実行すると、パーティションが小さくてもデバイス全体をコピーするということです。上記の方法のいずれかを実行する前にraspi-configを使用してメインパーティションを拡張した場合は、問題ありません。

PS形式の画像ファイルの変更を気にしない場合は、既知のファイルシステムでは、まだ汚れが残っている場合でも、解放されたブロックを省略するpartimageを使用できます。繰り返しますが、partimageは、ファイルシステムがマウントされていないときにバックアップの破損を防ぐために使用するのが最適です。おそらく、読み取り専用で再マウントしても問題はありませんが、私はあなたの裁量に任せます。


これを達成しようとする私の探求の一環として、私はgpartedを使用してsdcardパーティションを減らして自分のデータのみを収容し、その後ddしてみましたが、結果は同じ7.6GBファイルで、partimageは2つのパーティションを保存できませんブート+ /)1つのイメージに
mf_

多分私はそれを十分に明確にしなかった-以前にgzipで試したように、それを圧縮すると違いが出るはずだ。
ルーター

この方法でカードをいっぱいにすると、書き込みサイクル全体が発生し、カードの寿命が短くなります。トライdd bs=4M if=/dev/zero of=/root/junk
-nc4pk

@
tapped

4

短い答え-2GB SDカードを使用します。

長い答えddは、「良い」データがどこで終わるのかわからないので、どうにかしてそれを伝えなければなりません。

2つの方法があります。2GBのSDカードを使用するのが最も簡単です。2GBを超えるコピーは自動的に停止し、必要に応じて500MBの圧縮ファイルが作成されます。

もう1つの方法、より複雑な方法は、パーティションテーブルから正しいデータサイズを計算し、この正しいサイズをddコマンドのパラメーターとして指定することです。そのために、bs=XXX(ブロックサイズ)およびcount=XXX(ブロック数)パラメーターを使用できます。たとえば、bs=10M10MBブロックサイズ(コマンドで使用する4kブロックサイズに比べて間違いなくはるかに高速count=200にコピーする)と10MB * 200 = 2000MB(2GB)を指定できます。SDカードのパーティションスキームに従って、ブロックサイズとブロック数を調整する必要がある場合があります


1
dd特定のサイズを与えることは決して機能しません。これは、ファイルシステム内の実際のデータがすべてデバイスの先頭にきちんと配置されていることを前提としているため、8 GBパーティションに2 GBがある場合、最初の2 GBをコピーするだけです。これは偽です。これらの2 GBのデータは、特に、使用可能なすべてのブロックが少なくとも1回使用されるまでブロックを2回再利用しない最新のSDカードでは、スペース全体に分散されます(これはウェアレベリングと呼ばれ、カードの寿命を延ばします)。
goldilocks

@goldilocksすべてのパーティションを可能な最大サイズ(データのみ)に縮小するためにSDカードのサイズを変更するとどうなりますか?
mf_

@goldilocks、質問と回答をより注意深く読んでください、あなたの想像力が何らかの形であなたに言ったように、私は8GBパーティション上の2GBデータではなく、8GB SDカード上の2GBパーティションについて話しています。
レニック

1
lenik:ええ、私はあなたをそのように解釈して少しst然としました、すべての謝罪-残念ながら、あなたが投稿を編集しない限り、私のダウン投票を元に戻すことはできません:/この回答はまだ有用ではないと思います-これは単にパーティションを dd'dしているだけではないので、これを行う方法についての指示はやはり役に立たない)が、私はそれをやる。@mf_はい、それは実行可能です(私の答えを読みましたか?それは動作します...)
goldilocks

@goldilocks答えを編集しました。なぜそれが役に立たないのかわからない、特に正確に同じ答えを与えたときは、さらに詳細を述べてください。
レニック

1

dd - copy and convertあなたが要求した仕事をするのに適切なツールではありません。これは、セクターごとの低レベルのコピー(および変換)ツールであり、ブートセクターのコピー、デバイスのフォーマット、あらゆる種類の低レベルタスクに最適です。使用するddと、たとえファイルシステム構造に含まれていなくても、セクターごとにイメージにコピーします。

Raspberry Pi Foundationが提供するイメージは、インストールスクリプト、解凍バイナリ、初期セットアップを含む特別にコンパイルされたイメージです。その後、インターネットから更新を取得する必要があります。これはすべて意図的なものですが、このように機能させるにはかなりの作業です。

空のセクターのコピーを回避するための一般的なソリューションの1つは、ファイルレベルのコピーシステムを使用することye olde Norton Ghostです。そのため、使用中のファイルのみをコピーし、それらのファイルのみからコンテナを作成します。サイズを大幅に縮小します!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.