Aruba Instant On AP11をUnified APとして使う

しばらく前に Aruba Instant On AP11 が特価販売されており,自宅用に 2 台購入した.
そのまま使っても十分すぎるほど良い AP だが,個人的には LAN 内のネットワーク機器の管理がクラウドサービスに依存している点は好ましくないと思い,LAN 内の Virtual Controller で管理できる Unified AP (旧称 Instant AP; IAP) 化をしてみた.

追記:Instant AP (IAP) を Unified AP の旧称として紹介していたが,これは誤解だった.仮想コントローラ機能のみ対応のものが Instant AP,仮想コントローラ + コントローラの両対応が Unified AP であるらしい.

Aruba Instant On AP11 = Aruba AP-303

AP11 は Unified AP である AP-303 とほぼ同じハードウェアであり,外装とファームウェアだけが異なる. 実際,AP11 のラベルには Model: APIN0303 と書かれており,また,技術基準適合証明番号は AP11 と AP-303 のどちらも 018-170421 であり区別されていない.

Aruba Instant On AP11 の Aruba AP-303 Unified AP 化

AP11 で AP-303 のファームウェアを起動することにより,AP11 の Unified AP 化が可能である.

Unified AP 化にはシリアルコンソールケーブル,TFTP サーバと AP-303 のファームウェアイメージが必要である.

シリアルコンソールケーブルには自作のケーブルを使用した. AP11 のコンソール端子は USB Micro-B コネクタが使われているが,信号は 3.3V の UART が流れている. 純正のコンソールケーブルである AP-CBL-SERU を購入しない場合でも,USB ケーブルを加工して USB-UART に繋げることでケーブルを自作できる.

TFTP サーバは TFTPD64 を使用した.

AP-303 のファームウェアは,入手可能な最新版の ArubaInstant_Ursa_8.8.0.1_80393 を使用した. このファイルは TFTP サーバのルート直下に配置する.
(旧版のファームウェアの URL がここに記載されているので,参考にしてほしい.)

1. Unified AP のイメージでネットワークブートする

APBootのコンソールに落ちる

シリアルコンソールを接続して起動すると,ブートローダの APBoot が起動する.(APBootはU-Bootがベースらしい.)
Hit <Enter> to stop autoboot: 2 と表示されてから 2 秒以内にエンターキーを入力すると,自動起動せずにAPBootのコンソールに落ちる.
(シリアルコンソールの接続設定は 9600bps, 8 data bits, no parity, 1 stop bit)

APBoot 2.5.0.2 (build 70487)
Built: 2019-05-14 at 12:27:57

Model: AP11
DRAM:  512 MiB
Flash: Detected MX25R3235F: with write protection  total 4 MiB
NAND:  128 MiB
Power: DC
Net:   eth0
Radio: ipq4019#0, ipq4019#1
FIPS:  passed

Hit <Enter> to stop autoboot:  0
apboot> 

とりあえず factory_reset する

Instant On AP として使用すると APBoot の環境変数に設定が書き込まれてしまうので,設定を初期化しておく.

apboot> factory_reset
Clearing state...
Checking OS image and flags

Image is signed; verifying checksum... passed
Preserving image partition 0
Erasing flash sector @ 0x3a0000... OK
Erasing UBIFS ...done

Purging environment...
preserving os_partition (1)
Erasing SPI flash...Writing to SPI flash...done
Erasing SPI flash...Writing to SPI flash...done

printenv

環境変数を確認してみる.

apboot> printenv
autoload=n
autostart=yes
baudrate=9600
boardname=Speyburn
bootargs=console=ttyMSM0,9600n8 rdinit=/sbin/init ubi.mtd=aos0 ubi.mtd=aos1 ubi.mtd=ubifs
bootcmd=boot ap
bootdelay=2
bootfile=ipq40xx.ari
ethact=eth0
ethaddr=bc:9f:e4:xx:xx:xx
machid=8010001
mtddevname=aos0
mtddevnum=0
mtdids=nand0=nand0
mtdparts=mtdparts=nand0:0x2000000@0x0(aos0),0x2000000@0x2000000(aos1),0x4000000@0x4000000(ubifs)
os_partition=1
partition=nand0,0
servername=aruba-master
stderr=serial
stdin=serial
stdout=serial

Environment size: 535/65532 bytes

boardname に Speyburn とあるが,これは Aruba Instant AP 基本操作 Guide によると AP-303 のコードネームのようだ.

ネットワークブート

以後,TFTP サーバの IP アドレスを 192.168.100.2DHCP により AP11 に割り当てられた IP アドレスを 192.168.100.3 とする.

