Skip to content

ブートループからの復旧

デバイスに書き込む際、デバイスが「文鎮化」状態になる場面に遭遇することがあります。理論的には、fastboot で boot パーティションを書き込んだだけだったり、不適切なモジュールをインストールしてデバイスが起動しなくなったりした場合なら、適切な操作で復旧できます。このページでは、「文鎮化」状態になったデバイスを復旧させるための緊急手段を紹介します。

boot パーティションの書き込みによる文鎮化

KernelSU では、以下のような状況で boot パーティションを書き込んだときに文鎮化する場合があります:

  1. 間違った形式の boot イメージを書き込んでしまった場合。例えばお使いのデバイスのパーティション形式が gz なのに lz4 形式のイメージを書き込んでしまうと、起動しなくなります。
  2. お使いのデバイスが起動するために AVB 検証を無効にする必要がある場合(通常、無効にするにはすべてのデータを消去する必要があります)。
  3. カーネルにバグがある、または書き込みに適していない場合。

どのような状況であっても、純正の boot イメージを書き込むことで復旧できます。したがって、インストールする前にまずは純正の boot パーティションをバックアップすることを強くおすすめします。バックアップしていない場合は、あなたと同じデバイスを持つ他のユーザー、または公式ファームウェアから純正の boot イメージを入手できます。

モジュールによる文鎮化

モジュールのインストールはデバイスを文鎮化させる一般的な原因です。モジュールを未知のソースからインストールしないでください!モジュールは root 権限を持つため、あなたのデバイスに不可逆的なダメージを与える可能性があります!

通常のモジュール

安全であることが確認されているモジュールをインストールしてデバイスが起動しなくなった場合、KernelSU では心配することなく簡単に復旧できます。KernelSU には、デバイスを救出するためのセーフモードが組み込まれています:

音量下ボタンでの復旧

セーフモードを使用して復旧を試みることができます。セーフモードに入ると、すべてのモジュールが無効化されます。

セーフモードに入るには、2つの方法があります:

  1. 一部のシステムの内蔵セーフモード:音量下ボタンの長押しでセーフモードに入れるシステムもあれば、リカバリーでセーフモードに入れるシステム(MIUI/HyperOS など)もあります。システムのセーフモードに入ると KernelSU もセーフモードに入り、自動的にモジュールを無効化します。
  2. KernelSU の内蔵セーフモード:最初の起動画面の後、音量下キーを3回以上連続して押すと入れます。なお、押す→離す、押す→離す、押す→離すを繰り返すのであって、長押しではありません。

セーフモードに入ると、KernelSU Manager のモジュールページにあるすべてのモジュールが無効になります。「アンインストール」操作を行うことで、問題を起こしている可能性のあるモジュールをアンインストールできます。

内蔵のセーフモードはカーネルに実装されているため、キーイベントを見逃す可能性はありません。ただし、GKI 以外のカーネルでは手動によるコードの統合が必要な場合があるため、公式ドキュメントを参考にしてください。

WARNING

KernelSU はカーネルモジュールの初期化中(LKM モードでカーネルが init プロセスを実行する際に読み込まれる)に音量キーリスナーを登録し、on_post_fs_data ステージ(起動アニメーションの前)で登録を解除します。タイミングを把握し、最初の起動画面の後に音量下キーをすばやく 3 回押す必要があります。デバイスの起動が速い場合や操作が遅れた場合、セーフモードがトリガーされない可能性があります。

モジュールが initrc に不合理なコードを書き込み、デバイスが起動しなくなった場合、これらのコードはセーフモードでも実行されます。

手動での復旧

セーフモードで問題が解決しない場合は、手動での復旧を試すことができます。デバイスの状態に応じて、以下の方法を選択してください。

方法 1: ADB 経由で ksud を使用してモジュールを管理する

デバイスが ADB 経由で root シェルを取得できる場合は、ksud コマンドラインを使用して、問題のあるモジュールを直接無効化またはアンインストールできます:

TIP

metadata パーティションと data パーティションをマウントした後、リカバリーモードで /data/adb/ksud コマンドを実行してモジュールを管理できます。

GKI デバイスは init を共有しているため、KernelSU カーネルモジュールはリカバリーモードでも読み込まれます。そのため、ksud の機能のほとんど(機能の設定など)を通常通り使用できるはずです。

adb shell
su
ksud module list          # すべてのモジュールを一覧表示
ksud module disable <id>  # 問題のあるモジュールを無効にする
ksud module uninstall <id> # または直接アンインストール
reboot

方法 2: リカバリーによる手動クリーンアップ

システムに入ることができない(ADB も接続できない)場合は、デバイスにサードパーティのリカバリー(TWRP など)が必要です。

KernelSU のモジュールの読み込みは、カーネル側の init.rc 注入ファイルとユーザー空間の ksud プロセスに依存しています。これらのファイルを削除して再起動すると、KernelSU はモジュールをロードしなくなります。

操作手順:

  1. リカバリー(TWRP など)に入ります。
  2. data パーティションをマウントします:
    mount /data
    (まず data パーティションを復号する必要がある場合があります。具体的な操作はデバイスと復号方法によって異なります。)
  3. モジュールのロードを防ぐために ksud を削除します:
    rm -f /data/adb/ksud
  4. (オプション)metadata パーティションをマウントし、モジュールによって生成された init.rc 注入ファイルを削除します:
    mount /metadata
    rm -f /metadata/ksu/modules.rc
    rm -f /metadata/watchdog/ksu/modules.rc
  5. デバイスを再起動します:
    reboot

再起動後、KernelSU はすべてのモジュールの読み込みをスキップします。システムに入ったら、KernelSU Manager を再度開いてモジュールの問題に対処できます。

データのフォーマット、またはその他の悪意のあるモジュール

上記の方法でデバイスを救出できない場合、インストールしたモジュールが悪意のある操作をしているか、他の手段でデバイスを損傷している可能性が高いです。この場合、2つの方法しかありません:

  1. データを消去して公式システムを完全に書き込み直す。
  2. アフターセールスサービスに問い合わせする

GPL3 ライセンスでリリースされています。