能書き
おうちサーバー構築報告:予告の流れとは違いますが。実は予告でも触れた我が家の HP N54L が、とうとう故障しました。連続して大量のファイルをコピーすると、いつの間にか電源が切れます… バックアップが出来ません。これは困った!
偶々タイミング良く、知り合いから2TBのHDDを5台譲っていただきました。そこでまあ少々考えまして、ラズパイ5でNASを作ってみようかと。HDDケースとしてはMAL355EU3Rを選択。
と言う訳で、今回はラズパイ5をNASに仕立てる過程の記録です。
ハードウェア
- ラズパイ5スターターキット 8GB版
- RAID対応 SATA3.5&SATA2.5インチHDD5台ケースMAL355EU3R
- 今までN54Lで使っていた、今となっては小容量の500GB HDD ×4台 + 1TB HDD ×1台
やること
- ラズパイ5にUbuntuServerをインストール
- ZFSとSambaを設定
- 今まで使っていたHDDをインポートして、データを引き継ぐ
参考文献
- Raspberry Pi 5 スターターキット/コンプリートキット 組み立て - SWITCH SCIENCE
- ラズパイ5に64ビットOS(Lite版)をインストール - Zenn
- Raspberry Pi 5 に Ubuntu Server を簡単セットアップ - ぎょーむにっし
- Ubuntu Server 22.04LTSでIPアドレスを固定する方法 - Qiita
- インストール - OpenZFS - インストール - 私的サーバー構築日誌:Ubuntu 24.04 LTS in MicroServer N54L - Qiita
- ストレージのimport - OpenZFS - インストール - 私的サーバー構築日誌:Ubuntu 24.04 LTS in MicroServer N54L
- 別マシンで作成したzpoolのインポート - UbuntuにZFSを導入しSambaファイルサーバにする - クリエイターの雑記帳
- 私的サーバー構築日誌:Sambaで共有フォルダ公開・Ubuntu 24.04 LTS in MicroServer N54L - Qiita
ラズパイ5にUbuntuServerをインストール
Windows版インストーラー
まずは公式サイトから Raspberry Pi Imager をダウンロードします。私の場合は普段使いのマシンがWindowsなので、Windows版インストーラーをダウンロードします。
ダウンロードしたインストーラーを実行します。
「このアプリがデバイスに変更を加える事を許可しますか?」画面が表示されるので、ここは「はい」をクリックします。
Select Setup Language 画面。日本語は無いようなのでEnglishを選択します。
Welcome画面。
License Agreement 画面。「I accept the agreement」を選択。
Select Destination Location 画面。インストール先フォルダを選択します。私はデフォルトでいきます。
Select Additional Tasks 画面。デスクトップにショートカットを作るか否かを選択できるようですが、私は不要です。
Raspberry Pi Imager セットアップウィザード、完了。
Raspberry Pi Imager
Raspberry Piデバイスは「RASPBERRY PI 5」を選択。
OS > Other general-purpose OS > Ubuntu > Ubuntu Server 24.04.2 LTS (64-bit)
ストレージ… あ、忘れてた。MicroSDカードをこのノートパソコンで書き込めるようにアダプターで接続します。そうすると選択肢が表示されます。
ストレージ > SDHD Card - 31.0GB
「次へ」ボタンをクリックすると「Would you like to apply OS customization settings?」ダイアログが表示されますので、「設定を編集する」ボタンをクリックします。
Windows とアプリに位置情報へのアクセスを許可しますか? ラズパイと言えばイギリス製ですし、とりあえず「はい」でいいかな。
OS Customization 画面一般タブ。Wi-Fi以外の各項目を設定します。ここは各自のお好みで。ちなみにWi-Fiに関しては通信速度の点で有線の方が有利だそうです。
OS Customization 画面サービスタブ。私はSSHを公開鍵認証にしたかったんですが、なぜか、キーを貼り付けられません。仕方が無くパスワード認証にしました。
OS Customization 画面オプションタブ。デフォルトのままでいいですかね。
全部設定したら「保存」ボタンをクリックします。
Would you like to apply OS customization settings? 画面。「はい」をクリックします。
削除の確認画面。「はい」をクリックします。
Windowsのフォーマット確認画面。恐らく Raspberry Pi Imager がMicroSDのフォーマットを壊して、そのせいでWindowsが認識できなくなって、という流れでこの画面なのでしょう。ここは「キャンセル」をクリックします。
書き込みは順調に進みます。
書き込みが終了したらMicroSDカードを取り出して、Raspberry Pi Imager を終了します。
ラズパイ起動とssh接続
MicroSDカードをラズパイに挿入します。そしてEthernetケーブル・モニター・USBキーボード・電源を繋ぎます。OSがUbuntuServerなのでマウスは不要です。
モニターはスターターキットに同梱されていたHDMI-miniHDMIのケーブルですね。ラズパイ側にはminiHDMI端子が2つありますが、どちらに挿入しても大丈夫のようです。
電源は繋いだ途端にスイッチが入りますので、最後に繋ぎましょう。
最初に電源を入れた時にはcloud-initが動くようです。まずは一服して落ち着くのを待ちますか。ロシアンティーを一杯。ジャムではなく、マーマレードでもなく、蜂蜜で。
無事に起動すると、Windowsマシンからはホスト名で接続できるようです。
ping raspberrypi
ssh administrator@raspberrypi
ネットワークIPアドレス固定化
ラズパイのIPアドレスを固定化します。
cd /etc/netplan
sudo vi 99-config.yaml
/etc/netplan
には50-cloud-init.yaml
が存在しますが、これはこのまま放置し、99-config.yaml
ファイルを追加します。その内容は我が家のIPアドレス体系に従って下記にします。
- NASのIPアドレス: 172.16.1.3/16
- デフォルトゲートウェイ: 172.16.2.1
- DNSサーバ: デフォルトゲートウェイと同じ(172.16.2.1)
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: false
dhcp6: false
addresses: [172.16.1.3/16]
routes:
- to: default
via: 172.16.2.1
nameservers:
addresses: [172.16.2.1]
/etc/netplan/99-config.yaml
を作成したら反映します。すると即座にIPアドレスが変わりますのでsshが切断されます。
sudo chmod 600 99-config.yaml
sudo netplan apply
sshを接続し直しましょう。
UbuntuServerにNAS設定
ZFS
インストール
OpenZFSをインストールします。
sudo apt update -y && sudo apt upgrade -y
sudo apt install -y zfsutils-linux
zfsがインストールされた事を確認します。
zpool --version
実行結果はこんな感じになります。
$ zpool --version
zfs-2.2.2-0ubuntu9.2
zfs-kmod-2.2.2-0ubuntu9.1
HDD接続
いよいよHDDを接続します。
HDDケースはこれです。
HP N54L の電源を切り離し、収まっていた5台のHDDを取り出して、上のHDDケースに格納。モードはスタンダードモード、5台のHDDを個別認識させるモードです。内臓RAID機能は使いません。折角の機能なんですけどね。
添付のUSBケーブルでHDDケースとラズパイ5を接続します。ラズパイ5の方は電源を入れっ放しですが、USBケーブルを接続してからHDDケースの電源を接続、電源を入れます。
数秒置いてから状況を確認。まずはlsblk。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 38.7M 1 loop /snap/snapd/23546
loop1 7:1 0 44.3M 1 loop /snap/snapd/24509
sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 2G 0 part
└─sda2 8:2 0 463.8G 0 part
sdb 8:16 0 931.5G 0 disk
├─sdb1 8:17 0 931.5G 0 part
└─sdb9 8:25 0 8M 0 part
sdc 8:32 0 465.8G 0 disk
├─sdc1 8:33 0 2G 0 part
└─sdc2 8:34 0 463.8G 0 part
sdd 8:48 0 465.8G 0 disk
├─sdd1 8:49 0 2G 0 part
└─sdd2 8:50 0 463.8G 0 part
sde 8:64 0 465.8G 0 disk
├─sde1 8:65 0 2G 0 part
└─sde2 8:66 0 463.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 /
sda
からsde
まで5台、認識してくれたようです。ではzpool import
を。
$ sudo zpool import
[sudo] password for administrator:
pool: tank
id: 2891006712653798077
state: ONLINE
status: The pool was last accessed by another system.
action: The pool can be imported using its name or numeric identifier and
the '-f' flag.
see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-EY
config:
tank ONLINE
raidz2-0 ONLINE
sde ONLINE
sdd ONLINE
sdc ONLINE
sda ONLINE
ata-ST1000VN008-3CW10C_WWD1E4QZ ONLINE
何か1台だけ名前が変ですが、とにかく5台をZFSとして認識してくれました!
zpool import
に当たっては-f
オプションを指定します。zpool export
していなかったので。
またマウント先は/mnt/tank
にしたいので、そのように指定します。
そして、デバイスをWWN(World Wide Name)で管理したいので、その指定を入れます。
sudo zpool import -d /dev/disk/by-id/ -R /mnt -f tank
インポートには少々時間がかかりました(体感で数十秒?)
さてインポートできたかな?
zfs list
ls /mnt/tank
うむ、見覚えのあるディレクトリ名が出てきます。やった!
自動マウント
マシン起動時に自動マウントさせるには/etc/zfs/zpool.cache
にプール情報を保存する必要があるそうです。Copilot、ありがとう。
但し、実行に時間がかかりますな。体感で10分前後でしょうかね?ちゃんと計れば良かったんですが、うっかりしてました…
sudo zpool set cachefile=/etc/zfs/zpool.cache tank
sudo zpool export tank
sudo zpool import tank
コマンドが終了したら、マウント先が/tank
になっていました。-R
オプションを付けずにzpool import tank
したから当然ですか。仕方無いですな。
確認の為にマシンを再起動します。
sudo reboot
起動時にも時間が掛かります。が、自動マウントできました!
zpool list
ls /tank
(R7.2025.06.17. ここから)
もう一回やり直してみたら、うまくいかなくなりました。自動マウントされません。なぜでしょう。
異なる点と言えば下記2点ですかね…
- cachefile作成時にほんの10秒前後で作成されてしまいました
- マシン再起動も待たされずに起動してしまいます
手が空いた時に対応します。それまではマシン起動後に手動でマウントですな。
(R7.2025.06.17. ここまで)
(R7.2025.06.25. ここから)
答えはCopilotが知ってました。USBハードディスクの場合、認識が遅れてZFSの後になってしまう事があるそうです。
HDDデバイスの後にZFSが起動するように、systemdユニットで依存関係を追加すればよい、との事。
sudo systemctl edit zfs-import-cache
上記コマンドで、下記3行を追加します。
[Unit]
Requires=dev-sde.device
After=dev-sde.device
これでzfs-import-cache.service
を/dev/sde
の後に出来ます。
/dev/by-id/~
にしなかったのはデバイス交換の度に書き換える事になってしまうのが嫌だったからです。
/dev/sda
にしなかったのはHDDが5台あるからで、最後の/dev/sde
の認識が終われば5台全部認識済だろうという期待です。
(R7.2025.06.25. ここまで)
Samba
次にSambaを設定して、Windowsマシンからのアクセスを図ります。
インストール
何の変哲も無い、基本的なコマンドです。
sudo apt update -y && sudo apt upgrade -y
sudo apt install -y samba
Sambaサービスが起動した事を確認します。
systemctl status smbd
ユーザー追加
Sambaで使用するユーザーはOSの一般ユーザーです。
新しく追加するなら、例えばtaro
を追加するなら下記のようにします。
通常はホームディレクトリ内に用意したサブディレクトリをSambaでそのユーザーだけに公開すると思いますが、今回はファイルサーバーのZFSフォーマットしたディレクトリを公開します。その都合でtaro
にはホームディレクトリを作りません。Samba用ユーザーという事でログインも禁止してみます。
NEWUSER=taro
sudo useradd -M -s /usr/sbin/nologin $NEWUSER
そしてSamba用パスワードはsmbpasswd
コマンドを管理者権限で実行して設定します。
sudo smbpasswd -a $NEWUSER
共有フォルダを作成
共有対象となるフォルダを作成します。何でもいいのですが、先程作成したtaro
ユーザー用にZFSのフォルダを用意してみます。
cd /tank
sudo mkdir $NEWUSER
sudo chown $NEWUSER: $NEWUSER
sudo chmod 775 $NEWUSER
公開設定
実験は別記事に任せるとして、ここではtaro
の読み書き設定をします。設定ファイルを書き換えた後はSambaを再起動します。
cat <<___ | sudo tee -a /etc/samba/smb.conf >/dev/null
[$NEWUSER]
path = /tank/$NEWUSER
browsable = yes
guest ok = no
read only = no
___
sudo systemctl restart smbd
Windowsマシンからアクセスして読み書きを確認します。
最後に、これを真似て、既に作ってあった共有フォルダに対して共有設定をしました。
仕舞い
古いマシン(CPU:AMD)上で構築したZFSのNASを、ラズパイ5(CPU:ARM)に引き継ぎました。うまくいって良かったです。実はドキドキだったんですよ、バックアップも碌に取れない状況だったもので。
デバイスさえ無事ならこういう事が出来るのがZFSなんですよね。ZFSで良かった。ZFS最強です!