uchan note

プログラミングや電子工作の話題を書きます

Raspberry Pi 4 のセットアップをしてみた

この記事は 自作OS Advent Calendar 2020 の 8 日目の記事です。

概要

Raspberry Pi 4 を買ってセットアップしたので,その過程を記録しました。 これから買う方の参考になれば幸いです。

この記事では OS のインストールと SSH で公開鍵認証を用いて接続する設定,静的 IP アドレスを付与する設定,GUI を無効化する方法を説明します。 この記事に登場する作業はすべて Ubuntu 18.04 上で行いました。

買ったもの:

KIOXIA の SD カードはツクモネットショップでは取り扱いが無い模様。 秋葉原ツクモ本店で他の製品より安めだったので買いましたが,後で調べたらツクモネットショップに同等性能でより安い SanDisk 製のものがありました。がーん…

SD カードの初期化

Setting up your Raspberry Pi - Introduction | Raspberry Pi Projects を参考にセットアップを進めます。

SD カードへの OS のインストールは,従来は NOOBS というツールを使って,Raspberry Pi を起動してから OS を選択してインストールしていたようでした。 今は Raspberry Pi Imager というツールを使う方法が標準だそうです。 「圧倒的に速い」──ラズパイにOSをインストールする新ツール「Raspberry Pi Imager」 (1/2) - ITmedia NEWS

買ったのは 128GB の SD カードですので,規格は SDXC となります。SDXC カードは仕様上,必ず exFAT でフォーマットすることになっています。

Formatting an SDXC card for use with NOOBS - Raspberry Pi Documentation には NOOBS を使うための SDXC カードのフォーマットは exFAT ではなく FAT を選ばねばならない,と書いてあります。 これが Raspberry Pi Imager にも当てはまるかどうか分かりませんが,念の為パーティションの作り直しをしておきます。

SD カードの仕様に準拠したフォーマッタでは,SDXC カードは exFAT でしかフォーマット出来ないかもしれません。 Ubuntu のディスクユーティリティはそんなのお構いなく,指定した形式でフォーマット可能ですので,こういうときに便利ですね。

f:id:uchan_nos:20201208212034p:plain
SDXC カードを FAT でフォーマットし直す

SDXC カード全体を 1 つのパーティションとし,FAT でフォーマットすれば良いです。

Raspberry Pi OS のインストール

SD カードのフォーマットが終わったら,次は OS のインストールです。 Raspberry Pi 4 で動く OS はいくつもあるようですが,最も標準的であろう Raspberry Pi OS をインストールすることにします。

どの OS にしろ,Raspberry Pi Imager を使って SD カードに OS イメージを書き込むのが標準だそうです。

Ubuntu では sudo snap insatll rpi-imager として Raspberry Pi Imager をインストールします。 "Setting up your Raspberry Pi" では apt を使っていますが,私の環境では apt ではなく snap にありました。 (snap はコンテナ技術を使ってソフトウェアをまるまるパッケージする仕組みです。)

Raspberry Pi Imager を起動して OS と SD カードを選択して "WRITE" をクリックすると SD カードへの書き込みが始まります。

f:id:uchan_nos:20201205171628p:plain
Raspberry Pi ImagerでSDカードに書き込む様子

OS は「Raspberry Pi OS 32-bit」を選択しました。 メモリ 8GB 搭載モデルの場合は 64 ビット版を使うんじゃないのか?と思うかもしれませんが,32 ビット版でも大丈夫です。 32 ビット版では 1 プロセスは最大 3GB 程度のメモリしか使えませんが,OS 全体では 8GB のメモリ全部をちゃんと使えますので心配要りません。 (Raspberry Pi の用途で 3GB 以上のメモリが必要なアプリはそうそう無いでしょうし)

書き込みが異様に遅いのは SD の故障か!?

Raspberry Pi Imager での書き込みがとてもゆっくりなので原因を調べたところ,OS のイメージをダウンロードしながら書き込んでいるため,ダウンロード速度に律速されているようです。 SD カードが不良品というわけではなさそうです。

iftop コマンドの出力を見ると archive.raspberrypi.org からの受信が 2Mbps 程度しか出ていないことが分かります。遅いのも納得。

$ sudo iftop -i wlp0s20f3 -t
<中略>
   # Host name (port/service if enabled)            last 2s   last 10s   last 40s cumulative
--------------------------------------------------------------------------------------------
   1 uchan-lifebook                           =>     6.19Kb     4.66Kb     4.66Kb     2.33KB
     2a00:1098:88:26::1:1                     <=     2.05Mb     1.37Mb     1.37Mb      704KB

SSH サーバの有効化

デフォルトで SSH サーバは無効化されていますので,SSH 接続のためには有効化する必要があります。 でもその前に,パスワードをデフォルトパスワード "raspberry" から変更しておきます。 そうしておかないと,非常に脆弱なパスワードのまま SSH サーバが有効化されてしまい,悪い人やマルウェアに侵入されてしまう可能性があります。 (初回起動時のセットアップ画面でパスワードを設定したような気もするのですが,何故か変更されていませんでした。手動での変更が必要なようです。)

