それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

raspberry pi zero にUSB-LANを繋いでOpenWrtを動かす。

pi-zero で open wrt を使う

pi-zero で open wrt の入ったSDカードを使う。

Raspberry Pi で OpenWrt を使うには。

公式サイトに専用ページが設けられている。

https://openwrt.org/toh/raspberry_pi_foundation/raspberry_pi

pi Zero + OpenWrt を使う場合の注意点

有線ネットワーク接続で困る。

USB-LANのドライバが必要になるので、opkg を使ってインストールする必要がある。

ドライバの導入

ドライバは個別に導入する必要があり、依存関係を踏まえて、ダウンロードとインストールを自分で行う。

手元の USB-LAN はAX88179 だったので該当のドライバを探してきて、USBで繋いでインストール、という手順を踏む必要があった。

ドライバのダウンロード

ドライバは、個別にダウンロードする。

公式サイトの該当バージョンから取得する。今回は、raspi zero (bcm2708)の 220.0.5 を使ったので、ドライバは、同サイトのパッケージから取得する。

factory と書かれたのがインストールのイメージ。

そのしたの、kmod / package にドライバが有る。(パッケージでも見れるし、kmod でも見れる)

今回必要だったドライバは、AX88 だった(これは、USBを挿したときにHDMI経由で画面に出力されるUSB機器名称から調べた。)

kmod-usb-net-asix-ax88179

kmod-usb-net-asix-ax88179を入れるのに、次のパッケージが要求された。

kmod-libphy

ダウンロードしたパッケージは次の通り。

kmod-libphy_5.10.176-1_arm_arm1176jzf-s_vfp.ipk
kmod-usb-net-asix-ax88179_5.10.176-1_arm_arm1176jzf-s_vfp.ipk

USBストレージに入れてインストール

ダウンロードしたドライバのipk をUSBストレージに入れて、マウントして取り出し

mount /dev/sda /mnt
cd /mnt

opkg コマンドでインストールしてやる。

opkg install kmod-libphy_5.10.176-1_arm_arm1176jzf-s_vfp.ipk
opkg install kmod-usb-net-asix-ax88179_5.10.176-1_arm_arm1176jzf-s_vfp.ipk

これで、eth0 が認識され、br-lanが生えてくるはずである。

Realtek の場合

USBーLANは他にも在庫があるため、他の機器についても調べておいた。

REALTEKのUSB-ネットワークは、次のパッケージが必要だった。

kmod-usb-net-cdc-ncm
kmod-usb-net
kmod-usb-net-cdc-ether
kmod-usb-net-rtl8152

あとは通常のLinuxの通り

とりあえず、ネットワークに出られるようにする

echo 1.1.1.1 > /etc/resolv.conf
ip addr add 192.168.1.10 dev br-lan
ping  -c 1 192.168.1.1
ip route add default via 192.168.1.1 dev br-lan

ネットワーク出られるようにしたら、あとはopkg でインストールが終わると思う。

opkg と wget がエラーになる

SSL証明書が検証されないとか、IPv6が壊れたフレッツ網の場合、ネットワークに出られない。

wget 関連のエラーでopkg が動かないときは、ちょっとだけトリッキーな方法を使うと良い。

wget のエラーが回避できることを確認

alias wget='wget -4 --no-check-certificate '
wget https://g.co

wget を一時的にスクリプトに変える。

mv /usr/bin/wget /usr/bin/wget.orig

cat <<EOF > /usr/bin/wget
#!/bin/sh
/usr/bin/wget.orig  -4 --no-check-certificate \$@
EOF

chmod +x /usr/bin/wget

wget をインストールする。(証明書エラーの場合はCa-bundleを入れ直すと解決する)

opkg update
opkg install ca-bundle  --force-reinstall
opkg install ca-certificates  --force-reinstall
rm /usr/bin/wget 
mv /usr/bin/wget.orig /usr/bin/wget 
opkg install wget-ssl --force-reinstall

なぜか、22.03.5 はwget で証明書エラーがでたので注意が必要です。

無事に動く

これで、Raspberry Pi Zero ( usb イーサネット アダプタ)で、OpenWrtが動くSDカードを作れた。

SDカードは寿命が早いと、非力なPi Zeroでubuntu はキツイので。

ストレージを傷めにくいようにメモリ展開で動くので、、SquashFSBusyBoxで動くOpenWrtはいい選択肢じゃないかと思う。

squash fs のリサイズ

OpenWrt のSquashFSをリサイズすることもできる。初期設定だと100Mなので、勿体ない。MicroSDは2023-07-27現在では16GB未満のものが入手しづらいので、15GBが余ってしまう。

SquashFSのリサイズは、意外と簡単で、通常のgdisk(fdisk)のリサイズのあとに、resize2fsを書けてあげるだけである。 ただし、loopデバイスにマウントする必要がある。

適当なLinuxでSDカードを接続し、

lsblk

fdisk などでリサイズ

fdisk /dev/sdd

このとき、signature を維持する

Do you want to remove the signature? [Y]es/[N]o: n

あとは、SDカードを起動してresize2fs をすればいい

resize2fs overlay

または、loopデバイスに繋いで

resize2fs /dev/loop10 

などとresizeを書けてあげるだけである。これでMicroSDをフルに使い切れるOpenWrtをSquashFSなオーバーレイで作ることができる。

詳しくは、公式に記載がある

https://openwrt.org/docs/guide-user/installation/installation_methods/sd_card

Expanding the filesystem To use the whole available space of your sdcard, you probably have to resize your partition.

squashfs image As with mounting the overlay above, to resize it you'll need the offset of the hidden f2fs or ext4 filesystem (depending on the size of your image, one or the other will be used).

First, make sure the partition is not mounted, then do something like:

DEVICE= ### Set this appropriately - e.g. /dev/sda
PARTITION="$DEVICE"2
sudo cfdisk "$DEVICE"  # select resize, then write

# Create a loop device pointing to the FS
# See libfstools/rootdisk.c for source of partition offset logic.
FS_SIZE="$(sudo unsquashfs -s "$PARTITION" | grep -o 'Filesystem size [0-9]* bytes' | grep -o '[0-9][0-9]*')"
FS_OFFSET="$(expr '(' "$FS_SIZE" + 65535 ')' / 65536 '*' 65536)" 
LOOP_DEVICE="$(sudo losetup -f --show -o "$FS_OFFSET" "$PARTITION")"

# Now, resize... you may need to fsck first, though.
sudo fsck "$LOOP_DEVICE"
sudo resize2fs "$LOOP_DEVICE"

また、実際に試した人たちのレポートがForumに投稿されている

https://forum.openwrt.org/t/expanding-openwrt-squashfs-image-sdcard/107711