Raspberry Pi 4B を自宅サーバにする(CentOS Stream 9)
はじめに
これは以前の記事 Raspberry Pi 4B を自宅サーバにする(CentOS Stream 8) の CentOS Stream 9 版焼き直しである。 2022年8月に Pgreco 氏による CentOS Stream 9 イメージが公開されたので、これをベースにリファインしている。
なお今さらですが、以前の OS の表記に間違いがあったことをお詫びします。
- × CentOS 8 Stream
- ○ CentOS Stream 8
CentOS Stream 8 インストールの際は、OSイメージ展開後にパーティションIDを変更する等の細かい作業が必要だったが、Raspberry Pi Imager とイメージ作成方法の進化なのか、大幅に追加作業が減ってシンプルになっている。本記事のように特殊なケースがなくても、外付け USB ストレージさえあれば簡単に実現できると思う。
目標と主な構成
主な目標
- 24時間常時稼働
- Micro SD カードではなく SSD 運用とする
- IPv6 対応+IPv6 アプリケーションの動作確認・テスト用
- 自宅リモート接続用の OpenVPN サーバ (IPv4/IPv6)
- 自宅用ファイルサーバ
- Web フレームワーク構築学習用
OS
CentOS Stream 9 を選択。
長年慣れた rpm 系ディストリビューションであり(以下略)。
ケース
Argon ONE M.2 Case for Raspberry Pi 4 を選択。
(ケースの紹介は 以前の記事 を参考ください)
機器仕様・構成
項目 | 構成 |
---|---|
本体 | Raspberry Pi 4 Type B (RAM 4GB) |
電源 | USB-C 端子 (5V/3A) |
ケース | Argon ONE M.2 Case |
ストレージ | Transcend: 120GB M.2 SSD (TS120GMTS420S) |
出力 | インストール時のみ HDMI モニタに接続し、セットアップ後は外す |
インターフェース | 作業時のみキーボード・マウスを接続し、セットアップ後は外す |
OS | CentOS Stream 9 (64bit) |
ネットワーク | 内蔵Gigabit Ethernet |
ケースへの SSD の組み込み
(ラズパイ自身の組み込みは省略)
ケースの底蓋側が SSD ユニットになっているのでこれを外し、M.2 コネクタに SSD を差し込んでから、SSD自体をネジ1本で固定する。 再度底蓋を閉めたら、USB のブリッジコネクタを差し込む。完了まで何度か底蓋を外すことになるので、底蓋側のネジは最後まで締めずにおく。
OS インストール
インストール作業用OSの準備
ラズパイ標準構成以外のデバイスや OS を使おうと思ったら、とにかく標準 Raspberry Pi OS を起動して前準備をする。こちらはセットアップ済みの MicroSD カードの用意が前提。
- MicroSD カードから Raspberry Pi OS (デスクトップ版) を起動し、ログインする
- ターミナル内で、Raspberry Pi OS 自身を更新し、再起動する
sudo apt update
sudo apt upgrade
sudo reboot
- 再度 Raspberry Pi デスクトップにログインして下記を進める。
イメージファイルダウンロード
CentOS コミュニティの Pablo Greco さん がラズパイ用の CentOS イメージファイルを公開しているので、Raspberry Pi OS デスクトップ上でダウンロードしておく。
CentOS-Userland-9-stream-aarch64-RaspberryPI-Minimal-4-sda.raw.xz
本記事は 2022-08-30 リリース版のイメージを元に記載
SSD に CentOS イメージを入れる
Raspberry Pi OS デスクトップ版にログインし、ここから SSD に書き込む。
- Raspberry Pi OS の MicroSD をラズパイ本体に挿す。
- Argon ONE M.2 に SSD をセットし、USB ブリッジコネクタで接続。(まだ裏蓋ネジは締めないで仮置き)
- 電源を入れ、MicroSD から Raspberry Pi OS を起動し、デスクトップ (X Window) にログインする。
- 公式の Raspberry Pi Imager をインストールする。
sudo apt install rpi-imager
- Raspberry Pi Imager を起動
※最新バージョンではメニューが日本語化されています。
- CHOOSE STORAGE (ストレージを選ぶ) で USB 経由の SSD デバイス (例: “Argon XXXX”) を指定 (MicroSD を指定すると起動中の OS が壊れるので注意!)
- CHOOSE OS (OSを選ぶ) で Use custom (カスタムイメージを使う) を指定
- 先ほどダウンロードしておいた xxx.raw.xz ファイルを指定する。自動展開されるため事前に xz 圧縮を展開しておく必要はない。
- WRITE (書き込む) をクリックして終わるまで待つ
デバイス起動順序の変更
Raspi のデフォルトブートデバイスは microSD カードになっているので、USB に変更する。ラズパイには BIOS メニューが存在しないので、RasPi OS から変更する。
Raspberry Pi OS のターミナルを起動し raspi-config を実行:
sudo raspi-config
raspi-config 20220506 版の場合、下記の順でメニューを選択。メニュー名やコメントはバージョンによって違うことがある。
- Advanced Options Configure advanced settings
- Boot Order Choose network or USB device boot
- USB Boot Boot from USB if available, otherwise boot from SD Card
USB から起動
- 作業に使った Raspberry Pi OS をシャットダウンする。
- USBブリッジコネクタを含め全てコネクタを外し、(ネジの締めていない) 裏蓋を空ける
- MicroSD カードを抜く
- 再度裏蓋を閉め、USBブリッジコネクタを挿す。
- キーボード、モニタ、自宅ネットワークのLANケーブルを挿し、電源を入れる。
- SSD から CentOS が起動することを確認
CentOS 起動後の調整
コンソールから初回ログインする。 ユーザー: root、パスワードは centos。
パーティションを拡張し再起動する。
rootfs-expand
reboot
起動後、DHCP でネットワークアクセスができるはずなので、下記の順で作業する。
#OS アップデート
dnf -y update
#物理キーボードを日本語に変更
localectl set-keymap jp
#システムロケール変更
#言語パック追加
dnf install glibc-langpack-ja glibc-langpack-en
#JP だと HDMI コンソールが文字化けするので en_US にしておく
localectl set-locale LANG=en_US.utf8
#タイムゾーン変更
timedatectl set-timezone Asia/Tokyo
#ホスト名変更 (お好みで)
hostnamectl set-hostname raspiserver
#root パスワード変更 (2回入力)
passwd
ラズパイ起動オプションの編集
kernel 設定ファイルに追記する。
vi /boot/config.txt
- SD カードスロット検索の無効化
- BlueTooth無効化 (省電力)
- Wi-Fi 無効化 (省電力)
- 起動時 Splash 画面OFF
- その他 Argon One M.2 Case 用の設定
dtparam=sd_poll_once dtoverlay=disable-bt dtoverlay=disable-wifi disable_splash=1 dtparam=i2c_arm=on enable_uart=1
再起動
reboot
Wi-Fi の設定を完全 OFF
利用しないインターフェースを認識させないようにする。
nmcli radio wifi off
SELinux 無効化
vi /etc/selinux/config
SELINUX=disabled
firewall 無効化
systemctl stop firewalld
systemctl disable firewalld
reboot
固定IP設定
Network Manager の設定は nmcli にて行う
コネクション名の変更
コネクション名をコマンドラインで入力しやすい英語名に修正する。
#Connection名の確認
nmcli c
NAME UUID TYPE DEVICE
Wired connection 1 a3f45bb3-2970-3e05-bd40-1b8a56a0fd80 ethernet eth0
#connection名変更
nmcli connection modify "Wired connection 1" connection.id "wired1"
△ “Wired connection 1”
○ “wired1”
IPv4 アドレスの固定
確認方法
nmcli con show wired1 | grep ipv4
nmcli con modify wired1 ipv4.addresses 192.168.0.16/24
nmcli con modify wired1 ipv4.gateway 192.168.0.1
nmcli con modify wired1 ipv4.dns 192.168.0.1
nmcli con modify wired1 ipv4.method manual
nmcli con reload
nmcli con down wired1 & nmcli con up wired1
IPv6 アドレスの半固定
確認方法
nmcli con show wired1 | grep ipv6
nmcli con modify wired1 ipv6.method auto
nmcli con modify wired1 ipv6.ip6-privacy 0
nmcli con modify wired1 ipv6.addr-gen-mode eui64
nmcli con modify wired1 ipv6.token ::16
nmcli con reload
nmcli con down wired1 & nmcli con up wired1
作業用ユーザーの作成
useradd cuser -c "CentOS User"
passwd cuser
# sudo 可能ユーザーに設定
usermod -aG wheel cuser
お片付け
ここまでの設定で、他の端末から SSH ログインできるようになっているはずなので、忘れずに裏蓋をネジ止めしておく。
あとは冷暗所に置いて LAN ケーブルと電源アダプタだけを接続し、いつでも ssh リモートログインできる状態なことを確認する。
各種ツール追加
CodeReady Linux Builder (CRB) レポジトリ追加
dnf config-manager --set-enabled crb
EPELレポジトリ有効化
sudo dnf install -y epel-release
sudo dnf install -y vim-enhanced telnet nc wireshark-cli tcpdump zip unzip bzip2 zstd p7zip htop
mDNS (Multicast DNS) 有効化 (root)
dnf install -y avahi nss-mdns
systemctl enable avahi-daemon
systemctl start avahi-daemon
名前解決順序を修正: /etc/nsswitch.conf
変更前
hosts: files dns myhostname
変更後
hosts: files mdns_minimal [NOTFOUND=return] dns mdns myhostname
同じネットワーク内の Windows 10/11 の PowerShell から、“ホスト名.local” で名前解決ができるか確認する。例)
Resolve-DnsName raspiserver.local
※nslookup コマンドでは mDNS は解決しない
Raspi の状態表示コマンドの導入
vcgencmd が CentOS にはないので、ソースからビルドする
開発環境のインストール (root)
sudo dnf install cmake gcc gcc-c++ make git
ソース展開とコンパイル
mkdir ~/work
cd ~/work/
git clone https://github.com/raspberrypi/userland.git
cd userland
./buildme --aarch64
以上でインストールまで完了するので、下記フォルダを確認。
ls /opt/vc/bin
実行できるようにもろもろやる。
cat <<'__EOT__' > /etc/ld.so.conf.d/raspberrypi.conf
/opt/vc/lib
__EOT__
ldconfig
cat <<'__EOT__' >> ~/.bashrc
PATH="/opt/vc/bin:$PATH"
export PATH
__EOT__
root で再ログインし直すと、vcgencmd が使えるようになる。 例)
#温度
vcgencmd measure_temp
#CPU周波数を表示
vcgencmd measure_clock arm
#電圧を表示
vcgencmd measure_clock arm
#CPU(arm),GPUのメモリ使用量
vcgencmd get_mem arm