7

投稿日

NanoPi R5Sのイメージを再構築してみる

はじめにNanoPi R5S

NanoPi自体の説明はあちこちにあるのでそちらを参照していただくのが正確で詳しいと思いますので割愛します。R5Sは5月に発売されたばかりの製品なので、まだ情報も少なくSBCでよく使われるArmbianも対応していません。速度的には一つ前のR4Sより3割程遅いそうです。そのかわりに2.5GLANや16GBのeMMCが内蔵、更にSSDが増設可能だったり強化点も多いです。SBCではSDカードをストレージにするのが一般的ですが、耐久性に難ありなのでeMMCを搭載する機種が少しづつ増えているようです(アップセルが目的?)。

NanoPiシリーズのOSはFriendryWRTというOpenWRTベースのものとFriendlyCoreというUbuntuをベースにしたOS、さらにDebianベースのデスクトップOSがメーカーから提供されています。また、シェアの高い機種に対してはArmbianというオープンなディストロも存在します。筆者はWireGuardで拠点間接続とクライアント接続、あとLinuxとしての生活環境が欲しかっただけなのでUbuntuベースのものを利用しています。
OpenWRTもルーターの基本部分がまるっと提供されるので便利ではあるのですが、OpenWRTの流儀を踏襲した形でカスタマイズしていくのに堅苦しさを感じるので。。。

発売間もない製品は罠がいっぱい?

実はSBCは初めてです。初めてのSBCで情報のあまりない製品に手を出してしまったこともあり罠が沢山あったのでその体験記です。

最初に起動しての感想ですが、普通にUbuntuです。違いはルートファイルシステムがベースイメージに対するオーバーレイになっています。ネットワーク設定など一部Ubuntuの標準から外れた使い方をしている部分もありますが大きく手を入れている感じはしません。ほぼ生の20.04なので安心感があります。カーネルは5.10のカスタムカーネルです。

しかし、意気揚々とWireGuardの設定を行うと。。。ダメです。インタフェースが作れません。

罠その1 WireGuardのカーネルモジュールが入っていない

WireGuardのカーネルモジュールが入っていないようです。カーネルに対応するヘッダーファイルが入っていないのでDKMSも失敗します。

この時点で失敗した感が漂います。。。(もっと実績のある機種にすればよかった)

https://wiki.friendlyelec.com/wiki/index.php/NanoPi_R5S
NanoPi販売元のFriendyELECは充実したWikiを用意してくれているのですが、そこにはカーネルヘッダーのインストール方法も記載があります。でもパッケージファイルが無いのでインストールできません。以前はあったのか単純に間違っているのか、、、

さて困った。履歴によると7月の更新でFriendlyWRTにはWireGuardのモジュールが追加されています。そこで、FriendlyWRTのメージからモジュールを取ってきて入れてみましたが、、ダメです。動きません。

インストールされているのと同じ 5.10.110 のカーネルヘッダーを入れてみたりとあがいてみましたがダメそうです。とりあえず、wikiの情報を一通り読むと、FriendlyWRTのイメージ構築方法が記載されています。当該のGitHUBリポジトリを覗くとどうやらFriendryCoreにも対応しているようです(出口が見えた気がします)。

再構築してみよう

wikiの「8 How to Compile」項にFriendlyWRTのコンパイル方法について触れられています。その次の「9 Make Your Own OS Image」にはURLだけが示されている感じですが、
https://github.com/friendlyarm/sd-fuse_rk3568

これが重要です。このリポジトリを取ってきてスクリプトを実行するだけでイメージを作れるようです。

まずはカーネルを作ってみましょう。

build-kernel.sh

arm64カーネルなのでarmインスタンスに環境を用意したのですが、amd64用のクロスコンパイル環境を持ってきてビルドしてくれるようです。全自動ですね素晴らしい(逆にarmでは動かない)。
カーネルだけ作れば、あと必要なものは既存の配布セットから抽出して組み合わせてくれるようです。素晴らしい。
更に、環境変数(MK_HEADERS_DEB=1)を定義してビルドするとカーネルヘッダーのパッケージも作ってくれます。素晴らしい。

但し、Linuxの環境を持っていない人にはハードルが高いかもしれませんね。いや、そんな人はこんな酔狂なおもちゃに手を出さないか。

先ほどのbuild-kernel.shを実行するとカーネルソースもgitから取ってきてそのままビルドが進行してしまうので、途中で止めてコンフィグレーションを調整します。
対象はこれ

out/kernel-rk3568/arch/arm64/configs/nanopi5_linux_defconfig

今回はWireGuardを使いたかったので

CONFIG_WIREGUARD=m

