1 秒內啟動Linux的方法_linux shell

來源:互聯網
上載者:User

 儘可能快的啟動系統,對於自動化裝置是非常重要的。系統能夠在使用者無法感知的時間內啟動,也就意味著在不需要工作時,可以完全切斷電源,而不是掛起 進入休眠狀態。本文基於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相關知識感興趣的朋友一起學習吧。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.