それマグで!

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

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

openwrtのアップグレード手順(見直し

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

私は、ext4MBRを使っているので、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