Linux裁減案例--裁減到10M以內

轉載:張宏偉、歐陽平平

嵌入式Linux由一個幾百KB的kernel(內核)和一些根據需要進行定製的系統模塊組成。由於Linux是開放源代碼的操作系統,因此,其在嵌入式領域有其不可替代的成本和高度靈活性等優勢。

  將Linux系統裁減到就像DOS一樣只要一張軟盤就能啓動,是製作嵌入式Linux的基礎。網絡上有許多實現方法的介紹,但是在實踐過程中都或多或少存在着一些問題或不方便之處。我們結合自己在這方面的實踐經驗,詳細介紹基於軟盤Linux的製作過程。

  三個基本元素

  一個嵌入式Linux系統只需要下面三個基本元素:引導程序、Linux微內核(由內存管理、進程管理和事務處理構成)和初始化進程。如果要讓它有更多的功能且保持小型化,還可以加上文件系統、TCP/IP網絡支持、GUI(圖形用戶界面)和設計精簡的應用程序,並將其放在ROM、RAM、FLASH或Disk On Chip中啓動。由於嵌入式Linux操作系統的高度靈活性,開發者可以很容易地對它進行定製或作適當開發,來滿足實際應用需要。

  將Linux的系統裁減到只要一張軟盤就能啓動,不但是製作嵌入式Linux的基礎,而且自己也有廣泛的應用前景。這些應用包括簡單路由器管理、三層交換機管理、floppy-boot防火牆管理等。國外有專門的組織致力於這方面的工作,如LOAF(Linux on a floopy)等組織。

  選擇內核

  創建一個啓動盤首先必須創建系統內核。由於軟盤容量有限,因此常採用對內核進行手工配置,去掉不必要的模塊的方法來裁減內核。

  要想裁減內核體積,創建它時就得把不必要的功能去掉,如去掉對網絡的支持和對不必要設備的支持。但是一定要記住保留內核對RAMDISK和ext2的支持,否則啓動盤將不能工作。其過程如下:

  1)以root超級用戶登錄,進入目錄/usr/src/linux。

  2)執行#make menuconfig來對內核模塊進行配置(也可以在X Window中運行make xconfig)。

  3)依次執行#make dep和#make bzImage (如果內核不大則執行#make zImage),執行該命令後,將在/usr/src/linux/arch/i386/boot目錄下生成內核文件bzImage(或zImage)。若配置中加入了模塊的支持(選項爲M),還需要執行#make modules和#make modules_install。

  4)用命令#cp usr/src/linux/arch/i386/ boot/bzImage /boot拷貝新內核到/boot目錄,修改文件/etc/lilo.conf,加入:

  image = /boot/bzImage
  label = new
  root =/dev/hdxx(你自己的啓動硬盤分區)
  read-only

  執行命令#lilo載入新內核,#reboot重啓系統,在出現“lilo:”時鍵入new。若系統正常引導,則執行下一步,若不行則用老內核引導後,到步驟1)重新配置編譯內核。

  5)插入軟盤執行
  #dd bs=1k if=/usr/src/linux/arch/i386/ boot/bzImage of=/dev/fd0
  這樣將內核拷貝到軟盤上。

  6)用命令#ls -s將在/usr/src/linux/ arch/i386/boot/bzImage得到內核的大小(假定爲476),將這個大小記錄下來以備後用。

  這樣就製作了包含裁減內核的可供啓動的Linux啓動軟盤。但是由於沒有root文件系統,使用這張軟盤啓動系統後,系統會顯示“VFS: cannot open root device x:x”和“kernel panic: VFS: unalbe to boot root fs on x:x”的錯誤。

  root文件系統
  一個root文件系統必須包括支持完整Linux系統的全部東西,因此,它至少應包括:基本文件系統結構;至少含有目錄/dev、/proc、/bin、/etc、/lib、/usr、/tmp;最基本的應用程序,如sh、ls、cp、mv等;最低限度的配置文件,如rc、inittab、fstab等;設備:/dev/hd*、/dev/ tty*、/dev/fd0;基本程序運行所需的函數庫。

  由於以上所需文件遠超過1.44M,因此我們通常的做法是在準備好內容後將其壓縮到軟盤中。當用軟盤啓動時,再把文件解壓到內存中,形成一個虛擬盤(RAMDISK),通過RAMDISK控制系統啓動。如果你使用LILO控制啓動,先檢查一下LILO的配置文件/etc/lilo.conf中定義的RAMDISK的大小:

  RAMDISK_SIZE = nnn
  創建root文件系統

  回到根目錄或用戶的缺省目錄,用#mkdir flop建立工作目錄flop。在這個目錄下用mkdir建立以下一些目錄:/dev,設備;/proc - proc,文件系統所需目錄;/etc,系統配置文件;/sbin,重要的系統程序;/bin,基本應用程序;/lib,共享函數庫;/mnt,裝載其他磁盤節點;/usr,附加應用程序。

  其中/proc、/mnt和/usr在此情況下都是空的,只需要用mkdir創建它們即可。其餘的目錄應根據需要分別創建。下面對它們一個一個地詳細敘述。

  /dev:這個目錄中含有系統不可缺少的設備文件。你可以把現有系統中/dev的文件拷貝過來,然後刪除不必要的文件。不過一定要保留console、kmem、mem、null、ram、tty*等文件。其餘的都可以根據需要刪除。

  /etc:這個目錄中含有一些必不可少的系統配置文件。一般可以包含rc.d/* (系統啓動腳本)、fstab(列出要登錄的文件系統)、inittab(包含啓動過程參數)、passwd (用戶名和目錄)、group(用戶組)、shadow(用戶加密密碼)。如果不使用init作爲登錄進程,而將init鏈接到/bin/bash,則/etc目錄下可以不含有任何文件。

  /bin和/sbin:該目錄中包含有必不可少的應用程序,如ls、mv、cat、cp、getty(mingettty)。也可以根據自己的需要選擇,不過一定要記住包括以下程序:init、getty、login、mount、bash。

  /lib:該目錄中包含有你的啓動盤啓動過程中所需要的共享函數庫。在/lib目錄下還必須有函數庫裝載器,這個裝載器或是ld.so (對a.out庫)或是ld-linux.so (對ELF庫)。

  模塊
  如果有一個模塊化的內核,你還得必須考慮需要加載的模塊。它們都位於/lib/modules。你可以把不是很重要的模塊放到別的盤上,當系統啓動後再加載,這樣會節省啓動盤的空間。

  打包
  1)建立loop設備的臨時掛接點和一個大小爲4.6兆(大小可以調節)的臨時文件,並將其清零:
  #mkdir /mnt/loop 2>/dev/null
  #dd if=/dev/zero of=/tmp/loop_tmp bs=1k count=4600 >/dev/null

  2)將loop設備與臨時文件聯繫起來
  #losetup /dev/loop0 /tmp/loop_tmp

  3)Linux內核識別兩種可以直接拷貝到RAMDISK的文件系統,它們是minix和ext2,ext2性能更好:
  #mke2fs -m 0 /dev/loop0 2>/dev/null
  #mke2fs將會自動判斷設備容量的大小並相應地配置自身,-m 0參數防止它給root保留空間,這樣會騰出更多的有用空間。

  4)接着把虛擬盤掛在節點/mnt上:
  #mount /dev/loop0 /mnt/loop -t ext2

  5)將製作好的root文件系統拷貝到所掛的節點上,卸下掛接點,刪除建立的掛接點,再取消loop設備與臨時掛接點的聯繫。
  #cp -a ./tree/* /mnt/loop
  #umount /mnt/loop
  #rmdir /mnt/loop 2>/dev/null
  #losetup -d /dev/loop0

  6)壓縮文件系統後,就擁有了一個壓縮的root文件系統,刪除建立的臨時文件。
  #dd if=/tmp/loop_tmp | gzip -9 > rootfs.gz
  #rm -f /tmp/loop_tmp

  7)檢查壓縮後的root文件系統的大小,如果大了,還得去掉一些東西。
  #ls -s ./zImage|cut -f2 -d

  整合
  有了root文件系統和內核之後,最後的工作就是把它們整合在一起。

  先檢查總文件的大小,包括已經制作的內核和打包的root文件系統。如果超出1.44M,就得考慮重新創建。root文件系統所需的所有文件都準備就緒,你就可以運行它了,運行結果應該沒有錯誤,否則就應該仔細檢查一下。

  真正的嵌入式Linux系統
  到這裏基於軟盤的Linux盤已經做好了,剩下的工作就是測試這張盤的正確性,如果有問題還得從頭再來。
  現在許多Linux的發行套件中都有廠家做好的啓動盤,它們的製做原理和以上介紹的大同小異,但是它們常常使用許多不同的技巧,因爲它們要面對更多的硬件和各種可能發生的情況。

  真正的基於IA應用的嵌入式Linux還必須加入GUI(圖形用戶界面)和設計精簡的應用程序,如網絡瀏覽器等。GUI方面開放源代碼的,國外有Microwindows(可訪問www.microwindows.org),國內有miniGUI(可訪問www.minigui.org)。它們的源代碼都可以在網上找到。瀏覽器方面用得較廣的是ViewML(www.viewml.org),它也是開放源代碼的。結合以上一些工具,再從www.armjishu.com加上對硬件驅動程序的開發,就可以形成一套嵌入式的Linux操作系統。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章