The Rank of F

渋谷で働く無能のブログ

Raspberry Pi 4 with NFS boot

Raspberry Pi 4 (4GB) を今更買った

フルセットで安いのがあったのと RPi の各種サポートが手厚いのが羨ましかったので。

開封

こんな感じで届いた。

f:id:zeriyoshi:20210507043823j:plain

内容物。

f:id:zeriyoshi:20210507043902j:plain

Raspberry Pi 4 本体

ちゃんと技適も通っている OKdo 製。

f:id:zeriyoshi:20210507044355j:plain

Made in UK でいつも通りの Sony UK 製

Pi4 では Made in China を見ない気がするけど element14 もソニーで作るようになったんだろうか?

チップたち。USB 3.0 用の VLI VL805 PCI Express チップと Micron 製の LPDDR4 RAM

Broadcom BCM54213PE RGMII GbE トランシーバが見える。

f:id:zeriyoshi:20210507044544j:plain

メイン SoC の Broadcom BCM2835

発熱が大きくなったのでヒートスプレッダがついていた。

f:id:zeriyoshi:20210507044718j:plain

付属してきたフルアーマーヒートシンクケース

なかなか重厚なアルミでパッシブ冷却でもそこそこ冷やせそう。

f:id:zeriyoshi:20210507044850j:plain

付属の熱伝導シートをチップに貼り

f:id:zeriyoshi:20210507044935j:plain

付属の小型レンチで六角ネジを締め付けて完成。

f:id:zeriyoshi:20210507045015j:plain

他にも AC アダプタ (Anker 製) や

f:id:zeriyoshi:20210507045103j:plain

オンオフできる USB Type-C ケーブルが付属。

f:id:zeriyoshi:20210507045117j:plain

その他にも

と価格の割になかなか豪華な構成だった。

NFS ブートできるようにする

システムアップデートでカーネルが更新されたときのために本来ならカーネルNFS 下に置きたいが

シリアルケーブルがなく u-boot の動作確認ができなかった。

一旦カーネルについては microSD カード上の /boot パーティションを使うことにする。 (u-boot 化は後日)

OS の導入

今更 armhf は嫌なので、公式サイトから Raspberry Pi OS Lite (arm64) をダウンロードしてくる。

downloads.raspberrypi.org

macOSmicroSD カードを接続し、 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
    • tcp: NFS に使うプロトコルの指定。 udp はもうレガシ (かつ NAS も対応していなかった)ので tcp
    • vers: NFS プロトコルバージョン。 NAS 側が 4.1 まで対応しているので 4 を指定。
  • rw: Read/Write 。これを指定しないとパーミッション周りがおかしくなる
  • ip: IP アドレスの指定。 dhcp も使えるが必要ないので静的に
    • 192.168.1.2: 自身の IP
    • 192.168.1.3: NFS 接続先の IP
    • 192.168.1.1: Gateway IP
    • 255.255.255.0: Subnet Mask
    • zeripi4: Hostname
    • eth0: NIC
    • off: 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_keysmacOS 上のユーザーの ~/.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 ℃ くらいだった。

f:id:zeriyoshi:20210507042951p:plain

オーバークロックで 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 でファイルコピーしていたので悪影響が出た気もする。

総評

  • このフルセットはかなりお得だと思う
  • フルアーマーヒートシンクケースが優秀
  • u-boot までできなかったのが残念
    • u-boot 自体は動いているような挙動をしている
      • Raspberry Pi 4 での u-boot は HDMI に画面を出力してくれなさそう
      • USB 接続のシリアルケーブルを購入済み。土曜日に届く
  • NFS ブートで手こずった
    • NAS 側で既に UDP での NFS が非対応になっていた
    • そもそも UDP を使う旨味がもはやない
    • 巷の NFS ブートの例は UDP ばかりなので注意