盡可能快的啟動系統,對于自動化設備是非常重要的。系統能夠在用戶無法感知的時間內啟動,也就意味著在不需要工作時,可以完全切斷電源,而不是掛起 進入休眠狀態。本文基于Atmel AT91系列片上系統和NAND閃存,經過一系列的優化,將Linux系統啟動時間,從最初的11秒,降低到最終的656毫秒。
背景知識
系統從上電到完全啟動,需要經過許多過程。一個簡化的啟動流程大概包含:
硬件重置
啟動引導程序(bootloader)
操作系統初始化
應用程序執行
其中硬件非常關鍵,但是硬件一般難以更改。后續的優化,主要針對引導程序、Linux內核和應用程序展開。
引導程序優化
引導程序主要完成對CPU的基礎設置,處理ARM標記(ATAGS,ARM TAGS)或設備樹(device trees),切換存儲管理單元(MMU,Memory Management Unit)等工作。
對于U-Boot,常用的優化方式有:
刪除不不要的功能:如網絡加載等,如果不需要,那么直接移除這些代碼吧;
關閉不需要的功能
關閉內核鏡像驗證
關閉引導程序輸出
關閉啟動延遲
將通用功能的引導程序修改成一個優化后的初始程序加載器(Initial Program Loader,IPL),對于U-Boot,可以通過SPL(Second Program Loader,第二階段程序加載器)來實現。
內核優化
Linux內核被設計的非常靈活,可以針對需要的功能做各種配置優化。因此,優化內核對于系統啟動速度是至關重要的。
首先,移除一切不要的驅動,盡可能的減少內核加載的內容,能夠大大縮短系統啟動時間。其次,還有很多內核選擇可能需要進一步嘗試,比如內核壓縮方 式,對于嵌入式系統來說,LZO壓縮方式,通常會是一個不錯的選擇。最后,還可以通過定制一些啟動參數,達到加快啟動的目的。例如可以通過“lpj=”參 數,預設每個循環需要的節拍數(loops per jiffy,lpj)的值,避免系統在啟動時自動推算。這樣在基于ARMv5的系統中,可以節省100ms以上的時間。
對于內核啟動的優化,可以通過bootgraph.pl腳本(位于內核源碼的script/bootgraph.pl)來繪制內核啟動耗時圖表,用以分析啟動最耗時的地方。這個腳本使用非常簡單,直接將dmesg的輸出作為其輸入,即可生成svg圖表:
復制代碼 代碼如下:
dmesg | perl scripts/bootgraph.pl > output.svg
生成的圖表如下圖,
圖中每一個色段表示一個功能的初始化耗時。可以簡單的關閉不需要的功能,或者針對功能進行特定的優化。
除了內核本身之外,內核所在的文件系統也對系統啟動有著非常大的影響。對于使用閃存芯片作為存儲的系統來說,UbiFS是一個很好的選擇。它能夠容忍意外斷電,有著出色的掛載速度,以確保系統快速啟動。
應用程序優化
內核完成系統啟動之后,接來下就是執行應用程序。對于應用程序的優化,主要有兩部分,一部分是由應用程序來接管啟動的INIT進程,另一部分是優化應用程序的鏈接方式。
標準的SystemV INIT程序,需要執行一堆啟動腳本。對于嵌入式系統來說,大部分是沒有意義的。另一部分(比如掛載文件系統),可以由應用程序自己來實現。然后,可以在內核啟動參數中通過“init=”參數,將INIT進程直接指定為應用程序。
應用依賴的動態鏈接庫,會按照以下順序查找:
LD_PRELOAD環境變量指定的路徑(一般對應文件/etc/ld.so.preload);
ELF .dynamic節中DT_RPATH入口指定的路徑,若DT_RUNPATH入口不存在的話;
環境變量LD_LIBRARY_PATH指定的路徑,但如果可執行文件有setuid/setgid權限,則忽略這個路徑;編譯時指定--library-path會覆蓋這個路徑;
ELF .dynamic節中DT_RUNPATH入口指定的路徑;
ldconfig緩存中的路徑(一般對應/etc/ld.so.cache文件),若編譯時使用了-z nodeflib的鏈接選項,則此步跳過;
/lib,然后/usr/lib路徑 ,若使用了-z nodeflib鏈接選項,則此步亦跳過;
因此,盡可能的將應用程序依賴的動態鏈接庫放到優先查找的路徑,可以加快鏈接速度。對于交叉編譯環境特別需要注意,主機上的動態鏈接庫位置和目標系統上的位置可能不一致,這會增加應用程序執行時動態鏈接庫的加載時間。
總結
基于上面提到的三個優化點,可以將系統的啟動時間,從最初的11s降低到656ms(數據參考Jan Altenberg在都柏林舉行的嵌入式Linux會議上的演講稿)。從硬件到引導程序再到內核最后到應用程序,每個啟動步驟都有自己可優化的地方,經過一些簡單的優化,就可以減少系統的啟動時間。
ps:linux下啟動和關閉網卡命令
ifup、ifdown:linux命令
實時地手動修改一些網絡接口參數,可以利用ifconfig來實現,如果是要直接以配置文件,亦即是在 /etc/sysconfig/network-scripts里面的ifcfg-ethx等文件的設置參數來啟動的話,那就得要通過ifdown或ifup來實現了。
復制代碼 代碼如下:
[root@linux ~]# ifup {interface}
[root@linux ~]# ifdown {interface}
[root@linux ~]# ifup eth0
ifup與ifdown真是太簡單了。這兩個程序其實是script而已,它會直接到 /etc/ sysconfig/network-scripts目錄下搜索對應的配置文件,例如ifup eth0,它會找出ifcfg-eth0這個文件的內容,然后加以設置。關于ifcfg-eth0的設置請參考前一章連上Internet的說明。
不過,由于這兩個程序主要是搜索設置文件(ifcfg-ethx)來進行啟動與關閉的,所以在使用前請確定ifcfg-ethx是否真的存在于正確的目錄內,否則會啟動失敗。另外,如果以ifconfig eth0來設置或者是修改了網絡接口后,就無法再以ifdown eth0的方式來關閉了。因為ifdown會分析比較目前的網絡參數與ifcfg-eth0是否相符,不符的話,就會放棄這次操作。因此,使用ifconfig修改完畢后,應該要以ifconfig eth0 down才能夠關閉該接口。
如何讓LINUX網卡開機自動啟動
激活網卡的命令是:ifconfig eth0 up你既然知道了命令,自己做一個腳本,放在啟動項目就可以了。
建議通過編輯網卡配置文件修改網卡配置文件保存在/etc/sysconfig/network-scripts目錄下面,第一塊網卡的文件是ifcfg-eth0,第二塊是ifcfg-eth1,以此類推,所以,如果如果你有一塊,那么你就輸入一下命令vi /etc/sysconfig/network-scripts/ifcfg-eth0,打開之后,將ONBOOT=no,改為ONBOOT=yes,(如果沒有,手動添加ONBOOT=yes),保存退出,重啟服務。
復制代碼 代碼如下:
echo "ONBOOT=yes" >> /etc/sysconfig/network-script/ifcfg-eth0
在/etc/sysconfig/network-scripts中添加ONBOOT=yes設置網絡開機自動啟動
以上內容是大家介紹了1秒內啟動linux的方法,對啟動linux相關知識感興趣的朋友一起學習吧。
您可能感興趣的文章:- Linux下的Oracle啟動腳本及其開機自啟動
- 程序中獲取linux系統啟動時間方法
- linux啟動級別的含義(init 0-6)
- linux停止和查看啟動服務的命令使用方法
- linux設置tomcat自啟動的方法
- 在Linux上用forever實現Node.js項目自啟動
- Linux下啟動多個mysql服務器例子
- Linux下php5.4啟動腳本
- Linux小技巧分享之如何重新啟動tomcat