背景
SD カードが Raspberry pi 用に構成されています。目標は、SD カードを正確に複製 (OS、アプリ、データ) し、レプリカが rPi で元のマスター SD カードとまったく同じように機能することです。
更新: 仮定:
- レプリケーションはUNIX系オペレーティングシステムで構成されたラップトップで実行されます
- rPiから複製は実行されない
- 対象のSDカードは同じメーカー/モデルです
- ソース SD カードは異なるファイル システムでパーティション分割されています。
質問
SD カード スロットおよび USB SD カード リーダー/ライターを備えた Ubuntu HP ラップトップで使用できる UNIX クローン作成オプションは何ですか。
USB SD カード RW がリーダーかライターかによって違いはありますか?
目的(制約)は、追加のハードウェアを購入しないようにすることです。
ソリューションの観察
date; sudo sh -c 'cat sdcard.image >/dev/mmcblk0'; date
2019 年 6 月 3 日月曜日 17:53:18 EDT [sudo] ユーザーのパスワード: 2019 年 6 月 3 日月曜日 23:42:17 EDT
date; sudo sh -c 'pv sdcard.image >/dev/mmcblk0'; date
2019 年 6 月 4 日火曜日 00:33:50 EDT [sudo] ユーザーのパスワード: 119GiB 6:06:12 [5.56MiB/s] [==================================>] 100%
2019 年 6 月 4 日火曜日 06:43:05 EDT
フラッシュされた SD カードの gParted 分析では、同一のパーティション分割が示されています。
MacOS \ OSX
diskutil list
書き込むときは必ず SD カードをアンマウントしてください。
sudo diskutil unmount /dev/disk#
ここで # は 1、2、3... です。
答え1
SDカードをあるカードから別のカードに正確にコピーしたいだけなら、ddコマンドラインで。
Raspberry Pi の独自の OS からこれを実行しないでください。これは、コピー中に OS が SD カードに書き込み、コピーが破損する可能性があるためです。
SD カードをコピーするには、両方を 2 つのリーダーに接続します (USB かどうかは関係ありません)。次に、 の内容を確認します/dev
。カードは として表示されます/dev/sd*
。例/dev/sdb
: 内蔵ハードドライブがすでにオンになっている可能性があるので注意してください /dev/sda
。
どちらの SD カードもマウントされていないことを確認し、コマンド プロンプトで次のように入力して出力を確認します。
mount | grep /dev/sd
また、どのカードにどのファイル名があるかを知るために、次の出力を確認します (root として):
sudo blkid
実際にコピーするには(例:/dev/sdb から /dev/sdc へ)、次のように入力します(root として):
dd if=/dev/sdb of=/dev/sdc bs=4096 status=progress
答え2
Unixシステムでは、ストレージデバイスをデバイスファイルデバイス ファイルは、多くの点で通常のファイルと同じように動作します。特に、ストレージ デバイスの正確なコピーを作成するには、ソース デバイスのコンテンツをターゲット デバイスにコピーするだけです。
まず、ソースデバイスファイルとターゲットデバイスファイルを決定する必要があります。名前はUnixの種類と設定方法によって異なりますが、実際にはデバイスファイルは常にディレクトリの下にあります/dev
。SDカードをマウントしている場合は、デバイスファイルが何であるかを見つけることができます。
df /media/sdcard1/some/file/on/the/sdcard
lsblk
デバイス ファイルは最初の列にあります。SD カードを挿入したときのカーネル ログ メッセージやLinux のコマンドなど、他のツールでも同じ情報を提供できます。
カードにパーティションがある場合があります。その場合、パーティションが 1 つしかない場合でもカード全体をコピーします。これは、一部のブート時情報がパーティションの外部にある可能性があるためです。たとえば、Linux で がdf
表示される場合は、だけではなく をコピーします。/dev/sdb1
/dev/sdb
/dev/sdb1
SD カードを抜き取って再度挿入すると、通常は以前と同じデバイス ファイル名になりますが、保証されるわけではありません。
コピーする前に、次の点を確認してください。
- ソース デバイスがマウントされていないか、読み取り専用でのみマウントされています。
- ターゲットデバイスがまったくマウントされていません。
- ターゲット デバイスは少なくともソースと同じ大きさです。Linux では、
lsblk
デバイス サイズが表示されます。 - 正しいターゲット デバイスがあります。以下のコマンドは確認を求めずにその内容を上書きすることに注意してください。
ソースデバイスが で/dev/sdb
、ターゲットデバイスがであると特定したとします/dev/sdc
。内容をコピーするには、root として次のコマンドを実行します。
cat /dev/sdb >/dev/sdc
sudoを使用する場合、リダイレクトは>
rootとして行う必要があるため、次のように記述する必要があります。
sudo sh -c 'cat /dev/sdb >/dev/sdc'
あるいは、間違ったデバイスを誤って上書きしないようにするには、次の 2 つの手順を実行します。
- ユーザー (
gatorback
この例では ) に、ソース デバイス (dev/sdb
この例では ) からの読み取り権限と、ソース デバイス (/dev/sdc
この例では ) への書き込み権限を付与します。sudo setfacl -m user:gatorback:r /dev/sdb sudo setfacl -m user:gatorback:w /dev/sdc
- sudo なしでコピーを実行します。
cat /dev/sdb >/dev/sdc
ディスク イメージをファイルにコピーし、そのイメージ ファイルをターゲット デバイスにコピーすることができます。これは、複数のコピーを作成する必要がある場合、SD カード リーダーが 1 つしかない場合、または間違った方向にコピーするリスクを軽減する場合に便利です。
sudo cat /dev/sdb >sdcard.image
- ソースカードを引き出し、ターゲットカードを挿入します。
- オプションで、コンテンツを確認するには、イメージをマウントする例えば
sudo mount -o loop -r sdcard.image /mnt
、 sudo sh -c 'cat sdcard.image >/dev/sdb'
進捗情報を便利に確認したい場合は、pv
の代わりにcat
(pv
はデフォルトでインストールされることはほとんどありませんが、ほとんどのディストリビューションでパッケージとして利用できます)。