05 Raspberry PiファイルシステムHDD化 その1/3 (HDD接続~データ移行)

今回から3回にわたってファイルシステムをHDDへ移行します。
その1ではHDDにルートファイルシステムを移行するところまで実施します。
その2で/varを別パーティション化し、
その3で起動用SDカードを作ります。

Raspberry Piをサーバーとして運用すると24時間稼働しっぱなしになります。
ファイルシステムをSDカードのままにするとlogなどがどんどんSDカードに書き込まれますが、
SDカードには書き込み回数制限があるのでいつか書き込みができなくなって壊れます。
そこで、SDカードは起動のみに使い、全体のシステムをUSB接続のHDDに移行させます。

ちなみにHDDも2.5”サイズだと耐久性に問題がある場合が多いようです。(高耐久のものもあります)
なので3.5”のものを使いましょう。
私の場合はNASとして購入したLandiskを使いました。
個人ストレージとしてiPhoneと連携させようと思って購入しましたが、
メーカー公式のiPhoneアプリがう○こで、繋がらないわすぐ落ちるわで使い物にならなかったので眠ってたものです。
NAS用なので24時間稼働にも耐えられる部品を使っていてほしいですが、アプリの出来をみると大丈夫かちょっと不安です。

注意!
今回使うコマンドにはシステムを簡単に破壊できるものが含まれています。
きちんと使い方を理解して使うようにしてください。またコマンドを打つときはきちんと確認してから実行してください。

参考URL
studio propman
raspberrypi.orgのフォーラム

現在のマウント状態とSDカードのパーティションの確認

まずSDカードのパーティションがどうなっているか確認します。
sudo fdisk -l

Disk /dev/mmcblk0: 15.8 GB, 15819866112 bytes
4 heads, 16 sectors/track, 482784 cylinders, total 30898176 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: 0x000981cb

Device Boot Start End Blocks Id System
/dev/mmcblk0p1 8192 122879 57344 c W95 FAT32 (LBA)
/dev/mmcblk0p2 122880 5785599 2831360 83 Linux

上記Blocksのところがそのパーティションのサイズです。
パーティションは約57Mと約2.8Gの2つに分割されています。

ここで最初にOSイメージからインストールしたのが生きてきてます。
前にNOOBSでインストールしたときはパーティションが6つぐらいに分割されていて、
それぞれの容量も大きかったので移行がやりにくかったですが今回は楽そうです。

次に現在のマウント状態を確認します。
cat /etc/fstab

proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, so no using swapon|off from here on, use dphys-swapfile swap[on|off] for that

これを見ると約60Mの領域だった/dev/mmcblk0p1がブート、約3Gの/dev/mmcblk0p2がルートファイルシステムにマウントされています。
ちなみにcatコマンドはファイルの中身を表示するコマンドです。

さて、この後は以下の作業を実施します。
①HDDを接続してパーティションを切ってフォーマット
②HDDへデータを移行
③/dev/mmcblk0p1の内容を別の容量が小さいSDカードへコピー

①HDDを接続してパーティションを切ってフォーマット

それではさっそくHDDを接続します。
いったんRaspberry Piの電源を切ります。プラグアンドプレイで認識するかもしれませんが怖いので。
sudo shutdown -h now
電源が切れたら電源ケーブルを引っこ抜いて、USBポートへHDDを接続。再度電源ケーブルをぶっさして起動。
立ち上がったらSSHで接続します。

HDDが認識されているか確認。
sudo fdisk -l

先ほどのSDカードの表示に加えて以下が表示せれると思います。

Disk /dev/sda: 1494.1 GB, 1494105661440 bytes
255 heads, 63 sectors/track, 181648 cylinders, total 2918175120 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: 0x410f9b02

Device Boot Start End Blocks Id System
/dev/sda1 2048 75499519 37748736 83 Linux
/dev/sda2 75499520 2917140479 1420820480 5 Extended
/dev/sda3 2917140480 2918175119 517320 82 Linux swap / Solaris
/dev/sda5 75501568 1124077567 524288000 83 Linux

パーティション分割やフォーマットの状況で詳細はちょいちょい違うと思いますが、
HDDが/dev/sdaとして認識されていることがわかりました。
以降は上記の状態を前提に進めます。

HDDのパーティションを作成

HDDのパーティションを一旦削除して新しく切っていきます。
この操作でHDDの中身は完全に削除されます。必要なデータがある場合は別のメディアにバックアップしてから実施してください。
sudo fdisk /dev/sda

Command (m for help):

ここにコマンドを入力していきます。
どんなコマンドがあるかは”m”を入力するとヘルプが表示されます。

Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition’s system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)

まずは既存のパーティションを削除するのでdをインプット
その次に消去するパーティション番号を入れます。
先ほど表示させた各領域表示 “/dev/sda○ …”のsdaの後ろについてる番号がパーティション番号になります。
また、fdiskコマンド内でパーテョションの状態を確認したいときはpコマンドで見ることができます。
論理パーティション(パーティション番号5以上のパーティション)がある場合は最初に消します。

