mos

mos

OpenWrt x86 ext4 システムのアップグレードのベストプラクティス

OpenWrt_Logo

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 が実行されるはずです。
前の手順でエラーが発生し、対処しなかった場合、この再起動では起動しなくなる可能性があります。


注釈#

Footnotes#

  1. 一部の派生バージョンでは、修正コードがマージされていると信じられていますが、リリース版とパッケージ管理ソースが欠落している可能性があるため、ここでは議論しません。

  2. おそらく OpenWrt 21 時代にオンラインで見つけたもので、一部は無効になっているため、スクリプトの出典は不明です。出典がわかる場合は、コメントでリンクを残してください。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。