[RasPi]ルートパーテーションの外部ストレージ化

肝心のmdadmが"/boot"以外にある為、そのまま移動すると起動出来なくなるのでInitramfsという物を使ってみます。 どうやらメモリ上に展開できる簡易的なルートファイルシステムを構築できる仕組み?らしいです。

Initramfs読み込みモジュールの設定

RaspberryPiのforumの記述をマネしました。RAID1モジュールと必要な物を列記するみたい。

sudo vi /etc/initramfs-tools/modules
# List of modules that you want to include in your initramfs.
# They will be loaded at boot time in the order below.
#
# Syntax:  module_name [args ...]
#
# You must run update-initramfs(8) to effect this change.
#
# Examples:
#
# raid1
# sd_mod
raid1
md_mod
ext4

下の3行で起動時のイメージに読み込むモジュールを指定しています。



Initramfsのイメージ作成

何度かオプションが足りないエラー出たけど以下コマンドで新規Initramfsが何とか作れました。

sudo update-initramfs -c -k `uname -r`
update-initramfs: Generating /boot/initrd.img-4.9.59-v7+

コマンドの"-c"が新規作成、"-k"がカーネルバージョンの指定。
応答から”initrd.img-4.9.59-v7+”が生成されたのがわかる。丁寧にやるならlsコマンドで確認してもOK。



RaspberryPiブートイメージの設定

Raspbianの場合は起動するカーネルの指定には"/boot/config.txt"に記述するようです。
読み込むカーネルとInitramfs作成コマンドの応答メッセージで生成された"initrd.img-4.9.59-v7+"を指定します。

sudo vi /boot/config.txt
 中略
kernel=kernel7.img
initramfs initrd.img-4.9.59-v7+ followkernel

記載個所は末尾で問題ない様子、上記の2行を追記



ルートパーテーションの移動("/boot"以外の移動)

dfコマンドでマウント状態を確認します。

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       7.2G  4.3G  2.7G  62% /
devtmpfs        434M     0  434M   0% /dev
tmpfs           438M     0  438M   0% /dev/shm
tmpfs           438M   12M  427M   3% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           438M     0  438M   0% /sys/fs/cgroup
/dev/mmcblk0p1   43M   34M  9.5M  78% /boot
tmpfs            88M     0   88M   0% /run/user/109
tmpfs            88M     0   88M   0% /run/user/1001
/dev/md0         15G  1.7G   13G  12% /mnt/md0

”/dev/mmcblk0p1”が"/boot"としてマウントされています。
"/boot"以外はと言うと”/dev/mmcblk0p2”に入っているようです。

copyコマンドやddコマンドもあるけどrsync使ってコピーしてみます。

sudo rsync -axv --exclude={/boot/*,/mnt/md0/*} / /mnt/md0

ファイルのコピー(正確には同期)が画面にながれるのでプロンプトが返るのを待ちます。



マウント先の変更

設定ファイル"cmdline.txt"でルートパーテーションを"/dev/md0"に変更します。
併せて”rootdelay=10”を追記して10秒間RAIDマウントされるまでwaitを入れます。

sudo vi /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/md0 rootfstype=ext4 elevator=deadline fsck.repair=yes rootdelay=10 rootdelay=10 rootwait quiet splash plymouth.ignore-serial-consoles


このままだとfstabで”/dev/mmcblk0p2”をルートパーテーションと指定しているので修正します。

sudo vi /mnt/md0/etc/fstab
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/md0        /               ext4    defaults,noatime  0       2
#/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
#/dev/md0        /mnt/md0        ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that


これで再起動した後はSDカードの"/boot"から起動が行われ、USBメモリで構築したRAID1デバイスがルートパーテーションとして起動されました。
ただし、USBメモリの認識順序などでデバイス名が変わったりするのでUUID指定するのが今のトレンドらしいです。

RaspberryPiにRAIDってのはやってみたかっただけで不要かも、SDイメージをバックアップしておけば良いだけ。