Command (m for help): d
Partition number (1-5): 5

現在のパーティションがどうなっているかを見るには”p”コマンドを入力
Command (m for help): p
(中略)
Device Boot Start End Blocks Id System
/dev/sda1 2048 75499519 37748736 83 Linux
/dev/sda2 75499520 2917140479 1420820480 5 Extended
/dev/sda3 2917140480 2918175119 517320 82 Linux swap / Solaris

どんどん消してしまいます。
なお、最後の1つはパーティション番号入力なしに削除されます。

全部消したら新しくパーティションを切りなおします。
今回は1.5TB(1494.1GB)のHDDを使っています。
パーティションをどういう分割にするかはわりと悩む問題です。
現在は大容量HDDの値段が安くなったので昔ほどではありませんが、
それでも追加でHDDを購入するは嫌なので効率よくフレキシブルに対応できるようにするにはどうすればいいか悩みます。
私の場合はパーティションを3つに分けて以下のような構成にしようと思います。

sda1 32GB…ルートファイルシステム(こんなにいらないかも)
sda2 1357G…データ用(拡張領域として確保してフレキシブルに対応できるようにする。)
├sda5 200G…とりあえずこれだけ確保しておけばストリーミングサーバとしても使えるかなというもくろみ
└未確保 1157G…今後の拡張領域
sda3 残り2Gちょい…swap

ちなみに、この後sda1をルートファイルシステムにし、sda5を/varに割り当てようと思ってます。
これはWEBサーバーやストリーミングサーバのデフォルトのデータ格納場所が/var以下にあるためです。

第1パーティションsda1を作成
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p ←プライマリーパーティションpを入力してENTER
Partition number (1-4, default 1): ←デフォルト1なのでそのままENTER
Using default value 1
First sector (2048-2918175119, default 2048): ←開始位置。そのままENTER
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2918175119, default 2918175119): +32G ←終了位置。サイズ指定で+36Gと入力しENTER

第2パーティション作成
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): e ←拡張パーティションなのでeを入力してENTER
Partition number (1-4, default 2):
Using default value 2
First sector (67110912-2918175119, default 67110912):
Using default value 67110912
Last sector, +sectors or +size{K,M,G} (67110912-2918175119, default 2918175119): +1357G ←終了位置。サイズ指定+1357Gと入力

第3パーティション作成
Command (m for help): n
Partition type:
p primary (1 primary, 1 extended, 2 free)
l logical (numbered from 5) ←※
Select (default p): p
Partition number (1-4, default 3):
Using default value 3
First sector (2912946176-2918175119, default 2912946176):
Using default value 2912946176
Last sector, +sectors or +size{K,M,G} (2912946176-2918175119, default 2918175119): ←最後は全部使うのでデフォルトで(何も入力しないまま)ENTER
Using default value 2918175119

※拡張パーティションはHDD内に1つしか作れないのでeがlに変わる。
lはlgical partition(論理パーティション)の略で拡張パーティション内に好きなだけ作れる。
論理パーティションの番号は5から順次割り当てられるのでsda5,sda6…というふうになる。

拡張パーティション(第2パーティション)の中に論理パーティション200Gを作成
Command (m for help): n
Partition type:
p primary (2 primary, 1 extended, 1 free)
l logical (numbered from 5)
Select (default p): l ←論理パーティションを作るのでlを入力してENTER
Adding logical partition 5
First sector (67112960-2912946175, default 67112960):
Using default value 67112960
Last sector, +sectors or +size{K,M,G} (67112960-2912946175, default 2912946175): +200G ←容量は200G

第3パーティションのタイプをswapに変更
Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 82 ←swap領域のコード82を入力してENTER(ここでLを入力するとコードリストが表示される)
Changed system type of partition 3 to 82 (Linux swap / Solaris)

パーティションの分割は以上。分割結果を表示させる。
Command (m for help): p
(中略)
Device Boot Start End Blocks Id System
/dev/sda1 2048 67110911 33554432 83 Linux
/dev/sda2 67110912 2912946175 1422917632 5 Extended
/dev/sda3 2912946176 2918175119 2614472 82 Linux swap / Solaris
/dev/sda5 67112960 486543359 209715200 83 Linux

目標通りにパーティション確保ができました。
と精緻可憐に書いてはいますが実際には残りのswap領域が2Gちょいになるように
何回かパーティションを作ったり消したりを繰り返してサイズを調整してます。

最後にパーティション分割の内容を保存して終了します。
この操作でパーティション分割が確定して今までのHDDの中身は見えなくなります。
(保存せずに終了したい場合はqで終了します)
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

作成したパーティションをフォーマット

作成したパーティションはそのままでは使えませんので使えるようにフォーマットします。
sda1とsda5はファイルシステムとして使うのでext4ファイルシステムでフォーマット。
sda3はswapとして使うのでswapシステムとしてフォーマットします。
ちなみに拡張パーティションsda2は論理パーティションの入れ物なので、sda2自体のフォーマットは不要です。

