メインメニュー
ログイン
ユーザー名:

パスワード:


パスワード紛失

PukiWiki最新記事
[ リロード ]   [ ソース ]  [ トップ | インデックス | 単語検索 | ご意見、ご感想 ]

Counter: 6579, today: 2, yesterday: 2

以下、普通はやらない、かなりトリッキーなことをするので自分用のメモです。

複数のラズベリーパイでツールなどのインストールや環境設定などが面倒なので一部の領域を共通に使いたいためにこのようなことをしています。

やることはボードAのRPiのSDカードは8Gバイトで2つのパーティションをもち
(このボードがすべてのコピー元になるマスター)、ボードBのRPiは16Gバイトで3つのパーティションをもちます。
このとき、先頭の2つのパーティションを共通領域として、システムや共通のデータ類を入れてます。

cpコマンドなどによるコピーではなくddコマンドで完全なコピーをします。
ただし、これだとボードBの3つ目のパーティションなどの情報も消えてしまうので、工夫が必要となります。

簡単に書くと、ボードBのパーティションテーブルなどの情報(MBR)をあらかじめとっておき、
ボードAのSDカードの内容をddコマンドですべてコピーしたあと、MBR領域をリストアして戻すことにより
3つ目のパーティションを復活させるという方法です。

実際にやってみたところ、思ったとおり今のところ問題なさそうです。
ちなみにボードBは、ボードAをコピーした後の未使用領域にパーティションを新たに作成したもので、
ボードAとボードBの2つのパーティションは同一なものであるとして話を進めていきます。

まず、
ボードAとボードBのパーティションを確認します。
ボードAでfdisk

$ sudo fdisk -l~
Disk /dev/mmcblk0: 7948 MB, 7948206080 bytes~
4 heads, 16 sectors/track, 242560 cylinders, total 15523840 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

Device Boot      Start         End      Blocks   Id  System~
/dev/mmcblk0p1            8192      122879       57344    6  FAT16~
/dev/mmcblk0p2          122880    15523839     7700480   83  Linux

8GBのSDカードで2つのパーティションがあります。

ボードBでfdisk

$ sudo fdisk -l
Disk /dev/mmcblk0: 15.8 GB, 15811477504 bytes~
4 heads, 16 sectors/track, 482528 cylinders, total 30881792 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

Device Boot      Start         End      Blocks   Id  System~
/dev/mmcblk0p1            8192      122879       57344    6  FAT16~
/dev/mmcblk0p2          122880    15523839     7700480   83  Linux~
/dev/mmcblk0p3        15523840    30881791     7678976   83  Linux

16GBのSDカードで3つのパーティションがあります。

ボードAとボードBでmmcblk0p1とmmcblk0p2は基本的にまったく同じ共通領域です。
ボードBにはパーティション3があります。

1. ボードBの先頭の4MバイトのMBRを含む領域を保存。

$ sudo dd if=/dev/mmcblk0 of=first_block.img bs=512 count=8192~
8192+0 レコード入力~
8192+0 レコード出力~
4194304 バイト (4.2 MB) コピーされました、 0.49203 秒、 8.5 MB/秒

$ ls -l
-rw-r--r--  1 pi pi 4194304  first_block.img

2.ボードBに保存されたfirst_block.imgをボードAへネットワークを介して転送
$ scp first_block.img pi@192.168.○.○:

3. ボードAのすべて(8GB)をボードBへコピー
ボードBの電源を切ってSDカードをUSBアダプタへ入れてボードAのUSBスロットへ差し込みます。

$ sudo dd if=/dev/mmcblk0 of=/dev/sda bs=4096
1940480+0 レコード入力~
1940480+0 レコード出力~
7948206080 バイト (7.9 GB) コピーされました

4.コピーされたボードBのSDカードを取り出しボードBに入れ起動
この時点では、

$ sudo fdisk -l
Disk /dev/mmcblk0: 15.8 GB, 15811477504 bytes~
4 heads, 16 sectors/track, 482528 cylinders, total 30881792 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: 0x00014d34

