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