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 カードの用意が前提。

  1. MicroSD カードから Raspberry Pi OS (デスクトップ版) を起動し、ログインする
  2. ターミナル内で、Raspberry Pi OS 自身を更新し、再起動する
sudo apt update
sudo apt upgrade
sudo reboot
  1. 再度 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 に書き込む。

  1. Raspberry Pi OS の MicroSD をラズパイ本体に挿す。
  2. Argon ONE M.2 に SSD をセットし、USB ブリッジコネクタで接続。(まだ裏蓋ネジは締めないで仮置き)
  3. 電源を入れ、MicroSD から Raspberry Pi OS を起動し、デスクトップ (X Window) にログインする。
  4. 公式の Raspberry Pi Imager をインストールする。
sudo apt install rpi-imager
  1. Raspberry Pi Imager を起動 ※最新バージョンではメニューが日本語化されています。
    1. CHOOSE STORAGE (ストレージを選ぶ) で USB 経由の SSD デバイス (例: “Argon XXXX”) を指定 (MicroSD を指定すると起動中の OS が壊れるので注意!)
    2. CHOOSE OS (OSを選ぶ)Use custom (カスタムイメージを使う) を指定
    3. 先ほどダウンロードしておいた xxx.raw.xz ファイルを指定する。自動展開されるため事前に xz 圧縮を展開しておく必要はない。
    4. WRITE (書き込む) をクリックして終わるまで待つ

デバイス起動順序の変更

Raspi のデフォルトブートデバイスは microSD カードになっているので、USB に変更する。ラズパイには BIOS メニューが存在しないので、RasPi OS から変更する。

Raspberry Pi OS のターミナルを起動し raspi-config を実行:

sudo raspi-config

raspi-config 20220506 版の場合、下記の順でメニューを選択。メニュー名やコメントはバージョンによって違うことがある。

  1. Advanced Options Configure advanced settings
  2. Boot Order Choose network or USB device boot
  3. USB Boot Boot from USB if available, otherwise boot from SD Card

USB から起動

  1. 作業に使った Raspberry Pi OS をシャットダウンする。
  2. USBブリッジコネクタを含め全てコネクタを外し、(ネジの締めていない) 裏蓋を空ける
  3. MicroSD カードを抜く
  4. 再度裏蓋を閉め、USBブリッジコネクタを挿す。
  5. キーボード、モニタ、自宅ネットワークのLANケーブルを挿し、電源を入れる。
  6. 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
設定例: PREFIX 上位 64bit は SLAAC による自動配布、下位 64bit は固定アドレス (::16) とする。Default Gateway, DNS は自動設定。SLAAC は 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

参考