以下のコマンドで TFTP サーバから Unified AP のファームウェアを読み込み起動する.

dhcp
setenv serverip 192.168.100.2
setenv bootfile ArubaInstant_Ursa_8.8.0.1_80393
netget
bootm 0x84000200#Speyburn@1

初めに DHCP で AP にアドレスを割り振り,TFTP サーバの情報を環境変数に設定する.

apboot> dhcp
eth0 up: 1 Gb/s full duplex
DHCP broadcast 1
DHCP IP address: 192.168.100.3
DHCP subnet mask: 255.255.255.0
DHCP def gateway: 192.168.100.1
DHCP DNS server: 192.168.100.1
DHCP DNS domain:
apboot> setenv serverip 192.168.100.2
apboot> setenv bootfile ArubaInstant_Ursa_8.8.0.1_80393

次に,TFTP サーバからファームウェアを読み込む.
Instant On 向けのファームウェアではないため,Invalid Instant Small Business image とエラーメッセージが表示されるが,ここでは無視する.

apboot> netget
eth0 up: 1 Gb/s full duplex
Using eth0 device
TFTP from server 192.168.100.2; our IP address is 192.168.100.3
Filename 'ArubaInstant_Ursa_8.8.0.1_80393'.
Load address: 0x84000000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         ###############################################################
         302.7 KiB/s
done
Bytes transferred = 20670464 (13b6800 hex)
Invalid Instant Small Business image

最後に,メモリ上のファームウェアから起動する. bootm コマンドにはカーネルのアドレスとして 0x84000200 を指定する.0x84000000 にあるファームウェアの先頭から 512 バイト分をスキップしているが,これはファームウェアイメージのバリデーションを回避するためである. APBoot は Image Tree Blob (ITB) 形式のイメージに署名等を追加したファームウェアイメージを読み込むが,AP11 で AP-303 のファームウェアを起動しようとするとバリデーションで失敗する. そこで,ヘッダーをスキップして ITB の先頭アドレスを指定することで,バリデーションを回避して ITB を直接読み込ませる. また,この ITB には複数機種の Device Tree Blob (DTB) が記録されているため,AP-303 の DTB を読み込むように #Speyburn@1 を追加する. これで AP11 上で AP-303 のファームウェアを起動できる.なお,Uncompressing Kernel Image ... の段階で 20 ~ 30 秒ほどかかる.

