歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux服務器 >> 如何給Linux操作系統減肥下

如何給Linux操作系統減肥下

日期:2017/3/2 16:46:02   编辑:Linux服務器

根文件系統

對於許多新轉到嵌入式Linux的工程師而言,他們認為在一個嵌入式設備上的根文件系統是一個外部概念,在Linux之前的嵌入式解決方案通過直接連接應用程序代碼到內核中進行工作,因為Linux在內核和根文件系統之間有一個非常好的分割,最小化系統工作不是以縮小內核為終止點,在優化之前,根文件系統的大小與內核相比要小得多,無論如何,對於傳統的Linux而言,系統部分有許多需要調整的部分,調整它們以減少系統的大小。

第一個需要回答的問題是“我究竟需不需要根文件系統?”簡單地說,需要。在內核啟動進程的結尾,它要查找根文件系統,由它再加載並運行第一個進程(通常是init,執行ps aux|head -2將告訴你在你系統上是什麼進程),缺少根文件系統或初始化程序中的任何一個,內核將啟動不了。

最小的根文件系統可以是一個文件:設備應用程序。假如這樣,內核要指定一個文件,它是用戶空間的第一個進程。只要那個進程在運行,系統就能工作,但是,如果這個程序基於任何原因退出了,內核將掛起,設備將需要重新啟動。大多數空間有限的系統也會選擇一個初始化程序,因為內務消耗小,初始化包括重新生成進程已死的代碼,預防遇到應用程序崩潰時內核掛起。

大多數Linux系統非常復雜,包括很多可執行文件和常用共享庫(包含運行在該設備上的應用程序共享庫代碼),對於這些文件系統,有很多選項存在用於減少RFS的大小。

改變C庫

結合GCC,大多數用戶都不想c庫作為一個獨立的實體,c語言包括32個關鍵字(give、take等),因此c程序的大多數字節來自這些標准庫,權威的c庫(glibc)被設計成高度兼容、國際化和跨平台支持,但它也比較大,有很多可選擇的比較小的c庫:

uClibc:這個項目是為沒有內存管理單元(MMU-less)的處理器實現的c庫。uClibc從開始創建就很小,它提供與c庫相同的功能,但刪除了如國際化、大字符集支持和二進制兼容性等特征。而且,uClibc配置工具給用戶很大自由選擇什麼代碼進入庫,允許用戶進一步減小大小。

uClibc++:對於那些使用c++的程序而言,這個庫是在相同設計原則下的實現,支持標准c++庫的大部分功能,工程師可以很容易地在板子上部署基於c++的應用程序,僅需要幾兆字節空間。

Newlib:Newlib出自Red Hat,它有一個非常完整的數學庫實現,有很多做控制和測量應用程序的用戶喜歡它。

dietlibc:dietlibc是glibc的最佳代替品,它仍然是最小的分支,非常小,實際上只有70K,它刪除了如動態鏈接庫等特征。它對ARM和MIPS支持得很好
使用一個交替的c庫

Newlib和dietlibc通過提供一個包裝的腳本調用編譯器使用正確的參數集,忽略包括在編譯器中的標准c庫,使用一個替換的c庫。uClibc有點不同,它需要工具鏈。

一旦你知道如何調用GCC,接下來就要為項目更新Makefile文件或建立腳本,大多數情況下,為項目在Makefile文件中使用下面這樣一行:

CC=CROSS_COMPILE-gcc
假如這樣,所有用戶都需要從命令行運行make命令覆蓋CC變量:
make CC=dietc
這將導致makefile為c編譯器調用diet,盡管看起來很誘人,不要在這個宏中添加參數,用CFLAGS變量代替,例如:
make CC="gcc -Os"
應該是:
make CC=gcc CFLAGS="-Os"
這個很重要,因為某些規則將調用CC編譯,參數將沒有意義,並會產生錯誤。

回到根文件系統

在選擇了c庫後,所有在根文件系統中的代碼需要用新的編譯器編譯,那樣代碼就可以使用最近的、更小的c庫。在這一點上,值得對靜態與共享庫進行評估,對於目標究竟該選擇哪個,如果設備將運行任意的代碼,而且在部署時該代碼是未知的,共享庫是最好的選擇。如:設備可能暴露一個API允許最終用戶或專業工程師編寫模塊。假如這樣,設備上的庫應該為這些新特征實現提供最大的靈活性。

如果系統包括許多分隔的程序共享庫也是最佳的選擇,假如這樣,共享代碼的拷貝將比復制幾個文件的相同代碼更小。

當只有幾個程序在使用時,最佳做法是為每種用途創建一個系統然後比較最後的大小,大多數情況下,較小的系統是沒有共享庫的,而且還有一個額外的受益,沒有共享庫的系統載入和啟動程序時更快(因為沒有連接這一步了),因此用戶從效率角度來說也受益了。

總結

盡管沒有象魔術一樣的工具使系統變得更小,但也不缺少工具幫助使系統僅可能變得更小,而且,使Linux變小比減小內核大小更困難,根文件系統需要嚴格檢查,因為這個部件比內核消耗得更多空間,本文主要敘述了可執行映像大小,減少運行中程序內存需求。

資源

1、Linux-tiny補丁: www.selenic.com/linux-tiny.一系列減少內核映射大小和運行時資源消耗的小補丁,這裡面的許多補丁已經集成到內核中了。
2、GNU C庫: www.gnu.org/software/libc. GNU C標准庫是c庫的規范實現,可以在幾乎所有平台運行,而且可以向後兼容。
3、uClibc: www.uclibc.org. 更小的c庫。
4、Newlib: sourceware.org/newlib. Red Hat的小C庫。
5、dietlibc: www.fefe.de/dietlibc. 最小的c庫

Copyright © Linux教程網 All Rights Reserved