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 /root/opkgscript.sh >> /etc/sysupgrade.conf 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 アップグレードの開始。(OpenWrt内部で作業)
2023-10-17 メモ : 仮想マシン使ってる場合は、ディスクイメージファイルを直接操作したほうが楽だった。(末尾に追記)
事前に現在のディスク使用率やディスク容量を確認しておく。
/tmp/sysupgrade.img
に展開されるのでtmp
のディスク容量。またext4ディスク容量はddで初期化されるので現在使ってる容量を記憶しておく。
イメージ取得
イメージ配布サイトから、自分のCPUモデルにマッチするイメージのURLを探し出して、アップグレードを開始する。
ext4 と squash fs 私は、ext4 の MBRを使っているので、ext4-combined(bootとext4)を選んだ。最近だとEFIだと思う。squashfs はopenwrtの非x86でよく使うファイルシステムで、squashfs版は、再起動すると設定以外は全部消える。つまりramfsに載せるタイプである。これを選ぶと容量使わないしSSDも消費しないので便利だと思う。ただ私は、x86_64仮想マシンで動かしているしディスク容量も潤沢にあるのでext4でいいかと思ってる。
取得と展開
展開前にテストする。
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
既存の設定ファイルで設定下テスト(--test
)する。
展開する。
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
設定ファイルを指定すれば、設定が維持される。
ただし、22.x -> 23.x は /etc/config/network の設定周りのアップグレードが入るのでLuciを開くまでは機能しなかったので注意。
手順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
ディスク・イメージをブロックデバイスとして接続する。
## qcow2であればnbdを経由する sudo modprobe nbd max_part=8 sudo qemu-nbd --connect=/dev/nbd0 /var/lib/libvirt/images/openwrt-x86-64-combined-ext4.qcow2 ## 使い終わったら # sudo qemu-nbd -d /dev/nbd0 # sudo rmmod nbd ## raw img であれば losetup だけで行ける。 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
ディスク容量を確保したら、opkgの復元
./opkgscript.sh install /etc/config/opkg.installed
手順3(方法2)アップグレードーchrootする
仮想マシンらしく、ディスクイメージの操作をしたほうが楽だと思う。
ext4を選んでいると仮想マシンだ。しかもsysupgrade -f
は dd
をしてるに過ぎない。OpenWrtの特性上、アップグレードといっても、クリーンインストールにsysupgrade がデータをコピーするだけである。
ディスクサイズが100M以下なら、公式配布ディスクを起動したら終わりな、アップグレードはとても楽である。 Used>100M
ならアップグレード後のopkg install
中に容量不足になるため、事前にディスクサイズ拡大を行う。
ディスクサイズの確認。
root@OpenWrt:~# df -h Filesystem Size Used Available Use% Mounted on /dev/root 147.2M 111.3M 32.8M 77% / tmpfs 7.5G 11.0M 7.5G 0% /tmp /dev/vda1 15.7M 5.2M 10.2M 34% /boot /dev/vda1 15.7M 5.2M 10.2M 34% /boot tmpfs 512.0K 0 512.0K 0% /dev
私は、100M以上使っているので、サイズ拡大が必要だった。
ディスクイメージのファイルの情報などを見ておく。
## ワーキングコピー cp openwrt-22.03-x86-64-combined-ext4.qcow2 WRT-current.qcow2 disk=WRT-current.qcow2 ## 接続する。 sudo modprobe nbd max_part=8 sudo qemu-nbd --connect=/dev/nbd0 /var/lib/libvirt/images/$disk sudo mount /dev/nbd0p2 /mnt ## ディスクの情報を見る。 df -h /mnt lsblk /dev/nbd0 qcow-img info /var/lib/libvirt/images/$disk ## 取り外し sudo umount /mnt sudo qemu-nbd -d /dev/nbd0 sudo rmmod nbd
アップグレード先のディスクを用意する。
まっさらなディスクイメージをダウンロードしてくる。
URL=https://downloads.openwrt.org/releases/23.05.0/targets/x86/64/openwrt-23.05.0-x86-64-generic-ext4-combined.img.gz wget $URL pigz -d openwrt-23.05.0-x86-64-generic-ext4-combined.img.gz ## 作業用コピー作成 cp openwrt-23.05.0-x86-64-generic-ext4-combined.img work.img ## マウントする。 sudo losetup -P -f /var/lib/libvirt/images/work.img sudo losetup sudo lsblk ## パーティションを確認 sudo mount /dev/loop10p2 /mnt
sysupgrade 用のバックアップ・データを書き込む
## バックアップを書き込む sudo cp ~/OpenWrt-2023-10-17.tgz /mnt/root/ ## chroot してデータ展開 sudo chroot /mnt '/bin/ash' sysupgrade -r /root/OpenWrt-2023-10-17.tgz
ディスクの容量を調整
## ディスク・サイズを調整 sudo truncate -s +60M work.img sudo losetup -P -f /var/lib/libvirt/images/work.img sudo losetup -c /dev/loop10 sudo sfdisk /dev/loop10 ## パーティションを編集 sudo e2fsck -fy /dev/loop10p2 sudo resize2fs /dev/loop10p2 ## 結果の確認 sudo mount /dev/loop10p2 /mnt sudo umount /mnt sudo losetup -d /dev/loop10
容量大きくしたので。ついでに、qcow2にしておく
cd /var/lib/libvirt/images/ sudo qemu-img convert -O qcow2 work.img work.qcow2 sudo virt-sparsify work.qcow2 work.qcow2.sparse sudo cp work.qcow2.sparse work.qcow2 ## マウントして確認 sudo modprobe nbd max_part=8 sudo qemu-nbd --connect=/dev/nbd0 /var/lib/libvirt/images/work.qcow2 ## 容量とか見る。 sudo mount /dev/nbd0p2 /mnt sudo df -h /mnt ## 取り外し sudo qemu-nbd -d /dev/nbd0 sudo rmmod nbd
どうせなら、opkg install
もchroot
で済ませたかったが、、、今後の課題とする。
仮想マシンを編集する。
virsh shutdown OpenWrt virsh edit OpenWrt
ディスクを取り替える。
<disk> <driver name='qemu' type='qcow2'/> ## <source file='/var/lib/libvirt/images/openwrt-current.qcow2'/> <source file='/var/lib/libvirt/images/work.qcow2'/> <target dev='vda' bus='virtio'/> (略
起動する
virsh start OpenWrt
これで、起動するはずである。opkg の追加パッケージが皆無なため、あれこれ設定がおかしくなってるかもしれないので注意は必要である。
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 のボタンが設置され、定義ファイルが更新されていた。また設定項目が一部更新されており、互換性がなくなったため再設定することになった。
- openwrt が AAAA をフィルタしない。
dnsmasq をversion 2.87
以降にすればいい。DNSMasqの更新履歴から読み取れる。
22.03.05 のDNSMasqがこれ (2.86)、また、23.05.0 の DNSMasq がこれ(2.89) 。なので、v2.87以降を使うなら23.x にアップグレードする。
2305 にアップグレードしたときに発生した問題点
- dnsmasq が unboundと連携しててunboundが消えたのでdnsmasqがDNSを引けなくなってた。
- dns forwardings を
'127.0.0.1#5353'
としdnsmasq が port 5353に聴くようにしてたのが、unboundがいなくなってエラー
- dns forwardings を
fgrep: warning: fgrep is obsolescent; using grep -F
がでる。vi /usr/libexec/fgrep-gnu
で編集すると消せる
- vim のバージョンが上がって各種設定が動かなかったり。
- ipsec/strongswan/swanctl 周りのパッケージ名が変わってインストール移行出来てなかった。
以前ほどトラブルは起きてない。
2023-10-30 unbound が問い合わせの応答に失敗する。
初回だけ、SOAを返してしまう。
unbound のquery_minimize と Strict Minimizeがチェックが増えて動作が変わってるようです。
query_minimize時にStrict Minimizeにチェックがあると初回応答はSOAだけです。A/CNAMEが返されませんでした。そのため、AレコードがないNO EXISTS DOMAIN(NXDOMAIN)となり、変な値がキャッシュされてしまいいました。サーバが見つからないエラーが頻発しました。
option query_minimize '1' option query_min_strict '0'
この方が良さそうです。
予備のルータを用意する
仮想マシンなんだし、予備のルータを用意するほうがアップグレードは楽だと思った。
気づいたこと
アップグレードとはいえ、どうせddされるだけなんだよね。バックアップを取ってext4-combinedイメージを取得して新規の仮想マシンで起動しちゃったほうが楽だよね絶対。
2023-10-17 追記。ためした。chrootで仮想マシンのDISK編集するほうが私にはわかりやすくて楽だった。
以前の資料
以前はこのようにやっていた。 https://takuya-1st.hatenablog.jp/entry/2021/12/20/041955
2024-08-20
22.x->23.x のアップグレードでコケたので追記。