dullwhaleのメモ帳

何度も同じことを調べなくてよいように...

Raspberry Pi 3 Model BにRaspberry Pi OS 64bitをインストール

以前から状況が変わって、64bitイメージがベータから正式リリースになったり、ユーザがデフォルトで作成されなくなったりした。

arm64のRaspberrypi OSを入手する

Raspberry Pi OSの公式ページからダウンロードする。 Raspberry Pi OS (64-bit)のRaspberry Pi OS LiteにあるDownloadボタンを押す。

OSのインストール

イメージを焼く。 公式のツールRaspberry Pi Imagerではなく、balenaEtcherを使った。

初回起動までの手順

OSイメージの書き込みに成功したら、USBをPCを一旦抜いて再度挿し、/bootfsパーティションsshという空のファイルを作る。 sshファイルを作ることで初回起動時にsshデーモンが立ち上がりディスプレイなしでセットアップができる。

不要な機能の無効化

消費電力削減とセキュリティ向上のため、不要な機能をOFFにする。 /boot/config.txtに以下の設定を追加する。

# 有線接続しかしないから、WifiをOFFにする。
dtoverlay=disable-wifi
# 有線接続しかしないから、bluetoothもOFFにする。
dtoverlay=disable-bt
# オンボードのサウンドカードをOFFにする。
dtparam=audio=off

ユーザを作成する

以前はデフォルトユーザとしてユーザ名pi、パスワードraspberryが作成されていたが、現在は作られなくなった。 headlessインストールでは困る。

これは/boot領域にuserconf.txtを配置しておくことで回避できる。 userconf.txtに/etc/shadowの行を記載すると対応するユーザが自動作成される。

${USER}:${PASSWORD_HASH}

パスワードハッシュはopensslコマンドで作成できる。

# ソルトをtest、パスワードをtestとするSHA-512ハッシュの生成
$openssl passwd -6 -salt 'test' 'test'
$6$test$s73HObLPm3spffEErq3RSoFse8b43m.tVitc.rEapP4nbLqdmZZabQpuXHItK6ZdlYGqOs5nbhFsWb.ZHZlYa0

ユーザ名をuserとした場合、最終的にuserconf.txtは次のようになる。

user:$6$test$s73HObLPm3spffEErq3RSoFse8b43m.tVitc.rEapP4nbLqdmZZabQpuXHItK6ZdlYGqOs5nbhFsWb.ZHZlYa0

ソルト長はNISTガイドラインで少なくとも32 bitとされているから、4文字以上が望ましい

起動

LANケーブルを繋ぎ、USBメモリを挿した状態で電源を供給する。 しばらく待つとパケットをキャプチャしているDHCPサーバ側でIPのリースが行われたことが分かるから、次のようにしてラズパイにSSHする。

ssh ${上で作成したユーザ}@リースされたIPアドレス

初期設定

raspi-configを使ってTUIで各種設定する。

sudo raspi-config

後から変更できるものが多いため、そこまで気にする必要はない。

パッケージのインストール

vimをインストール

sudo apt install vim-nox

nanoをアンインストール

sudo apt purge nano

IPアドレスの固定化

毎回DHCPでIPが変わってしまうとDNSを設定する必要があるから、IPを固定にする。 以下の設定ファイルを更新する。

vim /etc/dhcpcd.conf

最低限、以下の設定を行う

interface eth0
static ip_address=172.16.0.4/24
static routers=172.16.0.1
static domain_name_servers=9.9.9.9

sudo rebootしてしばらく待ち、固定後のアドレスでsshしてみる。 IPが変わっているためssh時にman-in-the-middle攻撃を受けているかも警告がでる。 ~/.ssh/known_hostsから該当する行を削除すれば接続できる。

再起動後の設定

swapの拡張

ラズパイ3BはRAMが1GBしかない。 今回はストレージに500GBのポータブルHDDを使っていて、容量に余裕があるからswapを8GBまで拡張する。 sudo vim /etc/dphys-swapfileで設定ファイルを開き、CONF_SWAPSIZEの値を編集する。 単位はKBである。 8GBにするなら8192と設定する。 CONF_MAXSWAPの値がCONF_SWAPSIZEよりも小さい場合、CONF_MAXSWAPも修正する。 さもないと、swapサイズがCONF_MAXSWAPに制限されてしまう。 編集後は以下のコマンドでswapサービスを再起動する。

sudo /etc/init.d/dphys-swapfile restart

再起動後にfree -hしてswapサイズが変わって入れば成功である。

SSH接続をちゃんと設定する

まずは公開鍵でログインできるようにする。 まだ鍵ペアを作成していなかったらssh-keygenで作る。 作成した公開鍵はssh-copy-idでラズパイへ送ると手間が少ない。

ssh-copy-id -i PUBLIC_KEY_PATH USER_NAME@HOST

ラズパイにsshしてsudo vim /etc/ssh/sshd_configSSHサーバの設定を修正する。 最低限のセキュリティを確保するために以下だけは設定する。

# 公開鍵認証を明示的に有効化
PubkeyAuthentication yes
# rootユーザへ直接sshできないようにする
PermitRootLogin no
#パスワード認証を無効化(必要に応じて)
PasswordAuthentication no

sudo sshd -tして設定に構文エラーなどがないか確認する。 エラーがなければ何も表示されない。

sshdの設定を反映する。

sudo systemctl restart sshd

mDNSを殺す

DNSサーバがあって利用可能ならmDNSは要らない。 結構依存ライブラリがあるからautoremoveもした方が良い。

sudo apt purge avahi-daemon
sudo apt autoremove

不要なサービスを停止する

  • オーディオを使わないから、関連するデーモンも不要(alsa-utilsパッケージ)
  • Wi-Fiを使わないから関連するデーモンも不要(wpasupplicantパッケージ)
sudo apt purge alsa-utils wpasupplicant
sudo apt autoremove

dockerをインストール

次のページを参考にする。 convenience scriptを使うと楽。

Install Docker Engine on Debian | Docker Documentation

最初にパッケージを更新しておく

sudo apt update
sudo apt full-upgrade 

シェルスクリプトをダウンロードして実行する。

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.sh

docker versionが実行され、バージョン情報が表示されたら多分インストール成功してる。

sudoなしでdockerを操作できるようにする。

sudo usermod -aG docker ${USER}
newgrp docker
docker run --rm hello-world

Rootless modeを使う方法もある。 今回はコンテナ内からホストの設定に影響を及ぼすコンテナを実行するため、rootでデーモンを実行する。