apboot> bootm 0x84000200#Speyburn@1
Uncompressing Kernel Image ... OK
[    0.000000]
[    0.000000] Aruba Networks
[    0.000000] ArubaOS Version 8.8.0.1-8.8.0.1 (build 80393 / label #80393)
[    0.000000] Built by p4build@pr-hpn-build10 on 2021-06-02 at 04:10:32 UTC (gcc version 4.6.3)
[    0.000000]
[    0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d
[    0.016595] SMP: Total of 4 processors activated (384.00 BogoMIPS).
[    0.051336] i2c-gpio driver registered
[   15.818085] 3 ofpart partitions found on MTD device 7980000.qcom,nand
[   15.885099] Creating 3 MTD partitions on "7980000.qcom,nand":
[   15.953838] 0x000000000000-0x000002000000 : "aos0"
[   16.052979] 0x000002000000-0x000004000000 : "aos1"
[   16.139632] 0x000004000000-0x000008000000 : "ubifs"
[   16.275167] m25p80 spi0.0: found mx25r3235f, expected n25q128a11
[   16.374448] Found AT97SC3203 on MSM-I2C-v2-adapter
[   16.429747] Key type dns_resolver registered
[   16.470423] Registering SWP/SWPB emulation handler
[   17.799425] Watchdog run with TZ supported gpio reset
[   17.882119]
Starting Kernel SHA1 KAT ...
[   17.916584] Completed Kernel SHA1 KAT
[   17.963611] Starting Kernel HMAC-SHA1 KAT ...
[   18.013646] Starting Kernel DES KAT ...[   18.059366] Completed Kernel DES KAT
[   18.103125] Starting Kernel AES KAT ...
[   18.146845] Completed Kernel AES KAT
[   18.146845]
[   18.210372] Starting Kernel AESGCM KAT ...
[   18.257187] Completed Kernel AESGCM KAT
[   18.306450] Completed Kernel HMAC-SHA1 KAT
Thu Jan  1 00:00:00 PST 1970
Populate AP type info
Domain Name: SetMeUp.arubanetworks.com
Current OEM Name : Aruba Networks
Disabling ipv6 for devices by default
AP-type has_ble_support: ONBOARD.
IPv6 capability is supported for devices
No panic info available
Enabling UDMD via nanny
Writing /dev/ttyMSM1 into /tmp/ble_port
Enabling ble_daemon and ble_relay via nanny
glenmorangie: Start hotplug
Backup ENV.
Installing glenmorangie ethernet driver
[   29.635327] edma module_init
Enter non-FIPS mode
Cfg len is 0
Configuration file is empty, turning on default services...
extended ssid activate due to no AP config ...
The AP is in factory default status
Mesh enabled
single uplink platform
Starting watchdog process...
Aruba watchdog daemon started [4 thread(s)]
touching file /tmp/ip_mode_0
Enable IPv6 for the Conductor v6 discovery
Enabling DHCPv6 ...
Checking country code.
[   34.716084] bond0: GMAC Link is up with phy_speed=1000
Ethernet uplink active. Becoming Mesh Portal
Mesh is DISABLED on this device.
extended ssid is activated on the platform ...
copying bootuplog ...
[   35.420084] uol: module license 'Proprietary' taints kernel.
[   35.505878] Disabling lock debugging due to kernel taint
[   35.570611] uol_init_driver:425 HW offload not applicable, AP will use cutting through path!
allow PAPI
set device anul0 mtu to 2000
notify asap_mod 3g no present...
Enabling IPv6 for devices... IP mode is v4-only...
apdot1x authentication is not enabled
LLDP not sent yet, DHCP is waiting
LLDP not sent yet, DHCP is waiting
LLDP not sent yet, DHCP is waiting
Starting DHCP
Getting an IP address...
Jan  1 00:00:21 udhcpc[4028]: udhcpc (v0.9.9-pre) started
Jan  1 00:00:21 udhcpc[4028]: send_discover: pkt num 0, secs 0
Jan  1 00:00:21 udhcpc[4028]: Sending discover...
Jan  1 00:00:21 udhcpc[4028]: send_selecting: pkt num 0, secs 256
Jan  1 00:00:21 udhcpc[4028]: Sending select for 192.168.100.3...
Jan  1 00:00:21 udhcpc[4028]: Lease of 192.168.100.3 obtained, lease time 259200
[   40.752825] ip_time_handler: Got ip and packets on bond0 Started conductor election 9-0, rand 15
[   41.342239] (08:00:22) !!! Init ---> Member
192.168.100.3 255.255.255.0 192.168.100.1
Compressing all files in the /etc/httpd directory...
Done.
Starting Webserver
bind: Transport endpoint is not connected
bind: Transport endpoint is not connected
bind: Transport endpoint is not connected
Put ntpdate to the nannylist.
AP rebooted caused by cold HW reset(power loss)
shutting down watchdog process (nanny will restart it)...

        <<<<<       Welcome to the Access Point     >>>>>

Completed SW FIPS KAT test
Power supply mode is DC, USB Modem is not present.
User: [   74.710824] Starting Kernel HMAC SHA1 FIPS KAT ...
[   74.753629] Completed Kernel HMAC SHA1 FIPS KAT
[   76.712818] Starting Kernel HMAC SHA256 FIPS KAT ...
[   76.757692] Completed Kernel HMAC SHA256 FIPS KAT
ble_ready NOT present @init ....
[   78.720805] Starting Kernel HMAC SHA384 FIPS KAT ...
[   78.765709] Completed Kernel HMAC SHA384 FIPS KAT
[   80.720801] Starting Kernel HMAC SHA512 FIPS KAT ...
[   80.765694] Completed Kernel HMAC SHA512 FIPS KAT
[  119.763872] asap_send_elected_conductor: sent successfully
[  120.342730] asap_send_elected_conductor: sent successfully

2. Unified AP のファームウェアを書き込む

手動で Unified AP のファームウェアを起動することができたが,毎回ネットワークブートをするのも面倒なので,AP-303 のファームウェアを焼く. 手順としては単純で,Virtual Controller にログインしてファームウェアの更新を実行するだけでよい.

初回ログイン時,ユーザ名は admin,パスワードはシリアル番号を入力するとログインできる.

f:id:v2n:20210811184057p:plain
Aruba ファームウェアの更新画面

更新後,ファームウェアが更新されていることを確認する.今回は Partition 0 に Unified AP 向けイメージが書き込まれた.

f:id:v2n:20210811184327p:plain
Aruba ファームウェアバージョンの確認

APBoot で osinfo コマンドを用いると,保存されているイメージについてより詳細な情報が得られる.

apboot> osinfo
Partition 0:
    image type: 0
  machine type: 48
          size: 20670464
       version: 8.8.0.1-8.8.0.1
  build string: ArubaOS version 8.8.0.1-8.8.0.1 for Ursa (p4build@pr-hpn-build10) (gcc version 4.6.3) #80393 SMP Wed Jun 2 04:10:32 UTC 2021
         flags: Instant preserve 0020
           oem: aruba
Invalid Instant Small Business image

Partition 1:
    image type: 0
  machine type: 48
          size: 24924852
       version: 2.3.1.0
  build string: ArubaOS version 2.3.1.0 for Ursa (p4build@pr-hpn-build04) (gcc version 5.3.0) #80532 SMP Wed Jun 16 17:11:33 UTC 2021
         flags: Instant preserve SMB
           oem: smbap

Image is signed; verifying checksum... passed
SHA2 Signature available
Signer Cert OK
Policy Cert OK
RSA signature verified using SHA2.

3. ブートローダの設定を変更する

Unified AP のファームウェアを書き込んだだけでは,次回起動時にバリデーションで不正なイメージと判定され,バックアップパーティションから元の Instant On のファームウェアを読み込んで起動してしまう. そこで,以下のコマンドで起動時の自動実行コマンドを変更し,バリデーションを回避するようにブートローダの設定を変更する.

setenv bootcmd "ubi part aos\${os_partition}; ubi read 0x84000000 aos\${os_partition}; bootm 0x84000200#${boardname}@1"
saveenv
reset

まず,APBoot で起動時に自動実行されるコマンドが設定された環境変数 bootcmd を書き換え,設定を保存する.

apboot> setenv bootcmd "ubi part aos\${os_partition}; ubi read 0x84000000 aos\${os_partition}; bootm 0x84000200#${boardname}@1"
apboot> saveenv
Saving Environment to SPI Flash...
Erasing SPI flash...Writing to SPI flash...done

bootcmd が正しく変更できたか確認する.

apboot> printenv bootcmd
bootcmd=ubi part aos${os_partition}; ubi read 0x84000000 aos${os_partition}; bootm 0x84000200#Speyburn@1

APBoot を再起動し,Unified AP のファームウェア自動起動できることを確認する.

apboot> reset
resetting ...


APBoot 2.5.0.2 (build 70487)
Built: 2019-05-14 at 12:27:57

Model: AP11
DRAM:  512 MiB
Flash: Detected MX25R3235F: with write protection  total 4 MiB
NAND:  128 MiB
Power: DC
Net:   eth0
Radio: ipq4019#0, ipq4019#1
FIPS:  passed

Hit <Enter> to stop autoboot:  0
No size specified -> Using max size (30855168)
Uncompressing Kernel Image ... OK
[    0.000000]
[    0.000000] Aruba Networks
[    0.000000] ArubaOS Version 8.8.0.1-8.8.0.1 (build 80393 / label #80393)
[    0.000000] Built by p4build@pr-hpn-build10 on 2021-06-02 at 04:10:32 UTC (gcc version 4.6.3)
[    0.000000]
[    0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d

以上で Aruba Instant On AP11 を Aruba AP-303 Unified AP 化できた.

NVR500のDHCPサーバで静的割当と動的割当のレンジを分ける

YAMAHA NVR500 の DHCP サーバ機能において,同一ネットワーク内に静的割当用レンジと動的割当用レンジを分けて設定する方法についてのメモ.

ネットワーク内の一部アドレスを DHCP の静的割当用に予約したい場合,dhcp scope lease type SCOPE_NUM bind-only で静的割当のみの DHCP スコープを定義できる. 一方で動的割当を行う場合には, bind-priority を指定した DHCP スコープも必要となる. NVR500 では DHCP スコープを複数定義できるが,同一ネットワークに複数の DHCP スコープを定義できない. そのため,同一ネットワーク内に静的割当用スコープと動的割当用スコープのどちらも設定することは単純にはできない.

一つの DHCP スコープで静的割当と動的割当のレンジを分ける方法として,静的割当用のアドレスのすべてを dhcp scope bind で予約する方法がある. しかし,ダミーの割当コマンドを数十行以上設定することは,設定をする際もコンフィグを読む際にもしんどい気持ちになる.

そこで,同一ネットワーク内に静的割当用スコープと動的割当用スコープを設定する方法を考えた. ネットワーク内に複数の DHCP スコープを定義するためには,DHCPスコープのネットワークを,実際に運用しているネットワークのサブネットとすればよい. config の関連個所は以下のようになる.

ip lan1 address 192.168.100.1/24

dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope lease type 100 bind-only fallback=101
dhcp scope lease type 101 bind-priority
dhcp scope 100 192.168.100.2-192.168.100.126/25
dhcp scope 101 192.168.100.129-192.168.100.254/25
dhcp scope bind 100 192.168.100.2 ethernet 00:00:5e:00:53:00
dhcp scope option 100 subnet_mask=255.255.255.0 router=192.168.100.1 dns=192.168.100.1
dhcp scope option 101 subnet_mask=255.255.255.0 router=192.168.100.1 dns=192.168.100.1

LAN のネットワークは 192.168.100.0/24 だが, DHCP スコープを定義する際に 192.168.100.0/25192.168.100.128/25 の二つのサブネットに分けている. ただし,暗黙の DHCP オプションではサブネットマスクとして 255.255.255.128 が送られてしまうため,DHCP オプションを明示的に指定した. また,ネットワークアドレスとブロードキャストアドレスは DHCP の貸出用には使えないため, 192.168.100.127, 192.168.100.128 は除外される.

なお,最近の機器/ファームウェアの組み合わせでは,同一ネットワークに対し複数の DHCP スコープを定義できるため,リプレースも視野に入れたい.(RTX830, RTX1210, RTX1220, NVR510, NVR700W で対応.ノート参照.)

PAV-HMS220のファームウェア用パッチ

概要

PAV-HMS220 (Thecus N2810のOEM) のファームウェアイメージに対して,以下の修正を行うスクリプトを作成した.

  • ダウングレードを可能にする
    • ファームウェアイメージのバージョン情報を v3.99.99.9 に書き換え,アップグレードに見せかける
    • ダウングレード後は正しいバージョン情報が表示される
  • 他機種用FWの流用を可能にする
    • ファームウェアイメージの機種情報を書き換える
    • 更新後は他機種の情報に書き換わってしまうが,元に戻すことも可能

誤ったFWを書き込むと動作しなくなる場合があるので注意.必ず/dev/mmcblk0のダンプを取得してから行うこと.

ファームウェアイメージのダウンロード用リンク

patch.sh

このファイルはNAS上で実行する.詳細な手順は次のセクションに示す.

#!/bin/bash

if [ ! -f "$1" ]; then
  echo No input file.
  exit 1
fi

set -e

INPUT="$(cd $(dirname $1) && pwd)/$(basename $1)"
OUTPUT="${INPUT}-patched"
FWCONFIG="/img/fwconfig"

. ${FWCONFIG}

cd /tmp

echo decrypt.
/usr/bin/des -k ${DESKEY} -D ${INPUT} upgrade.tar.gz

echo unpack.
tar zxf upgrade.tar.gz
rm upgrade.tar.gz

echo patch.
cp /etc/manifest.txt upgrade/manifest.txt
echo "3.99.99.9.k401" > upgrade/version

echo repack.
tar zcf upgrade.tar.gz upgrade/
rm -rf upgrade/

echo encrypt.
/usr/bin/des -k ${DESKEY} -E upgrade.tar.gz ${OUTPUT}
rm upgrade.tar.gz

echo complete.

使い方

  • patch.shファームウェアイメージをNASNAS_Publicフォルダに保存する.
    • 説明ではファームウェアイメージは Princeton_x86_64_FW.3.01.04.4.k401 とする.別のものを使用する場合は適宜読み替えること.
      f:id:v2n:20210124010110p:plain
  • rootでシェルを起動する (パスワードはWebGUIのadminと同一)
    • SSHサービスを有効にしておきSSHでアクセスするか,Ctrl+Alt+F2でテキストコンソールを開く
  • cd /raid/NAS_Public/
  • cp /etc/manifest.txt .
  • ./patch.sh Princeton_x86_64_FW.3.01.04.4.k401
    • 処理には1分ほど時間がかかる
  • 完了すると,NAS_PublicフォルダにPrinceton_x86_64_FW.3.01.04.4.k401-patchedが保存されている.このファイルをアップデートに使用する.
    • 更新画面ではバージョン番号が3.99.99.9となるが,アップデート後は正しいバージョン番号が表示される.
      f:id:v2n:20210124010308p:plain

メモ

  • ファームウェアの展開
    • DESで暗号化されており,暗号化/復号にはdesコマンドを用いる
      • バージョンを確認するとdes(1) built with libdes v 3.24 - 20-Apr-1996 - eayと表示される.Eric Andrew Youngが作ったlibdesのdesコマンドだと思われる.
      • 鍵は/img/fwconfigに記載されている.
    • 復号されたファイルはgzipで圧縮されたtarballなので,tarで展開できる

プリンストンのNASキット PAV-HMS220を買った

プリンストンの2ベイ NASキットであるPAV-HMS220を買った.
NTT-X Storeで19,800円 (税込, 会員割引価格) と,x86_64なCPUが載ったNASキットとしては安価だった.

nttxstore.jp

PAV-HMS220の概要

  • NASキット
  • 3.5インチリムーバブルベイ 2基搭載
  • Thecus N2810 v2のOEM
  • 主なスペック
    • Intel Celeron N3060 (2コア, 2スレッド, 1.60 GHz, ブースト時 2.48 GHz)
    • DDR3L-1600 SO-DIMM 2GB搭載 (1スロット)
    • eMMC 4GB (ファームウェア用)
    • Thecus OS 7搭載 (Linuxベース, HDMI接続時にKodiが利用可能)
    • USB 3.0 * 3ポート,GbE LAN * 2ポート,HDMIポートなど
  • 中身は普通のPCに近い
    • 起動時にDeleteキーを入力するとBIOSに入れる
    • 内蔵HDDやUSBメモリにインストールされたOSから起動可能
    • ブートモードはデフォルトでLegacy BIOSUEFIモードも可能

分解

箱に分解しろと書いてあったので分解した.

  • 内部に2.5インチのストレージを搭載できそうだが,接続できる空きポートは無い
  • SO-DIMMスロットが1スロットあり,たぶん8GBまで増設できる (DDR3Lのみ対応?)
  • NASにありがちな,PCIeスロット風のHDDライザースロット

  • Network ControllerはIntel I210-AT
  • eMMCはSamsung KLM4G1FEPD (4GB)
  • PCIe to SATA Controllerが載りそうな空きランドがある
    • ASM1061が載りそうな気がする

  • ファンの回転数
    • BIOS起動時は800rpmくらい
    • Thecus OS起動後は低速/中速/全速 (800rpm/2500rpm/3500rpm) と自動選択で選べる
    • デフォルトは中速だが,常時起動するデバイスとしてはうるさい

小ネタ

  • KodiでMetaキーを入力するとIceWMのメニューが出る
  • WebUIから管理パスワード(admin)を変更するとrootのパスワードも変更される
    • Ctrl+Alt+F2などでコンソールに落ちた後,設定したパスワードを使いrootでログインできる
    • SSHサービスを有効にすると,SSHでrootにログインできる
  • eMMC
    • /dev/mmcblk0 3728MiB
    • /dev/mmcblk0boot{0,1}が見える.容量はそれぞれ4MiBずつ

Thecus N2810化

(追記) ファームウェア更新用イメージにパッチを当てることで,バージョンに関係なくN2810化できるようになった.
詳細は以下の記事を参照.
v2n.hatenablog.com

旧情報

ベースモデルであるThecus N2810 (v2)のファームウェアを書き込める.
ただし,元に戻すときには/dev/mmcblk0のダンプを焼き直す必要がある.
また,この手順は購入時のファームウェア (3.01.00.4.3.k401) で確認したが,より新しいファームウェアでは実行できないかもしれない.
(追記) 3.02.02.4.k401へアップデートした後では,この手順は実行できない.

Thecus N2810化した後に,同様の手順でPAV-HMS220化はできない.
(ファームウェアチェックのタイミングが変更されており,チェックを通過できない)

N8103-150でJBODを有効にする

NEC Express5800/R120d-2EにFreeNASを導入するにあたり,N8103-150のRAID機能が邪魔なのでJBODを有効にした.

  • Type: N8103-150
    • 搭載チップ: LSI SAS 2208
    • LSI MegaRAID SAS 9267-8i (なぜか情報がない)
    • 512MB cache
    • PCIe 2.0 x8 lanes
    • SATA 3.0/SAS 2.0対応 (6Gbps)

MegaCliはscpを用いてFreeNAS機へ転送した.

root@freenas[~]# chmod a+x MegaCli64
root@freenas[~]# ./MegaCli64 -AdpGetProp EnableJBoD -aALL

Adapter 0: JBOD: Disabled

Exit Code: 0x00
root@freenas[~]# ./MegaCli64 -AdpSetProp EnableJBoD -1 -aALL

Adapter 0: Set JBOD to Enable success.

Exit Code: 0x00
root@freenas[~]# ./MegaCli64 -AdpGetProp EnableJBoD -aALL

Adapter 0: JBOD: Enabled

Exit Code: 0x00
root@freenas[~]#

とりあえず再起動したらJBODが有効になっており,構成していないディスクも見えるようになった.

read-only root over NFS v4 + overlayfs使用時の問題と対策

NFSで提供されたread-only rootにtmpfsをoverlayすることで,同一のrootfsを複数のserverで共有できる.
この環境を構築する際に生じた問題とその対策をまとめた.

環境

  • OS: CentOS Linux release 8.1.1911 (Core)
  • Kernel: 4.18.0-147.5.1.el8_1.x86_64
  • overlayfsを使用
    • lower = read-only root over NFS v4
    • upper = tmpfs

lowerdirの内容を変更するとESTALEが生じる

そもそもoverlayfsではlowerへの変更は許容されないことがKernel-docに記載されている.

https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt

Changes to the underlying filesystems while part of a mounted overlay
filesystem are not allowed.  If the underlying filesystem is changed,
the behavior of the overlay is undefined, though it will not result in
a crash or deadlock.

しかし,稼働中のrootfsへ変更を加えることができると便利なので,変更を許容してほしい.

patchworkにそのような要望を叶えるpatchが投稿されており,これを適用すればよい.

patchwork.kernel.org

(上記パッチは微妙に壊れているので,書き直した)

diff -ru linux-4.18.0-147.5.1.el8.x86_64/fs/overlayfs/super.c linux-4.18.0-147.5.1.el8.x86_64.new/fs/overlayfs/super.c
--- linux-4.18.0-147.5.1.el8.x86_64/fs/overlayfs/super.c        2020-01-14 23:54:17.000000000 +0900
+++ linux-4.18.0-147.5.1.el8.x86_64.new/fs/overlayfs/super.c    2020-03-02 04:29:36.855735623 +0900
@@ -127,16 +127,11 @@

                if (d->d_flags & DCACHE_OP_REVALIDATE) {
                        ret = d->d_op->d_revalidate(d, flags);
-                       if (ret < 0)
+                       if (ret <= 0)
                                return ret;
-                       if (!ret) {
-                               if (!(flags & LOOKUP_RCU))
-                                       d_invalidate(d);
-                               return -ESTALE;
-                       }
                }
        }
-       return 1;
+       return ret;
 }

 static int ovl_dentry_weak_revalidate(struct dentry *dentry, unsigned int flags)

NFS v4を用いるとサブディレクトリ以下への書き込みでEOPNOTSUPPが生じる

NFS v4ではACLをサポートしているが,この属性情報(xattr)を含むmetadataをlowerからupperへコピーする際,ACL名前空間が異なるためコピーに失敗し,EOPNOTSUPPが生じる.

詳しい情報は以下のサイトに記載されている.

blog.fai-project.org

この問題へのいくつかの対策法を以下に示す

  • export元のfsのACLを無効にする (NFSv4のACLが無効になる)
  • NFS v3を使う
  • overlayモジュールのload時,またはマウントオプションで"metacopy=off"を指定する (未検証)
  • metadataのcopy時にEOPNOTSUPPを無視するパッチ(以下)を当てる
    • カーネルを弄らなくても解決できるので,これ以外の解決方法 (上の三つ) を取るべきだと思う
diff -ru linux-4.18.0-147.5.1.el8.x86_64/fs/overlayfs/copy_up.c linux-4.18.0-147.5.1.el8.x86_64.new/fs/overlayfs/copy_up.c
--- linux-4.18.0-147.5.1.el8.x86_64/fs/overlayfs/copy_up.c      2020-01-14 23:54:17.000000000 +0900
+++ linux-4.18.0-147.5.1.el8.x86_64.new/fs/overlayfs/copy_up.c  2020-03-02 04:21:37.701624976 +0900
@@ -110,6 +110,10 @@
                        continue; /* Discard */
                }
                error = vfs_setxattr(new, name, value, size, 0);
+               if (error == -EOPNOTSUPP) {
+                       error = 0;
+                       continue;
+               }
                if (error)
                        break;
        }

