Raspberry Pi(linux)のinit.d(スタートアップ時に実行されるファイル群)にシャットダウンスクリプトを入れてしまった場合
Raspberry piで外部にボタンを用意し,ボタンが押されたらシャットダウンするスクリプトをスタートアップにいれたところ,
ライブラリか何かが入ってなかったとかで,常にシャットダウンしつづける狂気のプログラムが走ってしまった.
....ので,復旧方法をメモしておきます.
1. rescue mode(windowsでいうsafe mode)で起動する
http://elinux.org/RPI_safe_mode
RaspberryPiの5, 6番ピンをショートさせるとrescue modeで起動します.
ブートされるのはBusy Box( http://monoist.atmarkit.co.jp/mn/articles/0802/04/news114.html )という最小構成のOSになります.
2. fdiskでマウントすべきOS(スタートアップ時に実行されてしまうファイルが入っているモノ)が入っているディレクトリを探す
$ sudo fdisk /dev/disk0s1 Disk: /dev/disk0s1 geometry: 812/8/63 [409600 sectors] Signature: 0xAA55 Starting Ending #: id cyl hd sec - cyl hd sec [ start - size] ------------------------------------------------------------------------ 1: 00 0 0 0 - 0 0 0 [ 0 - 0] unused 2: 00 0 0 0 - 0 0 0 [ 0 - 0] unused 3: 00 0 0 0 - 0 0 0 [ 0 - 0] unused 4: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
Rescue modeで起動した場合,通常起動時に実行されるようなスタートアップファイルは実行されません.
なぜなら,そもそもそこらへんのシステムファイルが入ったOSがブートされないから.
この仕組みを利用して,
ブートしてないOSを別のディレクトリでマウントすることで,削除したいスタートアップファイルをこっそり削除します.
そのために利用するのがfdiskコマンド.
実行すると上記のようなリストがでてきます.
ここで,OSが入っているものの場合「unused」の部分が「linux」だったり「windows」だったりと表記される(はず).
「/dev/disk0s1」「/dev/disk0s2」「/dev/disk0s3」あたりを探せば目的のOSをマウントしているのが大体みつかるはず.
ちなみに,現在マウント中のディスクの場合は,resource busyとかでてきて中身は見えません.当たり前だけど.
3. 削除したいファイルが入っているOSを内包しているものをマウント,該当ファイルの削除を行う.
$ sudo mkdir /tmp/test $ sudo mount /dev/disk0s2 /tmp/test
/tmp/testという空ディレクトリを生成,マウント先にする
内部のファイル見れるようになるので,該当するファイルを削除する
x. dfコマンドでブートしているディレクトリを調べる(おまけ)
$ df Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on /dev/disk0s2 488555536 452615984 35427552 93% 56640996 4428444 93% / devfs 368 368 0 100% 638 0 100% /dev map -hosts 0 0 0 100% 0 0 100% /net map auto_home 0 0 0 100% 0 0 100% /home
これを見ると,今ブートしているディレクトリは「/dev/disk0s2」であることが分かります.
レスキューモードの場合は「/dev/disk0s2」はでてこなくて大体「/root」とかだけ出てくるとかだったはず.
■ /usr/local/bin/gpioをインストール,つまりwiringPi
http://www.e-ark.jp/2013/05/06/wiringpi-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/
■ add shutdown button
http://www.queryadmin.com/693/add-shutdown-button-raspberry-pi/
■ linuxでmillisのsleepをやる
http://serverfault.com/questions/469247/how-do-i-sleep-for-a-millisecond-in-bash-or-ksh