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

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

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

はじめに

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

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

INFO

最初のブート領域(/boot/firmware)をRAID1化することは、基本的に不可能だそうです。
理由:RAIDデバイスは Linux カーネルがロードされた後で初期化されるため、その前に起動に必要な /boot/firmware を RAID 上に置くことはできない。

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

ラズパイは、Raspberry Pi 5 を使用しています。

created by Rinker
Raspberry Pi
¥12,700 (2025/10/02 13:20:38時点 Amazon調べ-詳細)
スポンサーリンク

準備

microSDカードに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

sdasdbが、USB接続したSSDです。
sda2sdb2の下に、md127とありますが、別PC(OSはubuntu)で組んだRAID1がこれです。
RAIDの状態をみてみます。

コマンド:RAIDの状態をみる
cat /proc/mdstat

別のPCに接続したのに、RAID1として使えるんですね。
そのまま使うこともできそうですが、今回はRAIDを解除して初期化してから使います。

コマンド:RAIDを止める
sudo mdadm --stop /dev/md127

パーティション削除

SSD1台ずつ作業します。

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

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

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

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

コマンド:再起動
sudo reboot

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

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

コマンド:1台め sda パーティション作成
sudo fdisk /dev/sda
コマンド:2台め sdb パーティション作成
sudo fdisk /dev/sdb

RAID1を構成する

まずは、ストレージを確認します。

コマンド:ストレージの情報をみる
lsblk

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

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

コマンド:RAID1を構成する
sudo mdadm --create /dev/md0 --level=raid1 --raid-devices=2 /dev/sda1 /dev/sdb1

途中、RAIDを作成するか聞かれるので、「y」と入力します。

lsblkで確認すると、以下のようになりました。

RAIDの状態を見ます。

コマンド:RAID1の状態を見る
cat /proc/mdstat

同期中です。このまま進めることもできますが、終わるまで待った方がよいでしょう。

フォーマット

RAID1である/dev/md0をフォーマットします。

コマンド:RAID1 /dev/md0をフォーマットする
sudo mkfs -t ext4 /dev/md0

途中質問がありますが、なにも記入せず[Enter]を押します。

RAIDボリュームの登録

デバイス名/dev/md0 が起動の度に変わらないように、mdadmの設定ファイルにをRAIDボリュームとデバイス名を登録します。

コマンド:RAID1をmdadmの設定ファイルに登録する
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf

/(ルート)を、microSDカードからSSDのRAID1領域にコピーする

/(ルート)となっているデバイス名を調べます。

コマンド:/(ルート)となっているデバイス名を調べる
df

/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

パーティションを拡大します。

コマンド:パーティションを拡大
sudo resize2fs -p /dev/md0

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

補足:インストール済みのすべてのカーネルバージョンに対して反映させる場合

コマンド:インストール済みのすべてのカーネルバージョンに対して反映させる場合
sudo update-initramfs -u -k all

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ボリュームが/にマウントされるように設定します。
編集するのは、microSDカード内の/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は、指定の仕方が変わっただけで、microSDカードの第1パーティションであることにかわりはありません。ただ、バックアップをとったときに、IDが変わってしまうため、IDでなくハードの場所で指定しています。

ここまでで、設定は終わりです。

スポンサーリンク

RAID1から起動

再起動します。

コマンド:再起動
sudo reboot

起動後、RAIDボリュームが/にマウントできているか調べます。

コマンド:ファイルシステムの情報表示
df -h

これで完了です。

スポンサーリンク

/boot/firmware ブート領域(microSDカード)のバックアップ

/boot/firmware だけは、microSDカードにあり、RAIDによる冗長がとれていないので、バックアップしておきます。

コマンド:/boot/firmware microSDカードブート領域のバックアップ
sudo dd if=/dev/mmcblk0 count=512 bs=1M status=progress | sudo xz -9 > bootSD.img.xz

count=512 bs=1M:ブート領域は、microSDカードの先頭512MB部分にあるのでそこだけコピーします。
| sudo xz -9:同時に圧縮します。

bootSD.img.xz というファイルができあがるので、これを他のPCやファイルサーバーに保管しておきます。
このファイルは、解凍することなく、そのままRaspberry Pi Imagerをつかって、microSDカードに書き込むことができます。

スポンサーリンク

おわりに

かなり長文になりましたが、実際にこれでWEBサーバーをつくりテストを実施しています。
注意点としては、OSのアップデートで、たまに/boot/firmware内のファイルに変更が入るので、 そのバックアップを更新することぐらいです。

コメント

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