Beaglebone Black——开机自动运行程序
上接《修改設備樹文件》一文
? ? ? ? ? ?現在每次開機都能看到/dev/rtc1了,那么我們還需要一個應用程序來把時間從RTC讀取出來更新到系統中,然而通過linux系統自帶的一個程序hwclock,我們就可以把RTC的時間更新到系統中來,不需要自己動手省了很多麻煩。當然這個程序需要附帶幾個參數,其功能如下:
查看rtc1的時間
hwclock -r -f /dev/rtc1
將系統的時間更新到rtc1
hwclock -w -f /dev/rtc1?
將rtc1的時間更新到系統
hwclock -s -f /dev/rtc1
? ? ? ? 到現在我們的目的還沒有完全達成,雖然開機后系統能自動把驅動硬件的接口(/devrtc1)外露出來,但是我們總不能每次開機后手動運行hwclock -s -f /dev/rtc1來更新系統時間吧,所以需要學會開機讓程序自動運行。第一步,先寫一個腳本用來更新時間。
#!/bin/sh ### BEGIN INIT INFO # Provides: RTC.sh # Required-Start: $local_fs $remote_fs $network $syslog # Required-Stop: $local_fs $remote_fs $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: date # Description: get correct date information ### END INIT INFO#/etc/init.d/RTC.sh#The following part always gets executed. echo "zy"#The following part carries out specific functions depending on arguments. case "$1" instart)echo "Reading date from /dev/rtc1......"hwclock -s -f /dev/rtc1echo "Done!";;stop)echo "Stopping RTC";;*)echo "Usage: /etc/init.d/RTC.sh {start|stop}"exit 1;; esacexit 0
01:每一個腳本的第一句特別注釋,用于向系統指定運行本腳本的shell
02-10:這是一段專門格式用于給insserv程序識別的LSB信息,通過這些信息insserv可以知道應該把你的腳本安排在一系啟動腳本中哪個順序開始運行。留待后面細說。
12:注解本腳本將要存放的絕對位置
14-15:這個地方不管任何情況此處的語句都會被執行,按需要寫自己想要做的事情即可。
17-31:一個case結構,分成了三種情況,如果$1為start,那么做A事,然后跳出case結構;如果$1為stop,那么做B事,然后跳出case結構;如果$1為其他,那么做C事,然后以exit 1退出腳本。此處A事中的hwclock -s -f /dev/rtc1就我是最想做的事情,把RTC1的時間再開機之后更新到系統中。B事就隨便寫寫意思意思。C事是屬于報錯情況,腳本會以exit 1 退出。此處$1表示運行腳本時跟在后面的第一個參數。留待后面細說。
? ? ? ??現在啟動腳本寫好了,關鍵是如何讓他開機自動運行?
? ? ? ??將此腳本復制到/etc/init.d目錄下,然后賦予可執行權限755.
? ? ? ??通過insserv -v -d/etc/init.d/RTC.sh,搞定!
? ? ? ??如果想去掉這個開機自動運行效果,運行insserv -r?/etc/init.d/RTC.sh即可。
? ? ? ??
解釋!
? ? ? ??linux系統有7個運行級別,每個級別代表了系統不同的運行狀態,如下
? ? ? ??0 ?停機
? ? ? ??1 ?單用戶模式
? ? ? ??2 ?多用戶,沒有NFS
? ? ? ??3 ?完全多用戶模式
? ? ? ??4 ?保留
? ? ? ??5 ?圖形界面
? ? ? ??6 ?重新啟動
? ? ? ? 并非所有的linux系統都是上面這種標準,每個系統也可能隨著版本而變化,事實上還可以定義更多的運行級別。在BBB的debian系統上2-5都是多用戶運行狀態,這個情況可以通過查看/etc/inittab來查看,并且還可以知道開機之后BBB會進入默認的運行級別2。
? ? ? ? 當我們開機后,系統進入默認運行級別中,如果默認級別設置為2,那么開機之后自動進入字符界面,如果設置為5,開機之后進入圖形界面,注意默認級別不能設置為0和6,否則無法啟動系統!進入默認級別后我們可以通過init N手動切換到其他的級別,比如想要關機了,可以直接運行init 0,想重啟了可以直接運行init 6。但是不建議這種操作,最好還是使用reboot和shutdown來達到目的,因為調用reboot和shutdown后會把一些關機之前的善后工作完成,然后再自動切換到其它運行級別。而我們直接手動切換到0和6,則相當于我們平時直接強制按restart按鈕或者直接斷電關機。
? ? ? ??對于每一個運行級別,/etc/rcN.d/目錄下都有一些對應的鏈接文件,這些鏈接都指向了/etc/init.d目錄中的腳本或者可執行文件。也許這種組織方式更方便些吧。而這些鏈接文件都有一個特定的順序,因為系統進入一個特定的運行級別后都要按照特定順序來完成一系列事情。順序由這些鏈接文件名字的第二個和第三個數字(兩位數字的范圍是01-99)來決定,而做什么事情由/etv/init.d下的腳本和可執行文件決定。在/etc/rcN.d/目錄下文件以K開頭的表示kill,運行這個鏈接文件指向的腳本時后面會跟上一個stop參數,于是$1就成了stop;以S開頭的文件表示start,運行這個鏈接文件指向的腳本時后面會跟上一個start參數,于是$1就成了start.
? ? ? ??內核初始化完成后,會有一個初始進程init,這個進程會根據/etc/inittab中的設置進入默認運行級別2,然后根據/etc/rc2.d中的鏈接文件順序來執行鏈接指向的腳本,而我們已經把前面寫好的腳本放在了/etc/init.d目錄下,并且賦予了可執行權限,那么現在還需要/etc/rcN.d目錄下的一個鏈接文件來指向我們寫好的腳本,而這個鏈接文件的順序則是一個問題,因為我們無法手動安排這個順序,想要在進入運行級別2的時候就運行這個腳本不是簡簡單單的在rc2.d下加一個鏈接文件就可以搞定的事情,這就需要用到insserv這個工具。
? ? ? ??insserv是debian中專門用于管理不同運行級別中啟動腳本運行順序的一個工具,查看工具的幫助信息運行insserv -h。
? ? ? ??insserv在對你的鏈接文件進行排序的時候,正是根據你的LSB信息來決定的。
? ? ? ??# Required-Start:表示在本服務啟動之前需要已經啟動的服務
? ? ? ??# Required-Stop:表示本服務必須可以在列出的服務關閉之前關閉
? ? ? ??這個邏輯關系向insserv表明了自己希望放在哪個順序,注意Required-Start和Required-Stop后面的變量必須來自
于/etc/insserv.conf文件中,不能自己隨便定義變量。
? ? ? ??Default-Start和Default-Stop表示你希望在哪些級別中以參數start運行,在哪些級別中以參數stop運行,比如你想在進入級別2-5之后都打開某個服務,但是關機之前又記得把這個服務關閉,那么insserv會先根據你的Required-Start和Required-Stop決定出你的順序,然后再rc2.d-rc5.d這幾個文件夾中放置同樣以S開頭的鏈接文件指向你的腳本,同時在rc0.d中放置一個以K開頭的鏈接文件指向你的腳本,如此一來,只要你的啟動腳本中的case結構針對start參數做出開啟服務的動作,針對stop參數做出關閉服務的動作,就可以實現你的目的了。
? ? ? ??insserv -v -d?/etc/init.d/RTC.sh
? ? ? ??加上-v,那么運行這個命令后,程序會告訴你他在哪些rcN.d目錄下放置了以S開頭的鏈接文件,在哪些rcN.d目
錄下放置了以K開頭的鏈接文件。
? ? ? ??加上-d表示在運行級別上依據LSB中的默認信息Default-Start和Default-Stop來決定。
root@beaglebone:/etc/init.d# insserv -v -d RTC.sh insserv: enable service ../init.d/RTC.sh -> /etc/init.d/../rc0.d/K01RTC.sh insserv: enable service ../init.d/RTC.sh -> /etc/init.d/../rc1.d/K01RTC.sh insserv: enable service ../init.d/RTC.sh -> /etc/init.d/../rc2.d/S18RTC.sh insserv: enable service ../init.d/RTC.sh -> /etc/init.d/../rc3.d/S18RTC.sh insserv: enable service ../init.d/RTC.sh -> /etc/init.d/../rc4.d/S18RTC.sh insserv: enable service ../init.d/RTC.sh -> /etc/init.d/../rc5.d/S18RTC.sh insserv: enable service ../init.d/RTC.sh -> /etc/init.d/../rc6.d/K01RTC.sh insserv: creating .depend.boot insserv: creating .depend.start insserv: creating .depend.stop
? ? ? ??事實上還嘗試過update-rc.d這個工具,但是在BBB的debian中這個工具并不好用,亂七八糟無法管理好,貌似這個工
具好像也是在調用insserv做事的。
總結
以上是生活随笔為你收集整理的Beaglebone Black——开机自动运行程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 假钞
- 下一篇: 用场景应用™玩转#冰桶挑战#