はじめに
Raspberry pi(以下「ラズパイ」と表記)をサーバーにして24時間稼働させたようと思ってます。
その場合、ストレージの破損でデータが消えるのをふせがなければなりません。
著者の場合は、WEBデータだけでなく、システムごと保護したいので、RAID1から起動できるようにしてみました。
ただ、最初のブート領域(/boot/firmware)だけはどうしてもRAIDにできず、そこだけSDカードとし、ディスクイメージでバックアップをとる方式にしました。
RAID1用のストレージは、SSDを2台用意しUSB接続のケースに入れて使用しました。
メンテを簡単にするため、1パーティション構成としました。
今回は、Raspberry Pi 5 を使用しています。
準備
SDカードにRaspberry Pi OSをインストール
Raspberry Pi Imagerをつかって、Raspberry Pi OS 64bitをインストールします。

事前に、OS Customizationで、ユーザー設定やSSHを有効にしておきます。
書き込みが終わったら、Raspberry Pi に挿入して起動します。
OSアップデート
起動したら、OSのアップデートをしておきます。
今回は、別のPCからからSSH接続して操作しています。
$ ssh ユーザー名@Raspberry PiのIPアドレス
もしくは
$ ssh ユーザー名@ホスト名(例rpi5.localなど、OSインストール時にOS Customizationで設定したもの)
$ sudo apt update
$ sudo apt -y upgrade
念のため、再起動しておきます。
$ sudo reboot
RAID1から起動できるようにする
mdadmのインストール
ソフトウェアRAIDを使用するため、mdadmをインストールします。
$ sudo apt install -y mdadm
RAID1用SSD2台を初期化(必要な場合)
用意しておいたSSDをラズパイに接続します。
RAIDを解除(必要な場合)
新品のSSDの場合は、この作業は不要です。
今回、別のPCでRAID1で使用していたものを再利用したため、これを初期化した手順を紹介します。
まず、ラズパイに接続されたストレージの情報をみます。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 111.8G 0 disk
├─sda1 8:1 0 1G 0 part
└─sda2 8:2 0 110.7G 0 part
└─md127 9:127 0 110.7G 0 raid1
└─md127p1 259:3 0 110.7G 0 part
sdb 8:16 0 119.2G 0 disk
├─sdb1 8:17 0 1G 0 part
└─sdb2 8:18 0 118.2G 0 part
└─md127 9:127 0 110.7G 0 raid1
└─md127p1 259:3 0 110.7G 0 part
mmcblk0 179:0 0 28.9G 0 disk
├─mmcblk0p1 179:1 0 512M 0 part /boot/firmware
└─mmcblk0p2 179:2 0 28.4G 0 part /
sdaとsdbが、USB接続したSSDです。
sda2とsdb2の下に、md127とありますが、別PC(OSはubuntu)で組んだRAID1がこれです。
RAIDの状態をみてみます。
$ cat /proc/mdstat
Personalities : [raid1]
md127 : active (auto-read-only) raid1 sdb2[2] sda2[0]
116050944 blocks super 1.2 [2/2] [UU]
bitmap: 0/1 pages [0KB], 65536KB chunk
別のPCに接続したのに、RAID1として使えるんですね。
そのまま使うこともできそうですが、今回はRAIDを解除して初期化してから使います。
$ sudo mdadm --stop /dev/md127
mdadm: stopped /dev/md127
パーティション削除
SSD1台ずつ作業します。
$ sudo fdisk /dev/sda
Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
This disk is currently in use - repartitioning is probably a bad idea.
It's recommended to umount all file systems, and swapoff all swap
partitions on this disk.
Command (m for help): p ←いまの状態をみます
Disk /dev/sda: 111.79 GiB, 120034123776 bytes, 234441648 sectors
Disk model: S340 120GB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: EB66BF63-35B5-48FB-B0D9-76B293AAD983
Device Start End Sectors Size Type
/dev/sda1 2048 2203647 2201600 1G EFI System
/dev/sda2 2203648 234438655 232235008 110.7G Linux filesystem
ommand (m for help): d ←パーティション削除します
Partition number (1,2, default 2):[Enter]で2を消します
Partition 2 has been deleted.
Command (m for help): d ←さらに残っている最後のパーティション削除します
Selected partition 1
Partition 1 has been deleted.
Command (m for help): p ←いまの状態をみます
Disk /dev/sda: 111.79 GiB, 120034123776 bytes, 234441648 sectors
Disk model: S340 120GB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: EB66BF63-35B5-48FB-B0D9-76B293AAD983
Command (m for help): w ←これで書き込みます
The partition table has been altered.
Failed to remove partition 2 from system: Device or resource busy
The kernel still uses the old partitions. The new table will be used at the next reboot.
Syncing disks.
もう一台も同様に実施します。
$ sudo fdisk /dev/sdb
おわったら、再起動します。
$ sudo reboot
SSDにパーティションを作成
引き続き、パーティションの作成を行います。
新品SSDの場合はここから実施します。
$ sudo fdisk /dev/sda
Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n ←パーティション作成
Partition number (1-128, default 1):[Enter]
First sector (34-250069646, default 2048):[Enter]
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-250069646, default 250068991):
Created a new partition 1 of type 'Linux filesystem' and of size 119.2 GiB.
Partition #1 contains a vfat signature.
Do you want to remove the signature? [Y]es/[N]o: y
The signature will be removed by a write command.
Command (m for help): w ←書き込み
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
$ sudo fdisk /dev/sdb
RAID1を構成する
まずは、ストレージを確認します。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 119.2G 0 disk
└─sda1 8:1 0 119.2G 0 part
sdb 8:16 0 111.8G 0 disk
└─sdb1 8:17 0 111.8G 0 part
mmcblk0 179:0 0 28.9G 0 disk
├─mmcblk0p1 179:1 0 512M 0 part /boot/firmware
└─mmcblk0p2 179:2 0 28.4G 0 part /
sda1とsdb1がちゃんとできています。
この2つでRAID1を構成します。
ちなみに、2台のSSDの容量が違っていてもRAID1は組めます。
$ sudo mdadm --create /dev/md0 --level=raid1 --raid-devices=2 /dev/sda1 /dev/sdb1
途中、RAIDを作成するか聞かれるので、「y」と入力します。
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
mdadm: largest drive (/dev/sda1) exceeds size (117152768K) by more than 1%
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
lsblkで確認すると、以下のようになりました。
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 119.2G 0 disk
└─sda1 8:1 0 119.2G 0 part
└─md0 9:0 0 111.7G 0 raid1
sdb 8:16 0 111.8G 0 disk
└─sdb1 8:17 0 111.8G 0 part
└─md0 9:0 0 111.7G 0 raid1
mmcblk0 179:0 0 28.9G 0 disk
├─mmcblk0p1 179:1 0 512M 0 part /boot/firmware
└─mmcblk0p2 179:2 0 28.4G 0 part /
RAIの状態を見ます。
$ cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdb1[1] sda1[0]
117152768 blocks super 1.2 [2/2] [UU]
[=>……………….] resync = 6.2% (7286464/117152768) finish=45.4min speed=40280K/sec
bitmap: 1/1 pages [16KB], 65536KB chunk
unused devices:
同期中です。このまま進めることもできますが、終わるまで待った方がよいでしょう。
フォーマット
RAID1である/dev/md0をフォーマットします。
$ sudo mkfs -t ext4 /dev/md0
途中質問がありますが、なにも記入せず[Enter]を押します。
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 29288192 4k blocks and 7323648 inodes
Filesystem UUID: 18544c38-5957-4d02-b06e-93e6fb90b8ab
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks):←[Enter]
done
Writing superblocks and filesystem accounting information: done
RAIDボリュームの登録
デバイス名/dev/md0 が起動の度に変わらないように、mdadmの設定ファイルにをRAIDボリュームとデバイス名を登録します。
$ sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
/(ルート)を、SDカードからSSDのRAID1領域にコピーする
/(ルート)となっているデバイス名を調べます
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
udev 4085856 0 4085856 0% /dev
tmpfs 825680 14512 811168 2% /run
/dev/mmcblk0p2 29251136 5397152 22347696 20% /
tmpfs 4128352 400 4127952 1% /dev/shm
tmpfs 5120 48 5072 1% /run/lock
/dev/mmcblk0p1 522230 71440 450790 14% /bo ot/firmware
tmpfs 825664 176 825488 1% /run/user/1000
/dev/mmcblk0p2 とわかりましたので、これをすべて/dev/md0にコピーします。
$ sudo dd if=/dev/mmcblk0p2 of=/dev/md0 bs=32M conv=noerror,sync status=progress
コピーが終わったら、ファイルシステムのチェックを実施します。
$ sudo e2fsck -f -y /dev/md0
e2fsck 1.47.0 (5-Feb-2023)
rootfs: 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
rootfs: 168286/1860480 files (0.2% non-contiguous), 1486104/7449600 blocks
パーティションを拡大します。
$ sudo resize2fs -p /dev/md0
resize2fs 1.47.0 (5-Feb-2023)
Resizing the filesystem on /dev/md0 to 29288192 (4k) blocks.
The filesystem on /dev/md0 is now 29288192 (4k) blocks long.
RAIDボリュームから起動するための設定
initramfsイメージの作成
起動時にRAIDが使用できるようにinitiramfs (initial ram file system)のイメージを作成します。
$ sudo nano /etc/initramfs-tools/modules
以下の3行を追加します
raid1
md_mod
ext4
initiramfs (initial ram file system)のイメージを作成します。
$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-6.12.34+rpt-rpi-v8
'/boot/initrd.img-6.12.34+rpt-rpi-v8' -> '/boot/firmware/initramfs8'
update-initramfs: Generating /boot/initrd.img-6.12.34+rpt-rpi-2712
'/boot/initrd.img-6.12.34+rpt-rpi-2712' -> '/boot/firmware/initramfs_2712'
cmdline.txtの設定
起動時に、RAIDを/ となるように設定します。
$ sudo nano /boot/firmware/cmdline.txt
変更箇所
旧 root=PARTUUID=d38f6878-02 (d38f6878-02は環境によりちがう)
新 root=/dev/md0
追加
rootdelay=5
修正結果は以下のようになります(1行です)
console=serial0,115200 console=tty1 root=/dev/md0 rootfstype=ext4 fsck.repair=yes rootdelay=5 rootwait quiet splash plymouth.ignore-serial-consoles
fstabの編集
起動時にRAIDボリュームが/にマウントされるように設定します。
編集するのは、SDカード内の/etc/fstabではなく、RAIDボリューム/dev/md0にコピーしたほうです。
読み書き出きるように、/dev/md0を/mnt/md0にマウントしてから作業します。
$ sudo mkdir /mnt/md0
$ sudo mount /dev/md0 /mnt/md0
$ sudo nano /mnt/md0/etc/fstab
赤字の部分を青字へ変更します。
proc /proc proc defaults 0 0
PARTUUID=d38f6878-01 /boot/firmware vfat defaults 0 2
PARTUUID=d38f6878-02 / ext4 defaults,noatime 0 1
a swapfile is not a swap partition, no line here
use dphys-swapfile swap[on|off] for that
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot/firmware vfat defaults 0 2
/dev/md0 / ext4 defaults,noatime 0 1
a swapfile is not a swap partition, no line here
use dphys-swapfile swap[on|off] for that
/dev/mmcblk0p1は、指定の仕方が変わっただけで、SDカードの第1パーティションであることにかわりはありません。ただ、バックアップをとったときに、IDが変わってしまうため、IDでなくハードの場所で指定しています。
ここまでで、設定は終わりです。
RAID1から起動
再起動します。
$ sudo reboot
起動後、RAIDボリュームが/にマウントできているか調べます。
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 807M 15M 793M 2% /run
/dev/md0 110G 5.2G 100G 5% /
tmpfs 4.0G 400K 4.0G 1% /dev/shm
tmpfs 5.0M 48K 5.0M 1% /run/lock
/dev/mmcblk0p1 510M 70M 441M 14% /boot/firmware
tmpfs 807M 76K 807M 1% /run/user/1000
/dev/mmcblk0p2 28G 5.2G 22G 20% /media/mohlog/rootfs
これで完了です。
/boot/firmware ブート領域(SDカード)のバックアップ
/boot/firmware だけは、SDカードにあり、RAIDによる冗長がとれていないので、バックアップしておきます。
$ sudo dd if=/dev/mmcblk0 count=512 bs=1M status=progress | sudo xz -9 > bootSD.img.xz
count=512 bs=1M:ブート領域は、SDカードの先頭512MB部分にあるのでそこだけコピーします。
| sudo xz -9:同時に圧縮します。
bootSD.img.xz というファイルができあがるので、これを他のPCやファイルサーバーに保管しておきます。
このファイルは、解凍することなく、そのままRaspberry Pi Imagerをつかって、SDカードに書き込むことができます。
おわりに
かなり長文になりましたが、実際にこれでWEBサーバーをつくりテストを実施しています。
注意点としては、OSのアップデートで、たまに/boot/firmware内のファイルに変更が入るので、 そのバックアップを更新することぐらいです。
コメント