ローリングコンバットピッチなう!

AIとか仮想化とかペーパークラフトとか

Extroot化したOpenWrtを最新版にアップグレードする

[technology][openwrt]OpenWrt 15.05を18.06にアップグレード(Extroot込)

自宅でProxyサーバーとして使用しているOpenWrtマシン(Buffalo BHR-4GRV,1GbE有線ルーター)のアップグレードを計画中です。
現在はOpenWrt Chaos Calmer 15.05.1なのですがこれを現時点で最新安定版の18.06.2にアップグレードしたい。

理由はこのProxyサーバーにTCP BBRを組み込んでProxy→Wi-Fi接続スマフォの下り通信パフォーマンス/安定性が上がるか試してみたいというものです。
TCP BBRはgoogleが開発したTCP輻輳制御アルゴリズムLinux Kernel 4.9に組み込み可能です。実は混雑時にはあまり改善しないとか、Fairnessに問題があるとかとも言われていますが、Wi-Fiの様にパケットドロップが多い場合は効果があるらしいので、それを試してみたいと。

現在Proxyサーバーとして使用している15.05のKernelは3.18.23なのでそのままでは使えません。

基本的には
https://downloads.openwrt.org/releases/
から使う機種に対応したupgrade用バイナリイメージ(ファイル名末尾がsquashfs-sysupgrade.binで終わるもの)をダウンロードしてきて、sysupgradeコマンドを叩くか、LuCIからファーム更新を実行すれば良いのですが、USBメモリを使ってrootファイルシステムを拡張している(Extroot)と、その部分にインストールされたパッケージ等が引き継がれないため、Extrootの再作成を含めた手順が必要なので、あまり纏まっているところがなく、複数の情報を見ながらProxyサーバーとは別のOpenWrtマシン(こちらもExtroot化済み)でリハーサルを実施しました。

以下、手順です。

  1. 各種バックアップ実行

    • opkgでインストールしたパッケージリストを取得

      ググるといくつか方法が出てくるのですが、一番簡単そうな下記の方法でリストを作りました。
      アップグレードをExtroot再作成後に、リスト見ながら必要なパッケージを再インストールするためのメモになります。

      opkg list-installed | cut -f 1 -d ' ' > /root/installed_packages.txt

    • /etc配下のバックアップ

      LuCIからアップグレードする場合、一応/etc配下の設定ファイルは維持したままアップグレード出来るのですが(ただし、Extrootはアンマウントされる)、念の為、基本的な設定ファイルをtar ballに固めておきます。自分は/etc/config,/etc/init.d配下と、Proxyサーバーとして使用しているPrivoxyのフィルター設定が入った/etc/privoxyをそれぞれ別のtar ballにしました。
    パッケージリストと/etc配下の設定ファイルを収めたtar ballは別マシンにscp等でリモートコピーしておきます。
  2. LuCIからアップグレード実施

    LuCI(Web設定UI)にログインし、「System」→「Backup/Flash Firmware」画面からアップグレード実行画面に入ります。ダウンロードしておいたxxxx-squashfs-sysupgrade.bin(xxxxは機種依存のファイル名)をImageとして指定、「Keep settings:」にチェックを入れてから、「Flash image」ボタンをクリック。これだけでファームウェア更新が始まります。後は、再起動するまでしばらく待ちます。
  3. 再起動したOpenWrtマシンに再ログインする

    成功していればIPアドレスssh有効化設定、rootパスワード等の設定は引き継がれているので、アップグレード前と同じ手順でログイン出来るはずです。ここではsshでログインし、CLIで作業を進めます。
  4. 一応/etc配下の状態を確認する

    自分が試した結果では/etc/configや/etc/init.d配下はそのまま残っていました。Privoxy用フィルタ設定が格納されている/etc/privoxy保全されていました。
  5. opkgでインストール済みパッケージを確認する

    こちらはデフォルトのインストール済みパッケージのみに戻っており、追加でインストールされていたパッケージは消失しています。
  6. Extroot化に必要なパッケージをインストールする

    # opkg update
    # opkg install block-mount kmod-fs-ext4 kmod-usb-storage e2fsprogs kmod-usb-ohci kmod-usb-uhci fdisk

  7. USBメモリ上にExt4ファイルシステムを再作成する

    下記の様にmkfsコマンドでファイルシステムを作成します。下記の例では/dev/sda1にしていますが、USBメモリのデバイスファイル名は事前に確認しておいて下さい。

    # mkfs.ext4 /dev/sda1
    mke2fs 1.44.1 (24-Mar-2018)
    /dev/sda1 contains a ext4 file system
    	last mounted on /tmp/extroot/overlay on Tue May 14 14:39:39 2019
    Proceed anyway? (y,N) y
    Creating filesystem with 1954560 4k blocks and 488640 inodes
    Filesystem UUID: f3349314-b97a-4705-812d-f7932b142390
    Superblock backups stored on blocks: 
    	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
    
    Allocating group tables: done                            
    Writing inode tables: done                            
    Creating journal (16384 blocks): 
    done
    Writing superblocks and filesystem accounting information: done 
    

  8. USBメモリ上のExt4ファイルシステムに、rootファイルシステムの中身をコピーする

    # mount /dev/sda1 /mnt ; tar -C /overlay -cvf - . | tar -C /mnt -xf - ; umount /mnt

  9. /etc/config/fstabを作成する

    次の手順で作成します。
    • 下記のコマンドを実行

      # block detect > /etc/config/fstab

    • /etc/config/fstabファイルを編集

      修正前:

      config 'global'
      	option	anon_swap	'0'
      	option	anon_mount	'0'
      	option	auto_swap	'1'
      	option	auto_mount	'1'
      	option	delay_root	'5'
      	option	check_fs	'0'
      
      config 'mount'
      	option	target	'/mnt/sda1'
      	option	uuid	'f3349314-b97a-4705-812d-f7932b142390'
      	option	enabled	'0'

      修正後:

      config 'global'
      	option	anon_swap	'0'
      	option	anon_mount	'0'
      	option	auto_swap	'1'
      	option	auto_mount	'1'
      	option	delay_root	'5'
      	option	check_fs	'0'
      
      config 'mount'
      	option	target	'/overlay'
      	option	uuid	'f3349314-b97a-4705-812d-f7932b142390'
      	option	enabled	'1'

      config 'mount'セクションのtargetを'/overlay'に変更、同じセクションのenabledを'1'に変更します。

  10. rebootコマンドでreboot実行、再起動を待ちます。
  11. reboot後、再ログイン、dfコマンドでrootfs及びoverlayfsのパーティションサイズが/dev/sda1と同じになっており容量が拡張されている事を確認します。

    # df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    rootfs                15260592     83316  14379020   1% /
    /dev/root                 2304      2304         0 100% /rom
    tmpfs                    30532      3236     27296  11% /tmp
    /dev/sda1             15260592     83316  14379020   1% /overlay
    overlayfs:/overlay    15260592     83316  14379020   1% /
    tmpfs                      512         0       512   0% /dev

  12. 必要なパッケージを再インストール

    インストール後、必要な設定を行って下さい。Privoxyはアップグレード前のフィルター設定がそのまま残っていたので,opkgでインストール後にサービスの有効・無効の再設定するのみでした。

意外とトラブル事も無く、簡単にアップグレード出来ました。
opkg listで見るとkmod-tcp-bbrというBBRモジュールが追加されており、これもopkgでインストールしました。
まだTCP BBRのテストはしていません。

一度、このリハーサル機でTCP BBRのテストまでしてから本運用マシンのアップグレードをしたいと思います。