それマグで!

知識はカップより、マグでゆっくり頂きます。 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 /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を探し出して、アップグレードを開始する。

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

ディスク・イメージをブロックデバイスとして接続する。

## 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 -fddをしてるに過ぎない。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 installchrootで済ませたかったが、、、今後の課題とする。

仮想マシンを編集する。

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がいなくなってエラー
  • 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