パスワードを変更するためには,pi ユーザでログイン後,ターミナルを開いて passwd コマンドを打つだけです。 「<自分で決めたパスワード>」に新しい(十分に複雑な)パスワードを入力します。

$ passwd
pi 用にパスワードを変更中
Current password: raspberry
新しいパスワード: <自分で決めたパスワード>
新しいパスワードを再入力してください: <自分で決めたパスワード>

パスワードを変更したら SSH サーバを有効化する準備が整いました。

/boot/ssh というファイルを作る方法もあるらしいですが,今回は raspi-config でやってみました。 sudo raspi-config として起動した画面で "3 Interface Options" > "P2 SSH" とたどり,有効化します。

公開鍵認証の設定

SSH のログインはパスワードより公開鍵認証を使うほうが安全です。さくっと公開鍵認証を設定してしまいましょう。 公開鍵認証を設定する概略は次の通りです。ここでは,Rasberry Pi に接続しようとしているホストを「ローカルホスト」と呼ぶことにします。

  1. ローカルホストで鍵ペアを生成
  2. Raspberry Pi にパスワード認証で SSH し,公開鍵を登録
  3. (オプション)SSH サーバの設定でパスワード認証を無効化

ここで紹介している手順は,SSH の相手が近くにある Raspberry Pi だけではなく,インターネットの向こうにある離れたサーバに対しても安全な手順です。 悪者がいない閉じたネットワークを仮定するともっと違う手順もあり得るでしょう。 例えば,巷では Raspberry Pi 側で鍵ペアを生成し,秘密鍵を USB メモリなどでローカルホストへ持ってくる方法が紹介されていますが, あれは Raspberry Pi が近くにあるからこその手順であり,一般に使える手順ではありません。

ローカルホストで鍵ペアを生成

既に常用の鍵ペアを持っている場合は 1 の手順を飛ばして構いません。

無いなら作ります。鍵ペアは ssh-keygen というコマンドで作れます。 今なら ED25519 という鍵生成アルゴリズムが最も強固だそうなので,それを使ってみました。

$ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/uchan/.ssh/id_ed25519): ←空のままで OK
Enter passphrase (empty for no passphrase):  ←空のままで OK
Enter same passphrase again:  ←空のままで OK
Your identification has been saved in /home/uchan/.ssh/id_ed25519.
Your public key has been saved in /home/uchan/.ssh/id_ed25519.pub.
The key fingerprint is:
<中略>

基本的にすべての質問項目を空のまま Enter で進めば作れます。

"passphrase" は生成した秘密鍵を使うときに入力を求められるものです。 これを空のままにすると,秘密鍵が漏洩したときに秘密鍵が簡単に使用されてしまいますから,心配であればきちんと設定しておくと良いでしょう。

Raspberry Pi に公開鍵を登録

生成した公開鍵を Raspberry Pi 側に登録します。まずは公開鍵を表示します。

$ cat .ssh/id_ed25519.pub
公開鍵の文字列…

次にパスワード認証で Raspberry PiSSH 接続を行います。

$ ssh pi@<IPアドレス>

$HOME/.ssh/authorized_keys に公開鍵の内容を登録します。

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ echo 公開鍵の文字列… >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

一旦ログアウトし,再度 SSH 接続することで公開鍵認証になっていることを確認します。

パスワード認証を無効化

パスワード認証を無効にしておくことで,公開鍵認証を強制できます。 自分しか SSH 接続する人がいないならほとんど意味がありませんが,複数のユーザが接続するケースでは全員に公開鍵認証を強制する効果があります。

パスワード認証を無効化するには /etc/ssh/sshd_config というファイルの PasswordAuthenticationyes から no に変更します。 設定ファイルを書き換えたら SSH サーバを再起動すれば設定が反映されます。

$ sudo systemctl restart ssh.service

静的 IP アドレスの付与

今の Raspberry Pi OS では DHCPCD (DHCP client daemon) を使って IP アドレスの付与などをしているようです。 (/etc/network/interfaces を直接編集する時代は終わっているみたいですね…)

個人的に固定 IP アドレスを付与したかったので /etc/dhcpcd.conf を次のように設定しました。

interface eth0
static domain_name_servers=192.168.0.1
static ip_address=192.168.0.120
static routers=192.168.0.1
static domain_search=

192.168.0.1 は自宅のルータの LAN 側 IP アドレスです。 192.168.0.120 が Raspberry Pi に付与する IP アドレスです。

routers は何かと思ったらデフォルトゲートウェイの設定だそうです。 14.4. マルチホーム DHCP サーバーの設定 Red Hat Enterprise Linux 7 | Red Hat Customer Portal

設定変更は eth0 の再起動で。

$ sudo ifconfig eth0 down
$ sudo ifconfig eth0 up

ip a コマンドを叩き,先ほど設定した IP アドレスが出てくれば OK。少し待たないと出てこないかもしれません。

GUI 無効化

SSH 接続専用で使うつもりなので,GUI は無い方が良いです。 GUI を無効化すれば起動が速くなりますしメモリも節約できますからね。 sudo raspi-config で無効化できました。

"1 System Options" > "S5 Boot / Auto Login" で "B1 Console" または "B2 Console Autologin" を選べば GUI が無効になります。 下手に自動ログインされると気持ち悪いので B1 を選びました。