CentOS 8 ネットワークブート環境の構築

研究室の計算用サーバでCentOS 7をネットワークブート(PXEブート)させて使用していますが、 CentOS 8へ更新し再構築をするため、ネットワークブート環境の構築手順をメモしたのでついでに公開します。

CentOS 7との違い

sshd用の鍵生成を行うコマンドが/usr/sbin/sshd-keygenから/usr/libexec/openssh/sshd-keygenに変わりました。また、暗号化方式ごとに生成コマンドを実行する必要があります。

諸注意

  • ブート用サーバもCentOS 8を使用します。
  • ブート用サーバはSELinux, Firewallはどちらも無効化しています。必要に応じて有効化してください。
  • クライアント用rootfsはreadonlyとしています。
    • 一応起動できますが、var以下に書き込めないためエラーが生じます。
    • 研究室ではoverlayfsを用いて一部ディレクトリの上にtmpfsを重ねることで問題を回避しています。
    • readonly-rootパッケージを用いて対策することも可能だと思います。
  • とりあえず起動できる状態までの手順です。必要に応じてカスタムしてください。

クライアント用rootfsの構築

# 初期化
rpm --root /srv/client/rootfs --initdb
dnf -y --downloadonly --downloaddir=`pwd` reinstall centos-release
rpm --root /srv/client/rootfs -ivh --nodeps centos-release-*.rpm
dnf -y --installroot /srv/client/rootfs reinstall centos-release

