Caution
本文撰写于 OpenWrt 23 release 版本发布之时,文中所述内容在未来可能会发生改变。请务必备份重要数据,仔细阅读可能的错误信息并谨慎操作,作者不对本文内容做任何保证。
WHY? なぜこの記事が存在するのか?#
OpenWrt コミュニティは、x86 ターゲット向けに適切なアップグレードツールを提供していません。そのため、x86 デバイスのシステムアップグレードツールは、他のターゲットと同様にsysupgradeのみが利用可能であり、ディスクイメージを単純に書き込むことしかできません。OpenWrt ドキュメントには、エレガントでも簡単でもなく、副作用もある代替手法が提供されています。
Tip
より良い解決策として、extroot を使用して、SquashFS イメージを使用して OverlayFS の上位と下位を別々のディスクに分離し、バージョンをアップグレードする際には下位ディスクにプリコンパイルされたイメージを直接書き込み、その後、extroot の設定を変更して元の上位ディスクを指すように OverlayFS を再設定することができます。ただし、現在の OpenWrt コミュニティのメインラインでは、この 5 年間のバグが修正されていないため、extroot の設定は機能しないため、この方法は使用できません1。
技術的にはあまり詳しくないが、探求するのが好きなProUser被験者として、OpenWrt の新参者がより簡単にアップグレードできるように、アップグレードスクリプト2を元にこのアップグレードガイドを作成しました。
ベストプラクティス#
Warning
この方法は、OpenWrt メインラインおよび ImmortalWrt などの派生バリアントに適用され、良好なリリースバージョンとパッケージ管理ソースを持つものにのみ適用されます。自作や「大神」の改造版など、再配布されたバージョンには適用できません。
Note
この記事のターゲットは x86_64 であり、OpenWrt 23.05.0 にアップグレードすることを想定しています。必要に応じて調整してください。
OpenWrt x86 は、本質的には特殊なバージョンの Linux ディストリビューションです。理論的には、一般的な Linux ディストリビューションと同様に、設定を保持しながら大規模なバージョンアップを行うこともできますが、前述のようにアップグレードツールがないため、手動で一連の操作を行う必要があります。
バージョン番号の取得(オプション)#
oldver=$(awk -F\" 'NR==2 {print $2}' /usr/lib/os-release)
newver=23.05.0
すべてのパッケージのアップグレード(オプション)#
opkg update
opkg upgrade netifd
#netifd を個別にアップグレードするのは、ネットワークインターフェースを再起動して SSH 接続を中断するためです
opkg list-upgradable | cut -d ' ' -f 1 | xargs opkg upgrade
カーネルの置き換え#
Important
ここでは、boot パーティションのマウント場所を確認する必要があります。私のマウント場所は /boot であり、二重マウントはありません。ファイルツリーは次のようになりますので、実際のカーネルの場所に合わせてパスを変更してください。
tree /boot
/boot
├── boot
│ ├── grub
│ │ ├── boot.img
│ │ ├── core.img
│ │ ├── grub.cfg
│ │ └── grub.cfg.b
│ ├── vmlinuz
│ └── vmlinuz.23.05.0-rc3
└── efi
└── boot
└── bootx64.efi
-
古いバージョンのカーネルをバックアップ
mv /boot/boot/vmlinuz /boot/boot/vmlinuz.$oldver
-
新しいバージョンのカーネルをダウンロード
wget -O /boot/boot/vmlinuz "https://downloads.openwrt.org/releases/23.05.0/targets/x86/64/openwrt-23.05.0-x86-64-generic-kernel.bin"
-
ファイルのハッシュを確認
sha256sum /boot/boot/vmlinuz
パッケージの処理#
-
新しいリリースバージョンの kernel.ipk を手動でダウンロード
これは実際のカーネルではなく、opkg が依存するカーネルバージョンのパッケージです
wget https://downloads.openwrt.org/releases/23.05.0/targets/x86/64/packages/kernel_5.15.134-1-47964456485559d992fe6f536131fc64_x86_64.ipk
-
新しいリリースバージョンの keyring.ipk を手動でダウンロード(オプション)
wget https://downloads.openwrt.org/releases/packages-23.05/x86_64/base/openwrt-keyring_2022-03-25-62471e69-2_x86_64.ipk
Note
リリースバージョンでは、キーとスナップショット / RC バージョンは異なるため、それらの間を切り替える際には keyring.ipk をインストールする必要がありますが、逆の場合は必要ありません。
それらをインストールする:
opkg install kernel_*
opkg install openwrt-keyring_*
opkg ソースの変更#
-
ソフトウェアソースのリリースバージョンを置換
sed -i.backup "s/$oldver/$newver/g" /etc/opkg/distfeeds.conf
-
パッケージリストの更新
opkg update
新しいリリースバージョンのパッケージのアップグレード#
- /lib/functions.sh を無効にする
(なぜこれを行う必要があるのか忘れましたが、知っている方はコメントで補足してください)
mv /lib/functions.sh /lib/functions.sh.b
- ベースファイルのアップグレード
opkg upgrade base-files
- netifd 以外のすべてのパッケージをアップグレードし、強制的に上書きする
opkg list-upgradable | cut -d ' ' -f 1 | grep -v 'netifd' | xargs opkg upgrade --force-overwrite
- netifd のアップグレード
opkg upgrade netifd
再起動して完了#
問題がなければ、再起動後は新しいバージョンの OpenWrt が実行されるはずです。
前の手順でエラーが発生し、対処しなかった場合、この再起動では起動しなくなる可能性があります。