Raspberry PiにUbuntu Serverをインストールして快適に使えるようになったので、自分向けのメモを兼ねて設定の流れを書いておきます。組み上げたのは以下のようなシステムです。
- Raspberry Pi Zero 2 Wで
- Ubuntu Server 22.04 LTSを
- USB SSDからブートして
- Wi-Fiに接続し
- ホスト・コンピュータからネットワーク越しに
- VS Codeで接続する
SSDから起動しますのでプログラムの実行が速いです。またVS Codeをフロント・エンドとしてSSH接続しているので、非常に快適にRasPiを扱えます。以下の説明では、次のような構成を仮定しています。
- Raspberry Pi Zero 2 W
- RasPi Zero 2 Wと接続できるUSB HUB
- USB SSD
- ホスト・コンピュータ側はSSHキーの設定が済んでいるものとする
- ホスト・コンピュータのVS CodeにはRemote Development 拡張機能をインストール済みであるとする
- ホスト・コンピュータにはRaspberry Pi Imagerがインストール済みであるとする
ホスト・コンピュータはWindows 11を使いました。確認はしていませんがUbuntuでもMacOSでもほとんど変わらないでしょう。また、USB HUBは先日改造したWaveshareのETH/USB HUB HAT(B)を使っています。
作業は以下のような手順となります
- RasPi Zero 2をUSBホストブート可能にする
- USB SSDにUbuntu Serverをインストールする
- USB SSDから起動する
- mDNSを有効にする
- VS CodeからSSH接続する
- スワップ・ファイルを作る
- Ubuntuのアップデート
RasPi Zero 2をUSBホストブート可能にする
工場出荷状態のRaspberry Pi Zero 2 WはUSBホストブートできません。そこで設定を変更してUSBホストブートを利用できるようにします。
なお、USBホストブートの設定はOTP(One Time Programmable ROM)に書き込まれるため、一度設定してしまうと元に戻すことはできません。詳細は公式ドキュメントを参照してください。
ホストブート可能にするための設定は、Raspberry Pi OSから行いますので、同OSのイメージをmicro SDカードに焼いてからRasPi Zero 2を起動します。この時点でネットワーク接続できるはずですのでSSH接続しても構いませんが、のちの作業で必要ですのでHUB経由でUSBキーボードを接続し、HDMI出力をモニタに出力しておきます。
起動したらコマンドライン・ウィンドウを開き以下のコマンドを実行します。
echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
このコマンドは/boot/config.txtに “program_usb_boot_mode=1″を書き込みます。catコマンドで書き込みが成功していることを確認したら、OSを再起動します。RasPiのブートローダーは再起動時にprogram_usb_boot_mode設定を読み込み、OTPにその設定を反映します。くどいようですがOTPですので再修正は利きません。
再起動したらvcgencmdコマンドでOTPの内容を確認します。
$ vcgencmd otp_dump | grep 17: 17:3020008a
なお、公式ドキュメントでは実行結果を17:3020000aとしています。しかしながら検索してみると他のRasPi Zero 2ユーザーも17:3020008aと書いています。公式ドキュメントが追い付いていないのかもしれません。
OTPが正しく修正されていることを確認したらOSをシャットダウンします。SDカードは不要ですのでもう抜いておきます。このカードに書いたOSで他のRasPiを起動するとOTPを勝手に変えてしまうため、内容は全部消した方がいいでしょう。
USB SSDにUbuntu Serverをインストールする
次にホスト・コンピュータ上でRaspberry Pi Imagerを使ってUbuntu ServerをUSB SSDにインストールします。SSDは秋葉原で購入した訳アリ品です。
OSはUbuntu Server 22.04.1 LTS 64bit版を選びました。OSとインストール先のドライブを選ぶと設定アイコンが現れます。設定アイコンをクリックすると詳細な設定ウィンドウが現れますので内容を設定していきます。
入力が必要なフィールドは
- ホスト名
- ユーザー名
- パスワード
- Wi-FiのSSDI
- Wi-Fiのパスワード
- SSHを有効化
- タイム・ゾーンとロケール
です。
ホスト名は、後でSSH接続するときのアドレスになるため、覚えやすいものを指定してください。ホスト名の後に.localを付けたものがネット上のアドレスになります。
SSHのauthrized_keyはRaspberry Pi Imagerが自動的に設定します。もし設定されない場合は、ホスト・コンピュータ上でSSHキーが正しく設定されていない可能性があります。確認してください。
設定が終わったら保存し、Ubuntu ServerのイメージをUSB SSDに書き込みます。
USB SSDから起動する
USB SSDへのUbuntu Server書き込みが終わったら、RasPiに繋いで起動します。この時点ではRasPiからHDMIモニタとキーボードを抜かないでおいてください。
起動には1,2分かかります。OSの起動自体はそれほど遅いとも思わないのですが、RasPiに電源を入れてからSSDでの起動が始まるまでずいぶんと待たされます。
ログイン・プロンプトが表示されたら、Raspberry Pi Imagerに設定したユーザー名とパスワードでログインしてください。ログインに成功したらホスト名がImagerに設定したものと同じかどうか確認しておきます。
最後にipコマンドを実行してWi-Fiが接続できているか確認します。
$ ip address | grep wlan0 2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 inet 192.168.0.28/24 metric 600 brd 192.168.0.255 scope global dynamic wlan0
接続できているならstateが”UP”で、inetアドレスが表示されているはずです。そうなっていない場合はImagerに設定したWi-Fiの情報が間違っている可能性があります。
mDNSを有効にする
晴れてRasPi Zero 2がネットにつながりましたが、この時点ではまたRasPiをホスト・コンピュータから名前でアクセスできません。
RasPiをFOO.localのようにネットワークのホストネームでアクセスするために、mDNS機能を有効にします。mDNSはUbuntu Serverにavahi-daemonをインストールすると自動的に有効になります。
sudo apt install avahi-daemon
インストールが完了したらホスト・コンピュータからping FOO.localを実行してください(fooは自分で設定したホスト名)。
pingか通ればmDNSは有効になっており、以降RasPiをFOO.localとしてアクセスできます。
VS CodeからSSH接続する
ホスト・コンピュータのVS CodeにRemote Development拡張機能をインストールすると、ホスト・コンピュータのVS CodeからSSH接続によってRasPiを操作できます。これはターミナル・エミュレータから使う場合よりも桁外れに便利で、私はいつもリモート接続のクライアントにはVS Codeを使っています。
VS CodeによるSSH接続を利用するには接続先であるRasPiのUbuntu ServerにSSHの公開鍵を登録する必要があります。これはRasbperry Pi Imagerが行っていますのでユーザーが何かする必要はありません。また、VS CodeによるSSH接続に必要なUbuntu Server側の設定は初回接続時にVS Codeが自動的に行います。
VS Codeの設定はRasPiの設定というこの稿の趣旨から大きく外れるため、ここでは説明しません。ネット上の解説を参考にしてください。
VS Codeからアクセス可能になったら、HDMIケーブルとUSB キーボードをRasPiから抜いても構いません。
スワップ・ファイルを作る
VS Codeから接続できるようになったら、Ubuntu Serverにスワップ・ファイルを作っておきます。
RasPi Zero 2 Wには512MBしかメモリがありません。Ubuntu Serverを起動するだけならばなんとかなるものの、この後apt upgradeを実行するとメモリー・オーバーフローが発生してしまいます。そこで、スワップ・ファイルを作っておきます。
サイズは決め打ちで1GBとしました。256GBのSSDを使用していますので無視できるファイル・サイズです。一方、これで足りないならRasPi Zero 2 WではなくRasPi 4などを選ぶべきでしょう。
スワップ・ファイルは以下のコマンドを実行して作ります。
sudo fallocate -l 1G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
スワップ・ファイルを作ったら、freeコマンドを実行してスワップ領域がシステムに登録されているかどうか確認します。この例では1GBのスワップ領域が存在することがわかります。
$ free total used free shared buff/cache available Mem: 424872 283124 12868 3032 128880 121512 Swap: 1048572 0 1048572
次に今後も継続してスワップ領域を使うことができるよう、/etc/fstabに設定を書き込んでおきます。
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
再起動してfreeコマンドを実行し、スワップ領域が存在していれば作業は完了です。
Ubuntuのアップデート
最後にUbuntuのアップデートを行います。
sudo apt update && sudo apt upgrade -y
まとめ
馴染みのないハードウェアということで悪戦苦闘はしましたが、何とか落ち着いて使える環境を構築することができました。
消費電力が少ないため、箱に入れて自宅用のサーバーをたてるなどして遊んでいこうと考えています。