# 各パッケージのインストール
dnf -y --installroot /srv/client/rootfs groupinstall "Server"
dnf -y --installroot /srv/client/rootfs install nfs-utils kernel

# uid/gidの修正 (rpmのバグでクライアント用rootfsのuid/gidがサーバ側のユーザ情報を元に設定される問題へのワークアラウンド)
chroot /srv/client/rootfs bash -c "rpm -aq | xargs rpm --setugids"

# SELinuxの無効化 (石川さんごめんなさい)
sed -i -e 's/^SELINUX=.*$/SELINUX=disabled/g' /srv/client/rootfs/etc/selinux/config
# 鍵生成
chroot /srv/client/rootfs /usr/libexec/openssh/sshd-keygen rsa
chroot /srv/client/rootfs /usr/libexec/openssh/sshd-keygen ecdsa
chroot /srv/client/rootfs /usr/libexec/openssh/sshd-keygen ed25519
# /tmp のRAMDISK化
chroot /srv/client/rootfs systemctl enable tmp.mount
# パスワードの設定
chroot /srv/client/rootfs passwd root

PXEブートのためのDHCP, TFTPサーバ構築

事前にclient用LAN向けIPを192.168.11.1/24と設定しておく。

# Dnsmasq (DNS, DHCPやTFTPのサーバ), PXELINUX (SYSLINUX)
dnf install dnsmasq syslinux

