
107秒で再起動するルーターを、どうにか元に戻した話
SoftBank Air ターミナル6を、かなり前からいじっています。中でLinuxが動いていることが分かり、SSHで入れるようにしたり、USBを触ったり、ネットワーク設定を変えたりしていました。中古で買ったルーターなのに、気がつけばずいぶん深いところまで潜っていました。
ある日、T6をWi-Fiの子機として使えることが分かりました。手動で設定すると家庭内Wi-Fiにつながり、IPアドレスも取れて、SSHも普通に使えます。それなら起動時に自動でつながるようにすれば便利じゃないか、と思ったのです。
これが失敗でした。再起動すると、しばらく動いたあとにまた再起動します。時間を測ってみると、だいたい107秒でした。
また起動する。しばらくすると落ちる。そしてまた起動する。
107秒ループの完成です。
起動するけど、すぐ死ぬ
完全に起動しないなら、まだ諦めもつきます。でも今回は途中まではちゃんと動いているらしく、ネットワークが見える時間もあります。ただし、こちらが何かしようとしている間に再起動してしまいます。
最初に思ったのは、「あ、やったなこれ」でした。自分で仕込んだ自動起動処理が、自分で機械を壊しているわけです。しかも、その処理を止めるためには中に入らないといけません。
でも中に入れる時間は、せいぜい107秒。正確には起動時間もあるので、実際に作業できる時間はもっと短いです。ここから、ちょっと変な復旧作業が始まりました。
107秒で一つだけやる
一度の起動で全部直そうとすると、たいてい途中で落ちます。そこで、一回につき一つだけ確認することにしました。今回はネットワークがどのタイミングで上がるのか、次はどの瞬間なら中に入れるのか、という具合です。
入れたら、次の107秒では別のことをします。設定を一つ確認する、ファイルを一つ保存する、次に入るための経路を一つ増やす。ゲームで、セーブポイントを少しずつ前に進めているような感じでした。
当然、失敗もします。コマンドを打っている途中で接続が切れたり、あと10秒あれば終わったのに、ということも何度もありました。それでも、一回ごとに何か一つ残せれば、次はそこから始められます。
少しずつ自由を取り戻す
最初は外から眺めているだけでした。そこから短時間だけ中に入れるようになり、次はrootで操作できるようになりました。さらに、再起動してもまた戻ってこられる経路を作っていきました。
技術的には、起動領域やA/B構成など、かなり細かいところまで触っています。そのあたりを書き始めると、それだけで長い技術記事になってしまいます。詳しい手順や調査結果は、GitHub側に残すことにしました。
noteで書きたいのは、むしろその時の感覚です。壊れた機械を一気に直したのではなく、一回の起動につき、一つずつ制御を取り戻していった。今回の復旧は、ずっとそんな感じでした。
決定打は、壊れた側を直すのをやめたこと
最後に効いたのは、T6がA/Bという二つの起動領域を持っていたことでした。107秒ループしている側をその場で完全に直そうとするのではなく、もう一方の起動領域を復元して、そちらから立ち上げる方針に切り替えました。
これが決定打でした。必要な領域をバックアップから戻し、B側を起動するように変更すると、T6はようやく107秒を超えて動き続けました。ずっと目の前の壊れた環境だけを直そうとしていたので、「別の正常な足場を作って、そこへ逃げる」という発想に切り替わった瞬間でした。
細かいパーティション番号や復元手順はGitHubに書きます。noteで重要なのは、壊れた場所で戦い続ける必要はなかったということだと思います。逃げ道が残っていたので、そこへ逃げました。
107秒を超えた
何度も見ていると、107秒という時間を体が覚えます。そろそろ落ちるな、と思うころに接続が切れ、また最初から起動します。それを何度繰り返したか、もうよく覚えていません。
そしてある時、107秒を過ぎても落ちませんでした。2分、3分、5分と経っても、そのまま動いています。SSHにも普通に入れます。
派手な成功画面が出るわけではありません。ただ再起動しない。それだけでした。「あ、戻った」と思いました。
一番役に立ったもの
今回、一番役に立ったのは特別なツールではなかったと思います。それまでに調べたことや、実行したコマンド、正常だった状態を記録していたことでした。壊れたあとも、完全なブラックボックスには戻らなかったのです。
どうやって中に入ったか。どこを変更したか。どこまで正常だったか。
それが残っていたので、107秒しかなくても次にやることを決められました。途中経過を残すのは地味ですが、壊れた時にはものすごく効きます。たぶん、今回の最大の教訓はそこでした。
壊す前に、戻る道を作る
改造するときは、成功する方法ばかり考えます。でも本当に必要なのは、「失敗したらどう戻るか」なのかもしれません。SSHを切ったらどうする、ネットワークを壊したらどうする、起動処理を壊したらどうする。
今回は、その戻り道を後から必死に作ることになりました。結果的には戻ってこられたので、結果オーライだった(今回は)。でも、次からはもう少し先に逃げ道を作ろうと思います。
技術的な復旧手順はGitHubにまとめます。誰かが同じようなことをして、同じように107秒ループへ落ちた時、何か一つでも役に立てば十分です。noteには、とりあえずこれだけ残しておきます。
107秒ループから、どうにか帰ってきました。
そしてたぶん、またいじります。