Raspberry Pi 4 with NFS boot
Raspberry Pi 4 (4GB) を今更買った
フルセットで安いのがあったのと RPi の各種サポートが手厚いのが羨ましかったので。
開封
こんな感じで届いた。
内容物。
Raspberry Pi 4 本体
ちゃんと技適も通っている OKdo 製。
Made in UK でいつも通りの Sony UK 製
Pi4 では Made in China を見ない気がするけど element14 もソニーで作るようになったんだろうか?
チップたち。USB 3.0 用の VLI VL805 PCI Express チップと Micron 製の LPDDR4 RAM
Broadcom BCM54213PE RGMII GbE トランシーバが見える。
メイン SoC の Broadcom BCM2835
発熱が大きくなったのでヒートスプレッダがついていた。
付属してきたフルアーマーヒートシンクケース
なかなか重厚なアルミでパッシブ冷却でもそこそこ冷やせそう。
付属の熱伝導シートをチップに貼り
付属の小型レンチで六角ネジを締め付けて完成。
他にも AC アダプタ (Anker 製) や
オンオフできる USB Type-C ケーブルが付属。
その他にも
と価格の割になかなか豪華な構成だった。
NFS ブートできるようにする
システムアップデートでカーネルが更新されたときのために本来ならカーネルも NFS 下に置きたいが
シリアルケーブルがなく u-boot の動作確認ができなかった。
一旦カーネルについては microSD カード上の /boot
パーティションを使うことにする。 (u-boot 化は後日)
OS の導入
今更 armhf は嫌なので、公式サイトから Raspberry Pi OS Lite (arm64) をダウンロードしてくる。
macOS に microSD カードを接続し、 diskutil list
でデバイスを確認する。
[macOS:~] $ diskutil list /dev/disk0 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *500.3 GB disk0 1: EFI EFI 314.6 MB disk0s1 2: Apple_APFS Container disk1 414.0 GB disk0s2 3: Microsoft Basic Data BOOTCAMP 86.0 GB disk0s3 /dev/disk1 (synthesized): #: TYPE NAME SIZE IDENTIFIER 0: APFS Container Scheme - +414.0 GB disk1 Physical Store disk0s2 1: APFS Volume Macintosh HD - Data 227.0 GB disk1s1 2: APFS Volume Preboot 81.7 MB disk1s2 3: APFS Volume Recovery 529.0 MB disk1s3 4: APFS Volume VM 9.7 GB disk1s4 5: APFS Volume Macintosh HD 11.3 GB disk1s5 /dev/disk2 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *63.9 GB disk2 1: Windows_NTFS 63.8 GB disk2s1
一旦マウントを解除する
[macOS:~] $ diskutil unmount force /dev/disk2s1 Volume on disk2s1 force-unmounted
デバイスは disk2
なので rdisk2
に書き込む
$ sudo dd if=~/Downloads/2021-03-04-raspios-buster-arm64-lite.img of=/dev/rdisk2 bs=1m 1724+0 records in 1724+0 records out 1807745024 bytes transferred in 82.731108 secs (21850850 bytes/sec)
EEPROM 更新
microSD カードを抜き、 Raspberry Pi 4 にセットして起動。
無事起動したのでシステムを更新する。
$ sudo apt-get update $ sudo apt-get full-upgrade
再起動。
$ sudo reboot -h now
EEPROM (bootloader) を更新したいが、 arm64 版はまだ安定版になっていないのでできない
強制的にリリース情報を変更して更新する。
$ sudo sed -ie 's/default/stable/g' /etc/default/rpi-eeprom-update $ sudo rpi-eeprom-update -a
再起動。
$ sudo reboot -h now
更新されたことを確認。
$ sudo rpi-eeprom-update
リリース情報を元に戻す。
$ sudo sed -ie 's/stable/default/g' /etc/default/rpi-eeprom-update
NFS マウントとコピー
/
のブロックデバイスを適当な場所にマウントする
デバイスは lsblk
とかで確認する。
$ mkdir root && sudo mount /dev/mmcblk0p2 root
NFS をマウントする。
$ mkdir nfs && sudo mount -t nfs 192.168.1.3:/mnt/md0/rpi4_main nfs
rsync
でコピー。
$ sudo rsync -av root/ nfs
NFS 側の /etc/fstab
を編集しルートパーティションのマウント設定を外す。
$ sudo nano nfs/etc/fstab
カーネルコマンドラインの変更
/boot/cmdline.txt
のカーネルコマンドラインを編集し、 NFS からブートするように変更する。
まずはオリジナルの cmdline.txt
をバックアップ。
$ cd /boot $ sudo cp cmdline.txt cmdline.txt.orig
そして以下のようなコマンドラインを
console=serial0,115200 console=tty1 root=PARTUUID=XXXXXXXX-YY rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
以下のように書き換える。
console=serial0,115200 console=tty1 root=/dev/nfs rootfstype=nfs nfsroot=192.168.1.3:/mnt/md0/rpi4_main,tcp,vers=4.1 rw ip=192.168.1.2:192.168.1.3:192.168.1.1:255.255.255.0:zeripi4:eth0:off elevator=deadline fsck.repair=yes rootwait
意味合いとしては
rootfstype
: 明示的なファイルシステムの指定。 NFS なのでnfs
nfsroot
: NFS におけるルートパス。この場合は192.168.1.3:/mnt/md0/rpi4_main
rw
: Read/Write 。これを指定しないとパーミッション周りがおかしくなるip
: IP アドレスの指定。dhcp
も使えるが必要ないので静的に
セットアップ
とりあえずいろいろ不便なので設定を変える。
ロケール, タイムゾーン, ホスト名
コマンドでやってもいいが、面倒だしせっかくなので raspi-config
を使った。
$ sudo raspi-config
パッケージ導入
足りないものを入れる
余計なものはいっぱい入っているのにここらへんがない不思議。
$ sudo apt-get install -y vim screen
IP
カーネルコマンドラインで指定しているおかげで IPv4 は既に固定されている
IPv6 についてもそのままで困ることはないので、特に設定しない。
ユーザー作成
pi
ユーザーはいろいろな意味で使いたくないのでユーザーを作成して pi
を削除する。
$ sudo adduser zeriyoshi $ sudo usermod -aG $(groups | sed 's/ /,/g') zeriyoshi # pi ユーザーのすべてのグループを付与
ログアウトし、 zeriyoshi
でログイン後 pi
ユーザーを削除。
sudo userdel -r pi
SSH 設定
とりあえず ssh.service
を有効化する。
$ sudo systemctl enable ssh.service $ sudo systemctl start ssh.service
ひとまずパスワードで Mac からログインする
[macOS:~] $ ssh ZeriPi4.local
ログインできたら鍵を生成する 特に使わないがディレクトリを自作するのが面倒。
$ ssh-keygen
~/.ssh/authorized_keys
に macOS 上のユーザーの ~/.ssh/id_rsa.pub
を貼り付けて保存する。
/etc/ssh/sshd_config
を編集し、 PasswordAuthentication no
を追加する
$ sudo sh -c "echo 'PasswordAuthentication no' >> /etc/ssh/sshd_config"
sshd を再起動する
$ sudo systemctl restart ssh
ベンチマーク等
発熱
ケースには付属のフルアーマーヒートシンクケース (パッシブ冷却) を使用中
openssl speed -multi 4
でいじめてみたものの、だいたい最大でも 70 ℃ くらいだった。
オーバークロックで 2GHz まで盛る予定だがちょっと厳しいかもしれない
少しでも風が当たれば十分に冷えるので常時稼働の空気清浄機の近くに置いておけば問題ないかも?
ストレージ速度
大体 50MB/s (400Mbps) 程度のよう。
$ cd && dd if=/dev/zero of=dummy bs=8k count=100k; rm -f dummy 102400+0 records in 102400+0 records out 838860800 bytes (839 MB, 800 MiB) copied, 15.6088 s, 53.7 MB/s
UnixBench
もはやどれが適切なバージョンなのかもわからない老舗ベンチマーク。
$ curl -sOL https://github.com/kdlucas/byte-unixbench/archive/refs/tags/v5.1.3.tar.gz $ tar xf v5.1.3.tar.gz $ cd byte-unixbench-5.1.3/UnixBench $ ./Run ======================================================================== BYTE UNIX Benchmarks (Version 5.1.3) System: ZeriPi4: GNU/Linux OS: GNU/Linux -- 5.10.17-v8+ -- #1403 SMP PREEMPT Mon Feb 22 11:37:54 GMT 2021 Machine: aarch64 (unknown) Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8") 04:32:55 up 1:16, 2 users, load average: 0.08, 0.12, 0.61; runlevel 5 ------------------------------------------------------------------------ Benchmark Run: Fri May 07 2021 04:32:55 - 05:00:43 0 CPUs in system; running 1 parallel copy of tests Dhrystone 2 using register variables 14570034.5 lps (10.0 s, 7 samples) Double-Precision Whetstone 2563.2 MWIPS (9.2 s, 7 samples) Execl Throughput 1340.7 lps (30.0 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 147614.6 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 41615.4 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 419917.7 KBps (30.0 s, 2 samples) Pipe Throughput 176534.5 lps (10.0 s, 7 samples) Pipe-based Context Switching 34266.8 lps (10.0 s, 7 samples) Process Creation 3054.7 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 1428.7 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 559.4 lpm (60.1 s, 2 samples) System Call Overhead 143088.2 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 14570034.5 1248.5 Double-Precision Whetstone 55.0 2563.2 466.0 Execl Throughput 43.0 1340.7 311.8 File Copy 1024 bufsize 2000 maxblocks 3960.0 147614.6 372.8 File Copy 256 bufsize 500 maxblocks 1655.0 41615.4 251.5 File Copy 4096 bufsize 8000 maxblocks 5800.0 419917.7 724.0 Pipe Throughput 12440.0 176534.5 141.9 Pipe-based Context Switching 4000.0 34266.8 85.7 Process Creation 126.0 3054.7 242.4 Shell Scripts (1 concurrent) 42.4 1428.7 337.0 Shell Scripts (8 concurrent) 6.0 559.4 932.3 System Call Overhead 15000.0 143088.2 95.4 ======== System Benchmarks Index Score 318.4
特に microSD カードとあまり変わらない感じ
というか途中 NAS に別 PC でファイルコピーしていたので悪影響が出た気もする。