# TFTP用フォルダの作成
mkdir -p /srv/client/tftp/pxelinux.cfg
# PXELINUXをtftp用フォルダにコピー
cp /usr/share/syslinux/{pxelinux.0,ldlinux.c32,menu.c32,libutil.c32} /srv/client/tftp/

# Dnsmasqの設定
cat > /etc/dnsmasq.d/tftp.conf << EOS
# dhcp
listen-address=192.168.11.1
dhcp-range=192.168.11.2,192.168.11.128,24h

# tftp
enable-tftp
tftp-root=/srv/client/tftp
dhcp-boot=pxelinux.0
EOS

# PXELINUXのブート設定
cat > /srv/client/tftp/pxelinux.cfg/default << EOS
UI menu.c32
PROMPT 0

TIMEOUT 50
DEFAULT linux

LABEL linux
        MENU LABEL Linux
        LINUX vmlinuz
        APPEND root=nfs:192.168.11.1:/srv/client/rootfs,vers=4.2 ro
        INITRD initramfs-pxeboot.img
EOS

# カーネルのコピー
cp /srv/client/rootfs/boot/vmlinuz-* /srv/client/tftp/vmlinuz

# initramfsの生成 (カーネルのバージョンについては適時修正)
mount --bind /proc /srv/client/rootfs/proc
# クライアントのハードウェア構成によってはネットワークデバイスのドライバ追加が必要 (--add-drivers igb など)
chroot /srv/client/rootfs dracut --force --add nfs /boot/initramfs-pxeboot.img 4.18.0-147.5.1.el8_1.x86_64
umount /srv/client/rootfs/proc

cp /srv/client/rootfs/boot/initramfs-pxeboot.img /srv/client/tftp/
chmod a+r /srv/client/tftp/initramfs-pxeboot.img

rootfs公開用NFSサーバの設定

dnf -y install nfs-utils

echo '/srv/client/rootfs 192.168.11.0/24(ro,async,no_root_squash)' >> /etc/exports
echo 'RPCNFSDARGS="-V 4.2"' >> /etc/sysconfig/nfs
systemctl enable --now rpcbind
systemctl enable --now nfs-server

更新履歴

  • (2020/02/25) dracutによるinitramfs生成時には/devのマウントは必要ないため削除しました.
  • (2020/02/26) centos-releaseのreinstallを追加.uid/gidの修正を追加.