n-LIFE

I love nature photo. Subaru Impreza WRX/Embedded SW/Snowboard/Otaku

4GB SD → 16GB SDへのコピー(拡張)

Raspbianを4GBのSDカードにインストールして使っていましたが、残り50MBという瀕死の状態になってしまいましたので、新しく16GB SDを購入し、構築した環境をそのまま16GBのSDカードへ移行しました。
その時のメモです。

■拡張前

$df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
rootfs 2.8G 2.6G 50M 99% /
/dev/root 2.8G 2.6G 50M 99% /
devtmpfs 215M 0 215M 0% /dev
tmpfs 44M 288K 44M 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 88M 0 88M 0% /run/shm
/dev/mmcblk0p5 60M 9.6M 50M 17% /boot
/dev/mmcblk0p3 27M 397K 25M 2% /media/SETTINGS

残り50MB。悲惨。

■raspi-config は使えないのか?

当初は4GB SDの中身をパーティションごと16GB SDにコピーして

$ sudo raspi-config

のExpand Filesystemで終了!という予定でしたが、実際にやってみると

Your partition layout is not currently supported by this tool. You are probably using NOOBS, in which case your root filesystem is already expanded anyway.

などと怒られてしまい、実行できませんでした。なのでraspi-configは使えません。
(どうやらSDの特定のパーティションにrootがマウントされている時だけ使える模様)

■対策

自動が無理なら手動しかありません。fdiskを駆使してパーティションを切る方法もあるようですが、NOOBSでインストールすると拡張パーティションの中に3つほど論理パーティションを作成するらしく、大変面倒なので、GUIパーティション管理ソフトのGPartedを使ってリサイズすることにしました。

流れ

1. 4GB SDをパーティションごと16GB SDにコピー
2. 4GB SDのraspbianで起動して、GPartedで16GB SDのパーティションをリサイズ
3. 16GB SDに差し替えて起動→16GB化!ヤッター

■手順1. SDカードイメージのコピー

Linuxでやるならddコマンドを使うようですが、よくわからないのでWindowsソフトの Win32DiskImagerを使いました。

1. Winマシンに4GB SDを接続
2. 保存するイメージと同じファイル名で空のファイルを作成する
 (ファイルが存在しないとWin32DiskImagerがエラーになる模様。どんだけ。)
3. Win32DiskImagerを起動し、step.2で作ったファイルを指定し、"Read"
4. 4GB SDを外して、16GB SDを接続
5. Win32DiskImagerの"Write"でイメージファイルの書き込み

これで16GB SDに4GB SDの内容がパーティションごとコピーされます。

■手順2. 16GB SD のパーティション変更

次に16GB SDのパーティションをリサイズします。
4GB SDが既にRasPiのSDスロットに接続されているので、16GB SDはUSBカードリーダを使ってRasPiにつなげましょう。

 

●GPartedのインストール

1. 4GB SDのRaspbianで起動する
2. $ sudo apt-get install gparted
 でGPartedをインストール
 ※途中でphpmyadminがファイル書き込みのパスワードを聞いて来る?のですがrootのパスワードも入れても

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

 とエラーが出てしまうので、後で出てくる確認画面で「無視」をしました。
3. $sudo gparted
 GPartedが起動します。

f:id:eichimu:20141130154337p:plain

 

●GPartedを使ってパーティションを変更

作業を始める前にパーティションの切られ方を確認しましょう。
- 4GB SDを16GB SDにコピーしたので、不足分はすべて未割り当て領域となっています。
- 水色で囲まれた部分が拡張パーティションです。その中にFAT32のパーティションext4パーティションがあることがわかります。
- /dev/sdc6がルートなので、これをリサイズします。
 →その前に拡張パーティションの方をリサイズする必要あり。
- 未割り当て領域と拡張パーティションの間にちっちゃいext4パーティションがありますが、こいつは削除しない方が良さげ。
 →未割り当て領域の一番後ろに移動します。
- 他はいじる必要はなさそう。

 

1. リサイズするパーティションがマウントされている場合はすべてアンマウントする。
 ・メニューの「パーティション」→「アンマウント」で可能。
 ・上図の場合/media/BOOT, /media/root, /media/SETTINGS_をアンマウントする。
2. /dev/sdc3を選択し「パーティション」→「リサイズ/移動」を選択。
 下図のように一番右に移動する。「リサイズ/移動」で完了。
 ※操作を予約するだけで実際の変更は行われません。

f:id:eichimu:20141130155447p:plain

3. 拡張パーティション /dev/sdc2 を選択して「パーティション」→「リサイズ/移動」を選択。
4. 今度はサイズを広げたいので、右側の矢印をドラッグして一番右まで広げる。
 「後方の空き領域」が0になる。出来たら「リサイズ/移動」で完了。
5. 次に/dev/sdc6を選択して、上記同様に空き容量いっぱいまでリサイズする。
6. ここまででパーティションは下図のようになっていると思います。

f:id:eichimu:20141130160148p:plain

7. ツールバーの右矢印アイコン(「保留中の全ての操作を適用する」)をクリックすると、実際にパーティションの変更が開始されます。

 

これで完了です。あとは16GB SDに差し替えて$df -hしてみましょう。

$ df- h
ファイルシス サイズ 使用 残り 使用% マウント位置
rootfs 14G 2.6G 11G 21% /
/dev/root 14G 2.6G 11G 21% /
devtmpfs 215M 0 215M 0% /dev
tmpfs 44M 288K 44M 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 88M 0 88M 0% /run/shm
/dev/mmcblk0p5 60M 9.6M 50M 17% /boot
/dev/mmcblk0p3 27M 397K 25M 2% /media/SETTINGS

 これであと半年は戦える。

 

参考:
Raspberry Pi • View topic - partitions problem

ここのrasprussさんの回答を参考にしました。というかまんまです。