NanoPi R2S上で動かしている OpenWrt のDynamic DNSサービスが動かなくなってしまいました。原因は BusyBox の アプレット が一部 消え てしまい、grepコマンドが使えなくなったためと分かり、パッケージファイルをダウンロードして手動で修復しました。
DDNSサービスが動かない
自宅のセカンダリルータ FriendlyElec NanoPi R2S OpenWrtで設定しているはずのDynamic DNSサービスが数日コケたままになっていました。
システム再起動後、自動起動に失敗していることはよくあるも、今回は手動起動もできないのでログを確認すると、
1 2 3 |
user.notice ddns-scripts[7295]: myddns_ipv4: PID '7295' started at 2023-12-27 11:36 user.warn ddns-scripts[7295]: myddns_ipv4: Custom update_script not found! - TERMINATE user.warn ddns-scripts[7295]: myddns_ipv4: PID '7295' exit WITH ERROR '1' at 2023-12-27 11:36 |
grepがいないエラー
このログだけではよく分からないので、DDNSスクリプトを直接動かしてみてその原因が判明。 grep が使えません。
1 2 |
root@R2S:~# /usr/lib/ddns/dynamic_dns_updater.sh: line 359: grep: not found 114623 WARN : Custom update_script not found! - TERMINATE |
そう言えば、ターミナルログイン時にも、同じエラーが挙がっていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
~$ ssh root@R2S.lan root@R2S.lan's password: _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ----------------------------------------------------- OpenWrt 21.02.2, r16495-bf0c965af0 ----------------------------------------------------- -bash: fgrep: command not found -bash: grep: command not found -bash: grep: command not found root@R2S:~# |
BusyBoxパッケージの再インストールは怖い
OpenWrtにおける grep はBusyBoxのアプレットであり、そのBusyBoxはOpenWrtの基本パッケージの一つに当たるため、これを再インストールしようとすると次のような警告を受けてしまいます。
1 2 3 4 5 6 7 |
root@R2S:~# opkg install --force-reinstall busybox Refusing to remove essential package busybox. Removing an essential package may lead to an unusable system, but if you enjoy that kind of pain, you can force opkg to proceed against its will with the option: --force-removal-of-essential-packages No packages removed. Package busybox (1.33.2-2) installed in root is up to date. |
インストール前のアンインストール後、インストール作業が正しく実行されるか疑わしいことから、パッケージマネージャによる再インストールは断念。
ダウンロードしたパッケージから手作業で修復
また、OpenWrtに入っているBusyBoxはかなりミニマム仕様でビルドしてあるのか、サポートされるコマンド一覧が得られないほか、アプレットのシンボリック・リンクを生成するオプションも実装されていません。
1 2 3 4 5 |
root@R2S:~# busybox busybox: applet not found root@R2S:~# busybox --install -s /root/test -install: applet not found |
そこで、レポジトリから直接パッケージをダウンロードして、中身を確認してみます。
BusyBoxは base レポジトリに収録されており、そのURLはOPKG Configurationで得られます。
レポジトリURLをブラウザで開いて、BosyBoxの ipk パッケージファイルをUbuntuデスクトップPCにダウンロード。
ダウンロードした ipk ファイルは単なる圧縮ファイルなので、アーカイブマネージャでその中にある data.tar.gz を開きます。
1 2 3 4 |
$ tar -tf busybox_1.33.2-2_aarch64_generic.ipk.tar.gz ./debian-binary ./data.tar.gz ./control.tar.gz |
その ./bin の中に、BusyBoxとそのアプレット群のシンボリック・リンクが揃っているので、これをNanoPi R2Sと比較。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
./bin ├── ash -> busybox ├── busybox ├── cat -> busybox ├── chgrp -> busybox ├── chmod -> busybox ├── chown -> busybox ├── cp -> busybox ├── date -> busybox ├── dd -> busybox ├── df -> busybox ├── dmesg -> busybox ├── echo -> busybox ├── egrep -> busybox ├── false -> busybox ├── fgrep -> busybox ├── fsync -> busybox ├── grep -> busybox ├── gunzip -> busybox ├── gzip -> busybox ├── kill -> busybox ├── ln -> busybox ├── lock -> busybox ├── login -> busybox ├── ls -> busybox ├── mkdir -> busybox ├── mknod -> busybox ├── mktemp -> busybox ├── mount -> busybox ├── mv -> busybox ├── netmsg -> busybox ├── netstat -> busybox ├── nice -> busybox ├── passwd -> busybox ├── pidof -> busybox ├── ping -> busybox ├── ping6 -> busybox ├── ps -> busybox ├── pwd -> busybox ├── rm -> busybox ├── rmdir -> busybox ├── sed -> busybox ├── sh -> busybox ├── sleep -> busybox ├── sync -> busybox ├── tar -> busybox ├── touch -> busybox ├── traceroute -> busybox ├── traceroute6 -> busybox ├── true -> busybox ├── umount -> busybox ├── uname -> busybox ├── vi -> busybox └── zcat -> busybox 53 files |
消えてしまっているシンボリック・リンクは、次の2つであることが判明。
1 2 |
lrwxrwxrwx 1 user user 7 Jan 3 2022 bin/fgrep -> busybox lrwxrwxrwx 1 user user 7 Jan 3 2022 bin/grep -> busybox |
これをネットワーク越しに scp でコピーするだけと思ったら、BusyBoxバイナリがシンボリック・リンク名でコピーされてしまいました。
1 2 3 4 5 6 7 |
root@R2S:~# ll /bin/busybox -rwxr-xr-x 1 root root 421921 Feb 17 2022 busybox* root@R2S:~# ll /bin/*grep lrwxrwxrwx 1 root root 7 Feb 17 2022 egrep -> busybox* -rwxr-xr-x 1 root root 421921 Jan 3 2022 fgrep* -rwxr-xr-x 1 root root 421921 Jan 3 2022 grep* |
ここまできたら、もう ln コマンドでシンボリック・リンクを貼り直せば済むのでしょうが、シンボリック・リンクをシンボリック・リンクのままコピーするにはどうすればいいのか知りたくて、こちらのフォーラム回答に載っていたワンライナーを試してみました。
1 2 3 4 |
$ tar -c bin/fgrep | ssh root@R2S.lan 'tar -xC /bin' root@R2S.lan's password: $ tar -c bin/grep | ssh root@R2S.lan 'tar -xC /bin' root@R2S.lan's password: |
NanoPi R2S側には、シンボリック・リンクのままコピーされました。
1 2 3 4 |
root@R2S:~# ll /bin/*grep lrwxrwxrwx 1 root root 7 Feb 17 2022 /bin/egrep -> busybox* lrwxrwxrwx 1 root root 7 Dec 27 13:21 /bin/fgrep -> busybox* lrwxrwxrwx 1 root root 7 Dec 27 13:21 /bin/grep -> busybox* |
タイムスタンプが他と異なるのが気持ち悪いものの、シンボリック・リンクのタイムスタンプは touch で触れないことや、解凍時にタイムスタンプを保持する tar -p オプションが未サポートなことから、悪あがきはここまで。
最後に、 grep が使えることを確認。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
root@R2S:~# grep BusyBox v1.33.2 (2023-04-27 21:08:19 UTC) multi-call binary. Usage: grep [-HhnlLoqvsrRiwFE] [-m N] [-A/B/C N] PATTERN/-e PATTERN.../-f FILE [FILE]... Search for PATTERN in FILEs (or stdin) -H Add 'filename:' prefix -h Do not add 'filename:' prefix -n Add 'line_no:' prefix -l Show only names of files that match -L Show only names of files that don't match -c Show only count of matching lines -o Show only the matching part of line -q Quiet. Return 0 if PATTERN is found, 1 otherwise -v Select non-matching lines -s Suppress open and read errors -r Recurse -R Recurse and dereference symlinks -i Ignore case -w Match whole words only -x Match whole lines only -F PATTERN is a literal (not regexp) -E PATTERN is an extended regexp -m N Match up to N times per file -A N Print N lines of trailing context -B N Print N lines of leading context -C N Same as '-A N -B N' -e PTRN Pattern to match -f FILE Read pattern from file |
コケていたDDNSサービスも、正常に動作するようになりました。
そもそも、BusyBoxアプレットの一部リンクが消えてしまったのは、おそらくNanoPi R2Sのシステムが入ったSDカードメディアがそろそろ寿命なのかと。以前にもファイルシステム障害に見舞われたこともあるので、メディアを入れ替えるつもりです。