armbian Mainline系 MACアドレス固定 (NanoPi NEO)

NanoPi NEO(無印)でarmbianのカーネル3.4.113を使ってる限りは特に問題無いようなのだが、パッケージで配布されているカーネル4.10.1に更新すると(若しくはソースを改変しないでMainline系でビルドすると)、システム起動の度にMACアドレスがランダムに変わりまくるというDHCP泣かせなことになる。NanoPi NEOだけでなくおそらくOrangePiなども同様かと。

以下、例によって行頭のプロンプトが$のコマンド行は一般ユーザーで、#のコマンド行はsudo(またはスーパーユーザー)で実行する。

$ dmesg | grep PHY
[   14.719543] Generic PHY 1c30000.ethernet:01: attached PHY driver [Generic PHY] (mii_bus:phy_addr=1c30000.ethernet:01, irq=-1)

PHYを調べるとなんかよくわかんない1c30000というのが出てくる。

できればMACアドレスは固定したい。(IPアドレス固定とは別に)
Linuxは詳しくないが、どうもこの手の設定変更はデバイスツリーで行うようなのでデバイスツリーの設定ファイルを調べる。

$ ls -l /boot
total 17832
-rw-r--r-- 1 root root     153 Mar 18 00:40 armbianEnv.txt
drwxr-xr-x 2 root root    4096 Mar 17 16:16 bin
-rw-r--r-- 1 root root    6944 Mar 17 16:18 boot.bmp
-rw-r--r-- 1 root root    3410 Mar 17 16:08 boot.cmd
-rw-r--r-- 1 root root    3482 Mar 17 16:23 boot.scr
-rw-r--r-- 1 root root  146184 Mar 17 15:10 config-4.10.3-sun8i
lrwxrwxrwx 1 root root      16 Mar 17 16:16 dtb -> dtb-4.10.3-sun8i
drwxr-xr-x 3 root root    4096 Mar 18 01:15 dtb-4.10.3-sun8i
-rw-r--r-- 1 root root 5075749 Mar 17 16:18 initrd.img-4.10.3-sun8i
lrwxrwxrwx 1 root root      17 Mar 17 16:16 script.bin -> bin/nanopineo.bin
-rw-r--r-- 1 root root 2206925 Mar 17 15:10 System.map-4.10.3-sun8i
lrwxrwxrwx 1 root root      20 Mar 17 16:18 uInitrd -> uInitrd-4.10.3-sun8i
-rw-r--r-- 1 root root 5075813 Mar 17 16:18 uInitrd-4.10.3-sun8i
-rwxr-xr-x 1 root root 5715840 Mar 17 15:10 vmlinuz-4.10.3-sun8i
lrwxrwxrwx 1 root root      20 Mar 17 16:10 zImage -> vmlinuz-4.10.3-sun8i

/boot/dtbの実体は/boot/dtb-4.10.3-sun8iらしい。

