2018年6月15日金曜日

watchdogを導入したRaspbianでsudoが使えなくなったのでfork bombでrebootさせた話

Raspberry Pi 3 model BにRaspbian (armv7l)を入れて有線routerとして利用しているが、sudoがsegmentation faultを吐いて使えなくなる状況に陥った。

どうやらsudoのpermissionがおかしくなったことが要因らしいが、理由はどうあれRaspbianでsudoが使えないのは致命的である。普通にinstallして特に設定しない場合、Raspbianではrootとしてloginできない。一般userが必要に応じてsudoする運用が前提だからだ。

こうなると、aptでsystem updateも、rpi-updateでfirmware upgradeも、shutdownもできない。最終手段として強制的に電源を切る (=microUSBのcableを引っこ抜く)ぐらいしか思い付かないが、NAND flashのstorageではあまりやりたくない (HDDでも嫌だが)。

そこで、watchdogをinstallしていることを思い出し、fork bombでsystemをdownさせてrebootさせようと思い付いた。つまり:

* fork bombを発動
* watchdogが発動 → reboot
* boot processでfsckが実行される → filesystemが修復されpermissionが回復
* sudoが使えるようになる (はず)

fork bombにはshell scriptで実行する方法と、Cあたりでprogramを書いて実行する方法がある。今回はshell scriptより速く効きそうなCでprogramを書いて実行した。

#include <unistd.h>

int main(void){
  while(1){
    fork();
  }
}
これをforkbomb.cとして保存し、gcc -o forkbomb forkbomb.cでcompile。実行前に気休めとして一応syncを発行しておく。

./forkbombを実行。systemがfreeze → watchdogによりrebootがかかるのを待つ。

無事rebootし、fsckが実行されたのか、sudoは何事もなく使えるようになった。


0 件のコメント:

コメントを投稿