お知らせ!! 「jpcmoh.myds.me」から「mohlog.com」へ変更しました
PR
Linuxをつかおう!!

Raspberry pi(ラズパイ)をRAID1から起動

アイキャッチ ラズパイRAID1 Linuxをつかおう!!
記事内に広告が含まれています。
スポンサーリンク

はじめに

Raspberry pi(以下「ラズパイ」と表記)をサーバーにして24時間稼働させたようと思ってます。
その場合、ストレージの破損でデータが消えるのをふせがなければなりません。
著者の場合は、WEBデータだけでなく、システムごと保護したいので、RAID1から起動できるようにしてみました。

ただ、最初のブート領域(/boot/firmware)だけはどうしてもRAIDにできず、そこだけSDカードとし、ディスクイメージでバックアップをとる方式にしました。

RAID1用のストレージは、SSDを2台用意しUSB接続のケースに入れて使用しました。
メンテを簡単にするため、1パーティション構成としました。

今回は、Raspberry Pi 5 を使用しています。

created by Rinker
Raspberry Pi
¥12,700 (2025/09/12 14:03:29時点 Amazon調べ-詳細)
スポンサーリンク

準備

SDカードにRaspberry Pi OSをインストール

Raspberry Pi Imagerをつかって、Raspberry Pi OS 64bitをインストールします。

Raspberry Pi Imager

事前に、OS Customizationで、ユーザー設定やSSHを有効にしておきます。
書き込みが終わったら、Raspberry Pi に挿入して起動します。

OSアップデート

起動したら、OSのアップデートをしておきます。
今回は、別のPCからからSSH接続して操作しています。

コマンド:SSH接続

$ ssh ユーザー名@Raspberry PiのIPアドレス
もしくは
$ ssh ユーザー名@ホスト名(例rpi5.localなど、OSインストール時にOS Customizationで設定したもの)

コマンド:OSのアップデート

$ sudo apt update
$ sudo apt -y upgrade

念のため、再起動しておきます。

コマンド:再起動

$ sudo reboot

スポンサーリンク

RAID1から起動できるようにする

mdadmのインストール

ソフトウェアRAIDを使用するため、mdadmをインストールします。

コマンド: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の状態をみてみます。

コマンド: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を解除して初期化してから使います。

コマンド:RAIDを止める

$ sudo mdadm --stop /dev/md127

結果

mdadm: stopped /dev/md127

パーティション削除

SSD1台ずつ作業します。

コマンド:1台め sda パーティション削除

$ 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.

もう一台も同様に実施します。

コマンド:2台め sdb パーティション削除

$ sudo fdisk /dev/sdb

おわったら、再起動します。

コマンド:再起動

$ sudo reboot

SSDにパーティションを作成

引き続き、パーティションの作成を行います。
新品SSDの場合はここから実施します。

コマンド:1台め sda パーティション作成

$ 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.

コマンド:2台め sdb パーティション作成

$ 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 /

sda1sdb1がちゃんとできています。
この2つでRAID1を構成します。

ちなみに、2台のSSDの容量が違っていてもRAID1は組めます。

コマンド: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の状態を見ます。

コマンド:RAID1を構成する

$ 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をフォーマットします。

コマンド: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ボリュームとデバイス名を登録します。

コマンド:RAID1を構成する

$ 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)のイメージを作成します。

コマンド:/etc/initramfs-tools/modules を編集

$ sudo nano /etc/initramfs-tools/modules

以下の3行を追加します

追加

raid1
md_mod
ext4

initiramfs (initial ram file system)のイメージを作成します。

コマンド: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を/ となるように設定します。

コマンド:/boot/firmware/cmdline.txtの編集

$ 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にマウントしてから作業します。

コマンド:/dev/md0を/mnt/md0にマウント

$ sudo mkdir /mnt/md0
$ sudo mount /dev/md0 /mnt/md0

コマンド:/etc/fstab を編集

$ 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による冗長がとれていないので、バックアップしておきます。

コマンド:/boot/firmware SDカードブート領域のバックアップ

$ 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内のファイルに変更が入るので、 そのバックアップを更新することぐらいです。

コメント

タイトルとURLをコピーしました