ラズパイといえば「電子工作」「組み込み機器のテスト」的な印象があるが、電子回路の素養がないのでどうにもハードルが高い。せっかく買ったのでなにか有効に活用しようと仕事の合間にぼんやり考えていたのだが、とあるケースの存在を知り、テーマを考えた。 この記事では、そのための OS の準備までを記録しておく。
2021/4/25: Ubuntu 21.04 へのアップグレードとsudoのエラー対策について追記
Argon One M.2 正面
Argon One M.2 背面
Argon One M.2 背面コネクタ
以前の デジタルサイネージ化 のトライをした際と本体は同じだが、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は、Argon ONE M.2 の底蓋側を外し、M.2 コネクタに差し込んでからネジを止める。
ラズパイ標準構成以外のデバイスや OS を使おうと思ったら、とにかく標準 Raspberry Pi OS を起動して前準備をする、のがお作法らしい。
sudo apt update
sudo apt upgrade
sudo reboot
sudo apt install rpi-eeprom
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 に書き込むことにする。
sudo apt install rpi-imager
ラズパイのデフォルトでは、ブートデバイスは microSD カードになっている。USB 経由の SSD からブートさせたいのだが、ラズパイには BIOS メニューが存在しないので、OS から変更する。
Raspberry Pi OS のターミナルを起動し raspi-config を実行
sudo raspi-config
raspi-config 20210212 版の場合、下記の順でメニューを選択。メニュー名やコメントはバージョンによって違うことがある。
Ubuntu 20.10 (64bit版) は正式サポートされているだけあって、初回起動後のパーティション拡張も自動でやってくれる。 ここでは起動後の調整をする。
デフォルトユーザー・パスワードは ubuntu / ubuntu である。うぶんつ初見なので初めて知りました。 まずはパスワード変更から。
実際は SSH 経由なので必須ではないのだけど、メンテ用に日本語配列キーボードにしておく。
sudo dpkg-reconfigure keyboard-configuration
mDNS でホスト名を探索するので、打ちやすくて分かりやすい名前を付けておく。
sudo hostnamectl set-hostname raspiyamk1
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 メディアが存在するかどうか定期的にアクセスするらしい。実際 CPU は高負荷になっているわけではないが、この影響でロードアベレージがずっと 1.0 近くを示してしまう。起動設定ファイル /etc/firmware/config.txt に追記することでこれを抑止できる。
sudo su -
cat <<'__EOT__' >> /boot/firmware/config.txt
dtparam=sd_poll_once
__EOT__
exit
sudo dpkg-reconfigure tzdata
timedatectl set-timezone Asia/Tokyo
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
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
電源ボタンや、内蔵ファンの温度制御用スクリプトを純正サイトから導入する。Ubuntu に正式対応しているので簡単。
sudo su -
curl https://download.argon40.com/argon1.sh | bash
exit
仕上げに、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/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
下記は IPv6 関連を調査していて systemd-resolved を無効化してしまったためだった。Ubuntu では /etc/resolv.conf 主体ではなく systemd-resolved が名前解決の振り分けを行っているが、mDNS 関連はこちらを通るらしい。
systemd-resolved を有効化したら下記の対応は不要になった。
Ubuntu の IPv6 固定 IP サーバ対応はもろもろ試しているのでいつか書く‥‥。
参考: Ubuntu : systemd-resolved、及び Resolvconf 設定
いつのころからか 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 でログインするとサーバ自体の情報+参考URL+最新情報+Raspi の温度表示なども出るのだが、10秒以上かかるので何枚もターミナルを開くときにはうっとうしい。1~2秒でスパッと開きたい。 下記を実行してファイルを作っておくと、そのユーザーだけはこれを抑止できる。
touch ~/.hushlogin
rm ~/.hushlogin