を末尾に追記しました。この時、build-kernel.sh はrootで実行する必要があります。最初ユーザー権限で実行していたのですが、カーネルを作り終えてrootfsイメージに統合する際にしれっとエラーで止まってました。
これで必要なものがそろうと、あとは mk-emmc-image.sh(SDカード起動の場合には mk-sd-image.sh)を使ってインストールイメージを生成するだけです(こちらはスクリプト内でsudoしてくれました)。

新しいイメージをインストールするとWireGuardも無事使えるようになります。これで目的が達成できる。

罠その2 aptでエラーが出る

apt でカーネルまわりのパッケージが関連するとそれ以降 flash-kernel, initramfs-tools のエラーが出るようになります。

これはOS自体には flash-kernelの対応があるものの、当該機材の情報が無いためにエラーになるようです。
/etc/flash-kernel/db にモデル名(/proc/device-tree/model に記載されています)を追記すればとりあえずは解決のようです。

罠その3 カーネルメッセージにど派手なエラーが記録される

カーネルメッセージに dm-0 のエラーが記載されています。どうやらdevice mapperのエラーのようです。
何処でエラーになっているかわからなかったのですが、ふと docker をいじっているとこいつが使っていたようです。
今どきのdockerならoverlay2のはずなのですが、ここではdevice mapperを使って非推奨だよと警告を受けていました。どうやら下地のファイルシステムがoverlayなのでこうなってしまうようです。

ということはflashメモリー(eMMC含む?)ではこのエラーは避けて通れない?幸い非推奨と言われるのと何らかのエラーがでているだけでコンテナは動いていますから実害はないのかもしれません。ただ、エラーが気持ち悪いとなるとイメージやコンテナはSSDに配置した方がよいのかもしれません。

と、いうことで、迷っていたSSDを注文しました。amazonで128GB/2千円の激安SSDです。SDカードのような値段ですが、パフォーマンスが低くwriteが500MB/sしかでないようです。ただNanoPi R5SはNVMe対応ではあるもののPCIe2.0x1なので元々速度は出ません。耐久性さえあれば、、、、

/homeをSSDに置き換えて、dockerのデータは/home/.dockerに配置しました。/var/lib/dockerからコピーしましたが、device mapperを使っていたころのデータでは互換性が無いようで起動しませんでした。中身を消してまっさらな状態で始めれば大丈夫です。

dockerのデータ置き場を変更するには以下のファイルを配置すれば良いでしょう。

/etc/docker/daemon.json
{
  "graph": "/home/.docker"
}

激安SSDということで性能等々が気になるところですが、読み書きとも概ね380MB/sec程度のようです。SSDとしては遅いですがPCIe2.0x1という接続なのでそんなもんでしょう。発熱も気になりますが、SSD追加前後でCPUの温度は2度上昇という程度です。
SSD自体は52度前後(警告の基準となる温度では37度、追加のセンサーが52度?何を信じて良いのやら)。ちょっと熱いですが小さな筐体に詰め込んでエアコンの無い部屋に置いてあるのでそんなものでしょう。気になる場合はサーマルパッドを張っておくとケースと密着して冷えるかもしれません。

罠その4 LEDつかないよ?

R5SにはLEDが4つついています。一つはシステム(電源?)、そしてWAN, LAN1, LAN2 です。このうち、システムはずっと点滅しています。残りは消灯したままです。wikiにLEDの設定方法が記載されていますが、エラーになります。

$ cat /sys/class/leds/lan1_led/trigger 

triggerを確認するとドキュメントにある netdev なんてありません。ありませんが、カーネルモジュールはちゃんとインストールされていました。

$ modprobe ledtrig-netdev

モジュールをロードすればトリガーに使えるようになります。ドキュメント通りにやるとLANケーブルを挿せば点灯します。netdevをtriggerを設定するとlink以外にもtx,rxというファイルも生えてくるので、これらにもecho 1 > txのように値を設定するとパケットの送受信で点滅します。

LAN内の通信(筆者の環境には1G ehterしかありませんが)も800Mbps程度、WireGuardを通してもほぼ変わらずなので、限界はもっと高いところにありそうです。WireGuard接続器としては満足な性能です。検証のためにSSDも買ってしまったので宅内データ保管にも活用できそうです。

ちなみに演算性能ですが、よくあるクラウドサービスの最低スペックのインスタンスよりも若干低いくらいのシングルコア性能です。そして、4コアあるのでマルチではもう1ランクくらい上の性能に届きます。そして、メモリとストレージがそれなりにあるので宅内サーバには十分ではないでしょうか。

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
ログインすると使える機能について

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
新規登録
すでにアカウントを持っている方はログイン
7