sudo mkfs.ext4 /dev/sda1
sudo mkfs.ext4 /dev/sda5
これでsda1とsda5にext4ファイルシステムが作られます。

sudo mkswap /dev/sda3
これでsda3にスワップファイルシステムができます。
(ここではとりあえず作っておくだけで今は使いません)

②HDDへデータを移行

フォーマットができたのでHDDへSDカードのデータを移行します。
今回参考URLの記述に対して、追加で論理パーティションを作ったのでその対応が変わります。
流れとしては以下のように進めようと思います。

②-1 sda1にmmcblk0p2の中身をコピー
②-2 起動時の自動マウント設定を変更 その1
②-3 /varの内容をsda5へコピー
②-4 元の/varを別名保存し、/varへsda5をマウント
②-5 起動時の自動マウント設定を変更 その2

②-1 sdaにmmcblk0p2の中身をコピーする。

sudo dd if=/dev/mmcblk0p2 of=/dev/sda1 bs=32M conv=noerror,sync

上記コマンドの意味を詳しく書いておきます。
(参考:http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230741/)
ddはファイルを変換しながらのコピーやデバイスからデバイスへ直接コピーを行うとき使用するコマンド
if=の後には入力ファイルを指定します。ここではSDカードの第2パーティションを指定
of=の後には出力ファイルを指定します。ここではHDDの第1パーティションを指定
bs=の後は1度に読み書きするブロックのバイト数。ここでは32MBずつ読み書きすると指定。なぜ32Mかは??
conv=の後はコード変換を指定。
noerrorは読み込みエラーが発生したとしても継続するオプション。
syncはsbで指定したブロック数に合わせるオプション

暫く時間がかかるので(3~5分程)終わるのを待ってコピーしたファイルシステムをチェックします。
sudo e2fsck -f /dev/sda1

e2fsck 1.42.5 (29-Jul-2012)
/dev/sda1: recovering journal
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Free blocks count wrong (104477, counted=95567).
Fix? yes
Free inodes count wrong (95690, counted=93983).
Fix? yes

一部エラーの出ているブロックについてはyを入力して修復。再度チェックをかけます。
sudo e2fsck -f /dev/sda1

sda1パーティション全領域を使えるようにします。
sudo resize2fs /dev/sda1

一度マウントして確認します。
sudo mkdir /tmp/b ←マウント用ディレクトリを作成
sudo mount -t ext4 -o defaults /dev/sda1 /tmp/b
上記コマンドは/dev/sda1を/tmp/bにファイルシステムext4・オプションはデフォルトでマウントするの意味。
df -a
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 2721336 2339072 224312 92% /
/dev/root 2721336 2339072 224312 92% /
(中略)
/dev/sda1 32971632 2343148 28934380 8% /tmp/b ←これ

②-2 起動時の自動マウント設定を変更 その1

今の状態で一度起動設定を変更して起動時にHDDのsda1をルートファイルシステムとしてマウントするようにします。
cmdline.txtの設定はRaspberry pi固有っぽいです。

sudo cp /boot/cmdline.txt /boot/cmdline.txt.org ←バックアップ作成
sudo vi /boot/cmdline.txt

cmdline.txtの編集内容
root=/dev/mmcblk0p2の部分をroot=/dev/sda1に書き換え

sudo vi /tmp/b/etc/fstab ←sda1内のfstabを編集(先ほど/tmp/bへマウントしたのでそれに従う)

fstabの編集内容
3行目付近の/dev/mmcblk0p2の部分を/dev/sda1に書き換え

一度再起動します。
sync;sync;sync
sudo shutdown -r now

上記は”;”で区切って複数のコマンドを実行しています。
syncはメモリ上にバッファされたデータをディスクに強制的に書き込むコマンドです。
安全のため3回実行した後に再起動してます。

再起動したらターミナルでログインしてきちんとマウント位置がsda1に変更されているか確認
df -h

Filesystem Size Used Avail Use% Mounted on
rootfs 32G 2.3G 28G 8% /
/dev/root 32G 2.3G 28G 8% /
devtmpfs 211M 0 211M 0% /dev
tmpfs 44M 224K 44M 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 88M 0 88M 0% /run/shm
/dev/mmcblk0p1 56M 19M 38M 34% /boot

もしうまく再起動できなかった場合はSDカードをWindowsで開いて、
cmdline.txtを削除してcmdline.txt.orgをcmdline.txtにリネームすれば元の環境に戻るはずです。

ルートファイルシステムを1つのパーティションで構築する場合は以上でHDDへの移行は完了です。
私は/varを別パーティションにすることにしたので、もう少し作業が続きます。
長くなったので続きは次回にします。

2014年4月6日作成
2014年5月4日草稿公開

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメント

  1. […] 05 Raspberry PiファイルシステムHDD化 その1/3 (HDD接続~データ移行) […]