openwrt のアップグレード
アップグレードは、バックアップを取って新しいOSを書き込んで再起動する。バックアップを書き戻せばば良い。
ただし、以下の点に注意する。
- /etc/config 以下がバックアップされる
- opkg は再現されない。
/etc/passed
はバックアップされる。/bin/bash
は喪失する
事前準備(シェル)
rootのログインシェルを/bin/ash
以外のbashなどへ書き換えていると、SSHログインが再起不能になるので注意する。
chsh -s /bin/ash
事前準備(DNS・FW)
adguard などのDNS設定が入ってるとき、DNSサーバーをひけなくなる。wrt自身がどこを参照しているか確認。またwrt自体でFWを組んでいる場合はFW通信の疎通をちゃんと確認する。
cat /etc/resolv.conf cat /etc/config/dhcp
手順1 opkgの保存
opkg 状態を再現するスクリプトがあるので、これを使ってopkg状態を保存する
curl -LJO https://raw.githubusercontent.com/richb-hanover/OpenWrtScripts/main/opkgscript.sh chmod +x opkgscript.sh ./opkgscript.sh write /etc/config/opkg.installed
手順2 バックアップ確認・作成
ssh経由で、以下のコマンドで、バックアップ対象のファイルが確認できる。
sysupgrade -l
バックアップ対象を追加するには、コマンドで追加できる。
## 保存するファイルの追加 echo path/to/config >> /etc/sysupgrade.conf ## 保存するファイルの確認 sysupgrade -l
必要に応じて、hotplugなどに配置したファイルもバックアップ対象に含める。
## 追加例 echo /etc/init.d/sslh >> /etc/sysupgrade.conf ## 私はsymbolic linkで配備しているので、findコマンドから find /etc/hotplug.d/ -type l >> sysupgrade.conf find /etc/init.d/ -type l >> sysupgrade.conf
バックアップの作成
sysupgrade --create-backup $HOSTNAME-$( date -I ).tgz
バックアップ保存(scpやrsync、またはusbをマウントして)
scp $HOSTNAME-$( date -I ).tgz takuya@myserver:~/
バックアップ作成だけはWEB画面(luci)の専用ページ画面からもできる。コマンド経由(sysupgrade) よりも WEB-UI(luci)からやるのが楽ちん。ただし、バックアップ対象カスタマイズはコマンド経由で行う。
コマンド経由で行うと、次手順のアップグレードもコマンド経由で行うことができて便利。
手順3 アップグレードの開始。
イメージ配布サイトから、自分のCPUモデルにマッチするイメージのURLを探し出して、アップグレードを開始する。
URL=https://downloads.openwrt.org/releases/22.03.3/targets/x86/64/openwrt-22.03.3-x86-64-generic-ext4-combined.img.gz sysupgrade --test -f $HOSTNAME-$( date -I ).tgz -v $URL ## The point of NO return sysupgrade -f $HOSTNAME-$( date -I ).tgz-v $URL ## wait for reboot
私は、ext4 の MBRを使っているので、ext4-combined(bootとext4)を選んだ。最近だとEFIだと思う。squashfs はopenwrtの非x86でよく使うファイルシステムで、squashfs版は、再起動すると設定以外は全部消える。つまりramfsに載せるタイプである。これを選ぶと容量使わないしSSDも消費しないので便利だと思う。ただ私は、x86_64仮想マシンで動かしているしディスク容量も潤沢にあるのでext4でいいかと思ってる。
手順4 容量の確認とopkg の再インストール
opkg の再インストールをする。ただし焦ってインストールしてはいけない。
アップグレードは、imgをddされるだけなので、領域容量がデフォルト・サイズに書換わってる。この状態でインストールするとopkg install が容量不足になり、中途半端なインストール状態となり再起不能になる可能性がある。
現在のパーティションサイズを確認。
mount df lsblk
パーティションサイズが100M前後では、かなり心許ない。ip-fullやvim-fullerやiptablesを使ってるなら200Mはほしいところ。
仮想マシンを停止してイメージを操作しディスク容量を増量する。
無事に起動したことを確認後、シャットダウン
virsh shutdown OpenWrt sleep 20 virsh list --all
ディスク・イメージの場所を確認
## ストレージを確認 virsh domblklist OpenWrt
ディスクイメージを操作
sudo losetup -P -f /var/lib/libvirt/images/openwrt-x86-64-combined-ext4.img sudo fdisk /dev/loop22 sudo resize2fs /dev/loop22p2 sudo losetup -d /dev/loop22 ## memo qcow2であればnbdを経由する sudo qemu-nbd --connect=/dev/nbd0 /var/lib/libvirt/images/openwrt-x86-64-combined-ext4.qcow2
ディスク容量を確保したら、opkgの復元
./opkgscript.sh install /etc/config/opkg.installed
22.03 にアップグレードしたときに、発生した問題。
- iptablesのsocket モジュールが行方不明になった。
- opkg install 時に、unboundが未インストールのために、名前解決ができなかった
- /etc/passwd で /bin/bashに変えていたのでログイン不可になった
- ddns関連の設定が飛んでいた。
- ipset 関連がopkg未インストールのためにエラーで死んでiptablesがエラーになっていた。
- fw3 → fw4 に変わったので
/etc/config/firewall
に一部互換性がなくなった。
unboundが未インストールでunboundをインストールできない問題、気づかずに焦った。PPPoEが接続されてないのかネットワークのトラブルなのか、すごく悩んだけど、/etc/resolve.confを書き換えで解決した。
2204 にアップグレードしたときに発生した問題点
ddns の設定が変わっていて dynamic dns が全部死んだ。
ddns はスクリプトがopkg管理外になったらしく、update scripts のボタンが設置され、定義ファイルが更新されていた。また設定項目が一部更新されており、互換性がなくなったため再設定することになった。
予備のルータを用意する
仮想マシンなんだし、予備のルータを用意するほうがアップグレードは楽だと思った。
気づいたこと
アップグレードとはいえ、どうせddされるだけなんだよね。バックアップを取ってext4-combinedイメージを取得して新規の仮想マシンで起動しちゃったほうが楽だよね絶対。
以前の資料
以前はこのようにやっていた。 https://takuya-1st.hatenablog.jp/entry/2021/12/20/041955