Device Boot      Start         End      Blocks   Id  System~
/dev/mmcblk0p1            8192      122879       57344    6  FAT16~
/dev/mmcblk0p2          122880    15523839     7700480   83  Linux

2つのパーティションのみ確認できます。

5. 先頭のMBRを含む4Mバイトの領域をリストア

$ sudo dd if=first_block.img of=/dev/mmcblk0 bs=512 count=8192~
8192+0 レコード入力~
8192+0 レコード出力~
4194304 バイト (4.2 MB) コピーされました、 1.29625 秒、 3.2 MB/秒

6. そのまま再起動
fdiskしてみると領域が復活。

$ sudo fdisk -l

Disk /dev/mmcblk0: 15.8 GB, 15811477504 bytes~
4 heads, 16 sectors/track, 482528 cylinders, total 30881792 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

Device Boot      Start         End      Blocks   Id  System~
/dev/mmcblk0p1            8192      122879       57344    6  FAT16~
/dev/mmcblk0p2          122880    15523839     7700480   83  Linux~
/dev/mmcblk0p3        15523840    30881791     7678976   83  Linux

かなり面倒ですが、実際はスクリプトを書いてボードAのみで実行させることができそうです。
今回は、8GB→16GBですが、
16Gから16Gのときも2つのパーティション領域のみddコマンドでコピー(countの設定)をすれば同じようにシステム領域などの共通領域のみ
コピーできるハズです。

ちなみに先頭はMBRでブートストラップローダーとパーティションテーブルなどがあります。

0x0000	ブートストラップローダー	446バイト
0x01BE	パーティションテーブル1		16バイト~
0x01CE	パーティションテーブル2		16バイト~
0x01DE	パーティションテーブル3		16バイト~
0x01EE	パーティションテーブル4		16バイト~
0x01FE	ブートシグネチャ (AA55)		2バイト

以下は4Mバイト分ダンプした結果です。

$ sudo hexdump /dev/mmcblk0 -n 4194304~
0000000 b8fa 1000 d08e 00bc b8b0 0000 d88e c08e~
0000010 befb 7c00 00bf b906 0200 a4f3 21ea 0006~
0000020 be00 07be 0438 0b75 c683 8110 fefe 7507~
0000030 ebf3 b416 b002 bb01 7c00 80b2 748a 8b01~
0000040 024c 13cd 00ea 007c eb00 00fe 0000 0000~
0000050 0000 0000 0000 0000 0000 0000 0000 0000

00001b0 0000 0000 0000 0000 4d34 0001 0000 8200~
00001c0 0003 a506 071e 2000 0000 c000 0001 0000~
00001d0 80c1 0383 7fd0 e000 0001 0000 00eb 0000~
00001e0 0000 0000 0000 0000 0000 0000 0000 0000~
00001f0 0000 0000 0000 0000 0000 0000 0000 aa55~
0000200 0000 0000 0000 0000 0000 0000 0000 0000

0400000

ちなみにリトルエンディアンです。

  関連記事:
Raspberry_Piをエネループ(電池)で動かす
Raspberry_PiでWiFi接続を安定にする2つの方法
Raspberry_Piでインターネットラジオ作ってみた
ラズベリーパイのインターネットラジオ完成!
Raspberry_PiにLCDやスイッチを取り付けるときの注意点
Raspberry_PiとArduinoを接続して連携動作させる
Raspberry_PiのGPIOライブラリ
Raspberry_Piが起動しないときのLEDの点滅
RPiで大きな容量のSDカードから小さな容量のSDカードへまるごとコピーする
Raspberry_Piの周波数を下げて消費電力を下げてみた
sendmailでのメール送信が異常に遅い場合の対処
ラズベリーパイで遠隔操作のレスキューロボットを作成 その1
 

   

ページコメント
投稿された内容の著作権はコメントの投稿者に帰属します。

トラックバック [ トラックバック(0) ]
トラックバック URL: http://myboom.mkch.net/modules/pukiwiki/tb/174