$ ls -l /boot/dtb-4.10.3-sun8i
total 1484
drwxr-xr-x 2 root root  4096 Mar 17 16:16 overlay
-rw-r--r-- 1 root root 32224 Mar 17 15:10 sun6i-a31-app4-evb1.dtb
-rw-r--r-- 1 root root 33800 Mar 17 15:10 sun6i-a31-colombus.dtb
-rw-r--r-- 1 root root 40041 Mar 17 15:10 sun6i-a31-hummingbird.dtb
-rw-r--r-- 1 root root 33379 Mar 17 15:10 sun6i-a31-i7.dtb
-rw-r--r-- 1 root root 37636 Mar 17 15:10 sun6i-a31-m9.dtb
-rw-r--r-- 1 root root 37688 Mar 17 15:10 sun6i-a31-mele-a1000g-quad.dtb
-rw-r--r-- 1 root root 37455 Mar 17 15:10 sun6i-a31s-colorfly-e708-q1.dtb
-rw-r--r-- 1 root root 29742 Mar 17 15:10 sun6i-a31s-cs908.dtb
-rw-r--r-- 1 root root 37949 Mar 17 15:10 sun6i-a31s-inet-q972.dtb
-rw-r--r-- 1 root root 38001 Mar 17 15:10 sun6i-a31s-primo81.dtb
-rw-r--r-- 1 root root 37915 Mar 17 15:10 sun6i-a31s-sina31s.dtb
-rw-r--r-- 1 root root 34735 Mar 17 15:10 sun6i-a31s-sinovoip-bpi-m2.dtb
-rw-r--r-- 1 root root 36885 Mar 17 15:10 sun6i-a31s-yones-toptech-bs1078-v2.dtb
-rw-r--r-- 1 root root 20032 Mar 17 15:10 sun8i-a23-evb.dtb
-rw-r--r-- 1 root root 26143 Mar 17 15:10 sun8i-a23-gt90h-v4.dtb
-rw-r--r-- 1 root root 26031 Mar 17 15:10 sun8i-a23-inet86dz.dtb
-rw-r--r-- 1 root root 26690 Mar 17 15:10 sun8i-a23-ippo-q8h-v1.2.dtb
-rw-r--r-- 1 root root 26690 Mar 17 15:10 sun8i-a23-ippo-q8h-v5.dtb
-rw-r--r-- 1 root root 27226 Mar 17 15:10 sun8i-a23-polaroid-mid2407pxe03.dtb
-rw-r--r-- 1 root root 26947 Mar 17 15:10 sun8i-a23-polaroid-mid2809pxe04.dtb
-rw-r--r-- 1 root root 26690 Mar 17 15:10 sun8i-a23-q8-tablet.dtb
-rw-r--r-- 1 root root 32089 Mar 17 15:10 sun8i-a33-et-q8-v1.6.dtb
-rw-r--r-- 1 root root 31842 Mar 17 15:10 sun8i-a33-ga10h-v1.1.dtb
-rw-r--r-- 1 root root 31918 Mar 17 15:10 sun8i-a33-inet-d978-rev2.dtb
-rw-r--r-- 1 root root 32089 Mar 17 15:10 sun8i-a33-ippo-q8h-v1.2.dtb
-rw-r--r-- 1 root root 29977 Mar 17 15:10 sun8i-a33-olinuxino.dtb
-rw-r--r-- 1 root root 32089 Mar 17 15:10 sun8i-a33-q8-tablet.dtb
-rw-r--r-- 1 root root 29608 Mar 17 15:10 sun8i-a33-sinlinx-sina33.dtb
-rw-r--r-- 1 root root  4199 Mar 17 15:10 sun8i-a83t-allwinner-h8homlet-v2.dtb
-rw-r--r-- 1 root root  4183 Mar 17 15:10 sun8i-a83t-cubietruck-plus.dtb
-rw-r--r-- 1 root root 33163 Mar 17 15:10 sun8i-h2-plus-orangepi-zero.dtb
-rw-r--r-- 1 root root 30025 Mar 17 15:10 sun8i-h3-bananapi-m2-plus.dtb
-rw-r--r-- 1 root root 27988 Mar 17 15:10 sun8i-h3-beelink-x2.dtb
-rw-r--r-- 1 root root 30538 Mar 17 15:10 sun8i-h3-nanopi-m1.dtb
-rw-r--r-- 1 root root 31709 Mar 17 15:10 sun8i-h3-nanopi-neo.dtb
-rw-r--r-- 1 root root 29705 Mar 17 15:10 sun8i-h3-orangepi-2.dtb
-rw-r--r-- 1 root root 31820 Mar 17 15:10 sun8i-h3-orangepi-lite.dtb
-rw-r--r-- 1 root root 31301 Mar 17 15:10 sun8i-h3-orangepi-one.dtb
-rw-r--r-- 1 root root 31065 Mar 17 15:10 sun8i-h3-orangepi-pc.dtb
-rw-r--r-- 1 root root 32013 Mar 17 15:10 sun8i-h3-orangepi-pc-plus.dtb
-rw-r--r-- 1 root root 32724 Mar 17 15:10 sun8i-h3-orangepi-plus2e.dtb
-rw-r--r-- 1 root root 33467 Mar 17 15:10 sun8i-h3-orangepi-plus.dtb
-rw-r--r-- 1 root root 31410 Mar 17 15:10 sun8i-r16-parrot.dtb
-rw-r--r-- 1 root root 33170 Mar 17 15:10 sun9i-a80-cubieboard4.dtb
-rw-r--r-- 1 root root 34620 Mar 17 15:10 sun9i-a80-optimus.dtb

使用中の機種のデバイスツリーファイルを(名前で)探す。
NaniPi NEOなのでどうやらsun8i-h3-nanopi-neo.dtbっぽい。
.dtbファイルはバイナリファイルなので気軽に編集できるものではない。そこでデバイスツリーソースに変換する。

$ cd  /boot/dtb-4.10.3-sun8i
# dtc -I dtb -O dts -o sun8i-h3-nanopi-neo.dts sun8i-h3-nanopi-neo.dtb

sun8i-h3-nanopi-neo.dtsが出力される。.dtsファイルはテキストファイルなのでエディタで編集可能。

# vim /boot/dtb-4.10.3-sun8i/sun8i-h3-nanopi-neo.dts

                ethernet@1c30000 {
                        compatible = "allwinner,sun8i-h3-emac";
                        syscon = <0x1f>;
                        reg = <0x1c30000 0x104>;
                        interrupts = <0x0 0x52 0x4>;
                        resets = <0x2 0xc>;
                        reset-names = "ahb";
                        clocks = <0x2 0x1b>;
                        clock-names = "ahb";
                        #address-cells = <0x1>;
                        #size-cells = <0x0>;
                        status = "okay";
                        phy-handle = <0x20>;
                        phy-mode = "mii";
                        allwinner,leds-active-low;
                        linux,phandle = <0x57>;
                        phandle = <0x57>;
                        mac-address = [aa bb cc dd ee ff];

                        mdio {
                                #address-cells = <0x1>;
                                #size-cells = <0x0>;
                                linux,phandle = <0x58>;
                                phandle = <0x58>;

                                ethernet-phy@1 {
                                        reg = <0x1>;
                                        clocks = <0x2 0x43>;
                                        resets = <0x2 0x27>;
                                        linux,phandle = <0x20>;
                                        phandle = <0x20>;
                                };
                        };
                };

ethernet@1c30000のブロックを探し、mac-address行(1行)を追加する。
MACアドレスをaa:bb:cc:dd:ee:ffにしたいなら mac-address = [aa bb cc dd ee ff]; と指定する。

デバイスツリーソースのままではシステムが読み込んでくれないのでバイナリファイルに変換する。

$ cd  /boot/dtb-4.10.3-sun8i
# mv sun8i-h3-nanopi-neo.dtb sun8i-h3-nanopi-neo.dtb.ORG
# dtc -I dts -O dtb -o sun8i-h3-nanopi-neo.dtb sun8i-h3-nanopi-neo.dts

やりたいことはほんのちょっとなわりに意外と面倒。