🐬

Linux システムアップデートの仕組み

2022/06/12に公開

はじめに

Linuxを利用したシステムのアップデート手法についてまとめています(気が向いた時に随時更新しています)。

1. システムアップデートの種類

クリーンインストールは論外

システムをアップデートする場合、工場出荷状態にするようなクリーンインストール(イメージをフラッシュメモリやストレージ等にまっさらな状態で書き込む)することも技術的には可能ではありますが、これを行うと必要なデータ(ユーザ設定ファイル等)が初期化される、不必要なデータまで書き込み処理が行われるため、ユーザがシステムを利用開始した後に行うことは基本的にはありません。

そのため、必要なファイルだけ安全(データを破壊することなく)にアップデートする仕組みが必要になります。

アップデート対象

システムアップデートの対象は以下のようなものが考えられます。

  • ブートローダ
  • デバイスツリー
  • Linuxカーネルイメージ
  • ユーザプログラムや設定ファイル等

アップデート手法

一般的に、大きく分けて3つの方法が存在します。

一つ目は、通常動作時とは異なるアップデート専用モードを用意して、そのモードに入って通常モードのシステムを書き換えるサブモードによるアップデートです。

二つ目は、最近のシステムであるAndroid OSや Chrome OSがサポートしているA/Bアップデートです。

三つ目は、何も考えずにファイルを上書き保存する方法です。凄い割り切った方法ですが、Ubuntuのような一部のLinuxシステムでは利用されています。通常システムやアプリケーションが動いている状態で必要なファイルを上書き保存しますし、信頼性という観点ではかなり怪しいので本記事では説明しません。

2. サブモードによるアップデート

通常時に動作しているシステムモードとは異なる、アップデート専用(リカバリモード)のモードを用意する点がA/Bアップデートとは大きく異なります。また、専用モードを持つため、複数回のシステム再起動を伴うことが多いです。この方式を採用しているOSの代表例はWindowsです。

なぜ専用モードが必要なのか?

なぜ専用モードを用意するかというと、通常システムやアプリケーションを一度停止し、必要なファイルを更新する必要があるためです。このアップデート専用モードでは、アップデート作業に必要なサービスやシステムだけを動作させ、アップデート対象を更新します。

アップデートモードに入る

通常モード時に何らかの方法で新しいアップデートが存在することを検出し、そのアップデートイメージをダウンロードします。その後、シャットダウンシーケンス時等に次回起動のモードを通常モードからアップデートモードに設定し、リブートを行います。リブートシーケンス時に、通常モードで起動するのではなく、アップデートモードに遷移します。この時、ユーザからはアップデート専用の画面に入っているように見えることが多いと思います。

アップデートモードから通常モード

アップデート専用のモードでアップデート対象を更新していきます。更新作業が終了したら、次回起動のモードを通常モードに設定します。そしてリブートすれば通常モードになり、一連のアップデート処理が終了です。

3. A/Bアップデート

サブモードによるアップデートでは、複数回のリブート処理が入るため、ユーザ目線ではシームレスではありません。これを解決する手法がA/Bアップデートです。

A/Bというのはシステムイメージ(パーティション)を2面持つということです。A/Bアップデートでは、専用モードを持つ代わりに、必要なパーティションを2重持ちします。通常時はA面を利用しますが、アップデート処理時にはアップデートデータをその対になるB面に書き込みます。そして次回起動時にB面をA面として利用するように切り替えます。

このようにすることで、通常システムはそのまま動作しつつ、バックグラウンドでアップデート処理を全て完結させることが出来ます(次回起動時に新しいシステムになる)。

課題

A/Bアップデートの最大の課題は、A面B面の2面持ちすることによる必要ストレージサイズが大きくなる点です。PCやスマホのようなシステムであればストレージサイズも大きいため、あまり課題になることもありませんが、リソース制約が厳しい組み込み機器では課題になることがあります。

4. 暗号化

アップデートイメージはセキュリティの関係上(適当なファイルをアップデートは出来ない、ダウングレード禁止等)、暗号化されていることがあり、ユーザがダウンロード可能なアップデートイメージは暗号化され、システムアップデート時にはデジタル署名等でそのファイルの妥当性が確認されることがあります。

5. 電源遮断時のケア

一番気にする必要がある、アップデート処理中の電源遮断の対策です。アップデート処理中に停電やコンセント抜き等で電源が遮断されたらシステムが壊れて二度と起動しないなどとなることを避ける必要があります。

では、どうするのか?完全に対応するにはかなり難しい話(どんなケースやタイミングでも大丈夫というシステムはないはず)だと思いますが、一般的な方法としてはいくつかあるように思います。

  • アップデート中に電源遮断で途中終了し、次回システムが正常起動しなかったら古いアップデートイメージを利用してリカバリモードで復旧する
  • ファイル更新前にファイルのバックアップを残し、ファイルの更新が完全に完了してから本番ファイルと差し替える

5. 参考文献

https://source.android.google.cn/devices/tech/ota/ab?hl=ja

Discussion