以前から状況が変わって、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_config
でSSHサーバの設定を修正する。
最低限のセキュリティを確保するために以下だけは設定する。
# 公開鍵認証を明示的に有効化 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
不要なサービスを停止する
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でデーモンを実行する。