2013年3月14日 星期四

[Linux]嵌入式系統強制進入/恢復法

BusyBox v1.10.4 / U-boot

開機後等"Hit any key to stop autoboot:"訊息出現後按任何鍵停止。
這時可用"?"來確認可用指令,首先printenv確認自己的原設定。
用setenv更改bootargs,在原指令的最後面加上init=/bin/sh (或是/bin/bash)。
然後boot重開。 (不用擔心亂改,只要不save的話下次會自動還原)

這時候就可以跳過登入程序,形同root進入系統。
做原本正常開機會失敗的事,像是改密碼。

這時候若要存取其他裝置(mount相關):
先手動掛上proc:
mount -t proc proc /proc

若是在mknod之前發現自己系統是squashfs的readonly的話:

用tmpfs就可以掛出一塊記憶體空間(RAM DISK)來用:
mount -t tmpfs,size=20m /tmp         (路徑和大小任選)
如果/etc/fstab因為某原因不存在而且無法自己開一個的話:
mount -t tmpfs -o size=20m none /tmp

mknod的方法:

mknod /tmp/mtdblock3 b 31 3
mount -t jffs2 /tmp/mtdblock3 /tmp/mtdbk

如此便可在/tmp/mtdbk(路徑自選)存取mtdblock3的內容。

註:
比較重要的檔,就像是/etc/rcS.d (這名字可能不一樣,看開機去讀哪)
然後上面會呼叫/etc/rc.local
最後是/etc/fstab的分割表

利用上面的強制進入系統後,在執行/etc/rcS.d就跟一般開機流程差不多了。

2013年3月1日 星期五

[Linux]在/etc/rc.local內加入開機執行的背景程式

參考資料:
http://serverfault.com/questions/9563/bash-code-in-rc-local-not-excuting-after-bootup
http://unix.stackexchange.com/questions/14993/how-do-i-start-my-service-at-boot-time
http://www.linuxmisc.com/27-openbsd/1383bfded6bcc0f0.htm

若是發現開機程序跑完,登入後沒看到程式出現,可以做下列循序檢查:

1.先檢查rc.local是不是真的有跑,加一行簡單程式像是echo或是touch或mkdir。
2.背景程式要是要花很多時間啟動,有些script可能會停止花太長時間的程式。
3.登入後在sh下執行 /bin/sh /etc/rc.local 跑完看背景程式有沒有出來。
(我卡在這裡,開機時有程式啟動成功訊息,但登入後程序消失,在sh下跑rc.local就有活著)
4.檢查錯誤訊息如/var/log/messages
5.檢查script內有沒有用一些環境變數如$PATH,在sh下正常,但rc.local下可能不同。

可以自己寫小程式,內含sleep一段時間/啟動和結束訊息,然後在rc.local下實驗:
/usr/bin/foo &
開機時和有沒有正常啟動,登入後ps看有沒有活著。

目前查的結果"應該"就是rc.local結束後會砍child process,
導致利用"&"以及傳統fork方式做背景執行的程式被砍。
最快的解法就是執行時前面加nohup。
nohup /usr/bin/foo &
(這方法沒實驗,因為我是在精簡系統上,居然沒nohup可以用...)

這次採用的方式是利用程式內加入daemon()達成背景執行(man daemon),
利用這個函式之後就可以活過rc.local結束了。