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
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 はキツイので。
ストレージを傷めにくいようにメモリ展開で動くので、、SquashFSとBusyBoxで動く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