Raspberry Pi 4B を自宅 (Ubuntu) サーバにする
はじめに
ラズパイといえば「電子工作」「組み込み機器のテスト」的な印象があるが、電子回路の素養がないのでどうにもハードルが高い。せっかく買ったのでなにか有効に活用しようと仕事の合間にぼんやり考えていたのだが、とあるケースの存在を知り、テーマを考えた。 この記事では、そのための OS の準備までを記録しておく。
2021/4/25: Ubuntu 21.04 へのアップグレードとsudoのエラー対策について追記
Argon ONE M.2 Case for Raspberry Pi 4
- M.2 SATA 型の SSD を内蔵可能 (USB経由)
- 電源ボタン内蔵
- 放熱性のよいアルミ筐体+可変コントロールFAN
- 配線をすべて背面にまとめられる
本記事の概要
- ラズパイケースへの SSD の組み込み
- OS インストール前準備
- Ubuntu インストール
- ラズパイへの最適化
最終的な方針
- 24時間常時稼働
- Micro SD カードではなく SSD 運用とする
- IPv6 対応+IPv6 アプリケーションの動作確認・テスト用
- PowerDNS
- KEA DHCPv6
- mDNS
- リモート接続できるように OpenVPN サーバにする (IPv4/IPv6)
- 自宅用ファイルサーバ
- Web フレームワーク構築学習用 (Python Django/Flask)
懸念
- 耐熱。ラズパイ4B は何も稼働していない状態でもほんのり熱い。2021年4月の室内でCPU温度が45℃。ファンは回っていないので、これで長期耐えられるのであれば安心だが、はたして。
- 耐久性。常時稼働で壊れるのは大抵 microSD カード。読み書き回数の限界を超えるらしい。ログを RAM ディスクに逃がせば組み込み機器としては解決するが、再起動するとログが消えてしまうのは困る。SSDにしたので書き込み回数制限は大幅に改善したはずだが、サーバスペックのメディアではないので、3年くらいで壊れる覚悟も必要か。
機器仕様・構成
以前の デジタルサイネージ化 のトライをした際と本体は同じだが、OSを含めて多少サーバ寄りにした。
項目 | 構成 |
---|---|
本体 | Raspberry Pi 4 Type B (RAM 4GB) |
電源 | USB-C 端子 (5V/3A) |
ケース | Argon ONE M.2 Case |
ストレージ | Western Digital: WD BLUE M.2 500GB SSD (WDS500G2B0B) |
出力 | モニタ接続なし |
インターフェース | キーボード・マウス等は接続しない |
OS | Ubuntu Server 20.10 (64bit) |
ネットワーク | 内蔵Gigabit Ethernet |
ケースへの SSD の組み込み
SSDは、Argon ONE M.2 の底蓋側を外し、M.2 コネクタに差し込んでからネジを止める。 再度フタを締めたら、USB のブリッジコネクタを差し込む。
Ubuntu OS インストール
準備
ラズパイ標準構成以外のデバイスや OS を使おうと思ったら、とにかく標準 Raspberry Pi OS を起動して前準備をする、のがお作法らしい。
- MicroSD カードから Raspberry Pi OS を起動しておく
- 下記のコマンドで順に OS を更新し、再起動
sudo apt update
sudo apt upgrade
sudo reboot
- 再起動後、ファームウェアを更新する。
sudo apt install rpi-eeprom
SSD に Ubuntu イメージを入れる
Argon ONE M.2 の SSD 取り付け部分(裏蓋)は USB-SATA 変換回路なので、PC に直結できれば Windows から外付けドライブとして認識できるはずなのだが、SSD側が「USB Type-A のメス」コネクタであるため、
USB Type-A オス ~ USB Type-A オス
という特殊なケーブルが必要になる。が、USB コネクタの規格でホスト側 (Type-A) と デバイス側 (Type-B) が異なるため、そういう製品はほぼ存在しない。例外として PC~PC間を直結する特殊な USB 製品 (例: ELECOM UC-LC01BK ) があるが、これは途中に回路が入っている。
「PCからSSDにイメージ書き込めれば簡単」と思っていたので、まずこれができなかった。
そこで、Raspberry Pi OS から直接 SSD に書き込むことにする。
- デスクトップ版 Raspberry Pi OS (以下 RPOS) の MicroSD をラズパイ本体に挿す。
- Argon ONE M.2 に SSD をセットし、USB ブリッジコネクタで接続。(まだ裏蓋ネジは締めないで仮置き)
- 電源を入れ、MicroSD から Raspberry Pi OS を起動する。
- 公式の Raspberry Pi Imager をインストールする。
sudo apt install rpi-imager
- Raspberry Pi Imager を起動
- CHOOSE STORAGE で USB 経由の SSD デバイスを指定 (MicroSD を指定すると起動中の OS が壊れるので注意!)
- CHOOSE OS で Ubuntu Server 20.10 (64-bit) を指定
- WRITE をクリックして終わるまで待つ
デバイス起動順序の変更
ラズパイのデフォルトでは、ブートデバイスは microSD カードになっている。USB 経由の SSD からブートさせたいのだが、ラズパイには BIOS メニューが存在しないので、OS から変更する。
Raspberry Pi OS のターミナルを起動し raspi-config を実行
sudo raspi-config
raspi-config 20210212 版の場合、下記の順でメニューを選択。メニュー名やコメントはバージョンによって違うことがある。
- 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ブリッジコネクタを挿し、電源を入れる。
- SSD から Ubuntu が起動することを確認
Ubuntu 最適化と微調整
Ubuntu 20.10 (64bit版) は正式サポートされているだけあって、初回起動後のパーティション拡張も自動でやってくれる。 ここでは起動後の調整をする。
初回ログイン
デフォルトユーザー・パスワードは ubuntu / ubuntu である。うぶんつ初見なので初めて知りました。 まずはパスワード変更から。
キーボード設定
実際は SSH 経由なので必須ではないのだけど、メンテ用に日本語配列キーボードにしておく。
sudo dpkg-reconfigure keyboard-configuration
- Generic 105-key PC(intl.)
- Japanese
- Japanese - Japanese (OADG 109A)
ホスト名変更
mDNS でホスト名を探索するので、打ちやすくて分かりやすい名前を付けておく。
sudo hostnamectl set-hostname raspiyamk1
mDNS の導入
mDNS は DNS がないローカルの同一セグメント内で、マルチキャストによりホスト名から IP を解決するプロトコル。Apple 系OS , Windows 10 の比較的最近のバージョン, Google Chromecast 等でも使用されている。DHCP にしたままリモートログインできるので、とりあえずの作業には便利。 後で IP を固定するが、まずはこれを入れておく。
sudo apt install avahi-daemon avahi-utils
ラズパイ専用追加パッケージの導入
必要そうだったので入れたが、もしかしたら不要かも?
sudo apt install ubuntu-raspi-settings ubuntu-server-raspi
MicroSD カードポーリングの抑止
デフォルトの設定では、カーネルが MicroSD メディアが存在するかどうか定期的にアクセスするらしい。実際 CPU は高負荷になっているわけではないが、この影響でロードアベレージがずっと 1.0 近くを示してしまう。起動設定ファイル /etc/firmware/config.txt に追記することでこれを抑止できる。
sudo su -
cat <<'__EOT__' >> /boot/firmware/config.txt
dtparam=sd_poll_once
__EOT__
exit
時刻関連
Ubuntu のタイムゾーン設定
sudo dpkg-reconfigure tzdata
- Asia
- Tokyo
timesyncd のタームゾーン変更
timedatectl set-timezone Asia/Tokyo
timesyncd の NTP 同期先変更
vi で設定ファイルを書き換える
sudo vi /etc/systemd/timesyncd.conf
下記の項目を修正
[Time]
NTP=ntp.nict.jp
FallbackNTP=ntp.nict.jp
サービスを再起動して反映
systemctl restart systemd-timesyncd.service
設定確認
timedatectl status
下記が出ていれば OK
System clock synchronized: yes NTP service: active
raspi-config コマンドの導入
Raspberry Pi OS では、OS/ハードウェア設定変更でコンソールメニュー式の raspi-config コマンドをよく使う。Ubuntu 用にも提供されているので、これを導入する。
sudo su -
echo "deb http://archive.raspberrypi.org/debian/ buster main" >> /etc/apt/sources.list
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 7FA3303E
apt update
apt install raspi-config
exit
Argon ONE M.2 用スクリプト
電源ボタンや、内蔵ファンの温度制御用スクリプトを純正サイトから導入する。Ubuntu に正式対応しているので簡単。
sudo su -
curl https://download.argon40.com/argon1.sh | bash
exit
Ubuntu 20.10 のアップデートと再起動
仕上げに、Ubuntu のパッケージをすべて更新して再起動する。
sudo apt update
sudo apt upgrade
sudo reboot
リモートアクセスの確認
以上で初期設定が終わったので、リモートで接続可能か確認する。 Windows 10 での mDNS による名前解決は、PowerShell で確認できる。
Resolve-DnsName raspiyamk1
Name Type TTL Section IPAddress
---- ---- --- ------- ---------
raspiyamk1.local AAAA 120 Answer 240d:xx:xx:xx:xxxx:xxxx:xxxx:xxxx
raspiyamk1.local A 120 Answer 192.168.0.xx
我が家の環境は IPv6 対応しているため、それぞれのレコードの応答がある。なお DNSではないので nslookup では確認できない。また mDNS 専用のサフィックス .local を付けるとなぜか解決できないので注意。
名前解決ができるようになったので、同セグメントからは Windows の SSH クライアントでリモート作業できるようになった。あとは自宅の適当な冷暗所にラズパイに置き、電源と LAN ケーブルだけを挿しておけばよい。
まとめ
「Ubuntu 起動してるけど何もしてないサーバ」が完成したので、中身の構築や実験は別記事で書くかも。
追記 2021-04-25
Ubuntu 20.10 → 21.04
いろいろ使い始める前に、2021/4/22 に Ubuntu 21.04 が出てしまった。Raspberry Pi 版としても正式対応している。 LTS 版でない 20.10 は元々1年弱程度しかサポート期間がなく 、初めてラズパイに正式対応した 20.10 は 2021年7月までの寿命である。茨の道を進むしかない。インストール手引き書であれば、21.04 クリーンインストールでこの記事を書き直すべきだろうが、個人的メモの延長上なのでそこまではしない。アップグレード方法をメモしておく。
sudo apt update
sudo apt upgrade
sudo do-release-upgrade -d
sudo 実行時のエラー対策
**修正: **
下記は IPv6 関連を調査していて systemd-resolved を無効化してしまったためだった。Ubuntu では /etc/resolv.conf 主体ではなく systemd-resolved が名前解決の振り分けを行っているが、mDNS 関連はこちらを通るらしい。
systemd-resolved を有効化したら下記の対応は不要になった。
Ubuntu の IPv6 固定 IP サーバ対応はもろもろ試しているのでいつか書く‥‥。
参考: Ubuntu : systemd-resolved、及び Resolvconf 設定
(systemd-resolved を使わない場合のみ)
いつのころからか sudo 実行時にこんなエラーが出るようになった。
$ sudo xxxxx
sudo: unable to resolve host raspiyamk1: Name or service not known
調べると、どうも mDNS (avahi-daemon) をインストールすると、自分の名前を解決しようとして失敗するらしい。.local がついてないからか?
割と有名な問題らしく、自ホスト名を /etc/hosts に追加すると解決する。例:
127.0.1.1 raspiyamk1
ssh ログイン時のグリーティングメッセージを停止
ssh でログインするとサーバ自体の情報+参考URL+最新情報+Raspi の温度表示なども出るのだが、10秒以上かかるので何枚もターミナルを開くときにはうっとうしい。1~2秒でスパッと開きたい。 下記を実行してファイルを作っておくと、そのユーザーだけはこれを抑止できる。
touch ~/.hushlogin
rm ~/.hushlogin
参考
- Raspberry Pi 公式ドキュメントを日本語訳 (config.txt)
- Raspberry Pi 4BをSD無しでSSD(USB)から起動させる
- Ubuntu 20.04 LTSのホスト名を変更する方法まとめ【デスクトップ・サーバー】
- Ubuntu 20.04 (LTS)にraspi-configをインストール
- RaspberryPi(Raspbian)のCPUの温度をcatを使わないで取得してみた
- aptコマンドチートシート
- Ubuntu Server 21.04: What’s new?
- How to Upgrade to Ubuntu 21.04 from Ubuntu 20.10 (Groovy to Hirsute)
- SSH接続時にmotdでメッセージを表示・非表示
- Ubuntu – Sudo: unable to resolve host ubuntu-server
- その他多数の blog や RasPi / Ubuntu のフォーラム