- 相關(guān)推薦
一種實(shí)現嵌入式Linux的新法子
摘要 在Linux中會(huì )遇到由于文件系統 毀壞,需要 人工修復而導致系統 無(wú)法正常啟動(dòng)的現象。本文采納 Linux初始化內存盤(pán)(INITRD)技巧,并把內存的一部分作為L(cháng)inux的根目錄,每次啟動(dòng)把完整 的文件系統 解壓到這里,避免了系統 從毀壞的文件系統 啟動(dòng)。這不僅使系統 能正常啟動(dòng),而且進(jìn)步了系統 性能。
要害詞 Linux 嵌入式 INITRD ramdisk
【Abstract】In course of building embedded Linux, the system will not start because of the bad filesystem . The paper describes a new method, which adopts INITial Ramdisk Disk and assigns part of memories as root directory of Linux. It avoids startup from a bad filesystem because it uncompresses integral filesystem to ramdisk every time. With this method, the system can not only start normally, but also it’s performance is very good.
【Keyword】Linux embedded INITRD ramdisk
引言
在Linux操作系統 中,有一項特別的功效 ——初始化內存盤(pán)INITRD(INITial Ram Disk)技巧,而且內核支撐收縮的文件系統 映像。有了這兩項功效,我們可以讓Linux系統 從小的初始化內存盤(pán)啟動(dòng),并把系統 內存的一部分作為根文件系統 掛載,而且不應用交換 分區(如果不運行X Windows這是完整可以的),即把Linux系統 完整嵌入到內存中,而不依附于任何其他硬盤(pán),F在PC機內存至少128M,而根文件系統 所用的只有30M,因此不僅不會(huì )使整機性能降落,反而有很大的進(jìn)步。
由于系統 不工作在硬盤(pán)上,所以系統 打消了由于機械驅動(dòng)而導致的問(wèn)題;因為系統 運行于內存中,根文件系統 和操作完整在CPU/RAM環(huán)境下,系統 性能在速度和可靠性方面非常好;它不會(huì )由于非法關(guān)機而毀壞文件系統 ,因為我們每一次啟動(dòng)是把收縮的文件系統 解壓至內存盤(pán)中作為根文件系統 掛載。
1 硬件請求
對于這樣一個(gè)系統 ,硬件不需要 特別 的設計,只是通過(guò)普通的PC機上的組件實(shí)現。值得一提是系統 的內存的大小,它至少該當有64M。因為30M作為Ramdisk應用,剩下30多兆作為系統 運行,才干保證系統 的正常工作,我們現在的盤(pán)算機內存一般為128M,這個(gè)條件都能滿(mǎn)足。唯一特別 的是一個(gè)flash盤(pán) ,它相當于一個(gè)IDE接口的硬盤(pán),大小為20M,首要用它作為啟動(dòng)LILO和放置根文件系統 收縮包。
2 Ramdisk的應用
Ramdisk就是將內存的一部分分配為一個(gè)分區并作為硬盤(pán)來(lái)應用。對于系統 運行時(shí)不斷應用的程序,將它們放在Ramdisk中將加快盤(pán)算機的操作,如大數據量的網(wǎng)絡(luò )服務(wù)器、無(wú)盤(pán)工作站等。為了能夠應用 Ramdisk,我們在編譯內核時(shí)須將block device中的Ramdisk支撐選上,它下面還有兩個(gè)選項,一個(gè)是設定Ramdisk的大小,默認是4096k;另一個(gè)是initrd的支撐。它既可以直接編譯進(jìn)內核,也可以編譯成模塊,在需要 的時(shí)候加載。我們由于在啟動(dòng)時(shí)就用它,所以必須 將它直接編譯進(jìn)內核。
如果對Ramdisk的支撐已經(jīng)編譯進(jìn)內核,我們就可以應用它了。首先在/mnt目錄下創(chuàng )立目錄ram,運行mkdir /mnt/ram;然后對/dev/ram0創(chuàng )立文件系統 ,運行mke2fs /dev/ram;最后掛載上/dev/ram,運行mount /dev/ram /mnt/ram,就可以象對普通硬盤(pán)一樣對它進(jìn)行操作了。值得注意的是,在創(chuàng )立文件系統 的時(shí)候,在屏幕上輸出1024 inodes ,4096 blocks,即ramdisk大小為4M=4096個(gè)塊,但是我們掛載上之后,用命令df –k /dev/ram查看時(shí),顯示出來(lái)ramdisk大小只有3963K,這是由于文件系統 本身占用了一些空間。
我們能根據 需要 轉變 ramdisk地大小。如我們要把默認的4M增大到10M,當ramdisk是直接編譯進(jìn)內核的情況 下,可在LILO配置文件lilo.conf中參加一行:append=“ramdis_size=10000”,運行LILO后,重啟盤(pán)算機后,ramdisk大小變?yōu)?0M,或者在啟動(dòng)是作為啟動(dòng)行參數ramdis_size=10000;當ramdisk是作為可加載模塊編譯時(shí),需要 在模塊加載配置文件/etc/modules.conf中參加一行:options rd rd_size=10000,或者在加載rd模塊是在后面加上闡明 ,即insmod rd rd_size=10000.
3 實(shí)現歷程
3.1創(chuàng )立收縮的文件系統
我們的實(shí)現歷程是依附于存在的Linux系統 。首先啟動(dòng)一般的Linux系統 ,在這個(gè)系統 中根據 自己的需要 ,創(chuàng )立一個(gè)適宜功效的文件系統 。例如我們要實(shí)現Apache網(wǎng)絡(luò )服務(wù)器,那么只要把完成系統 啟動(dòng)和根基掩護需要 的一些命令、腳本、配置文件和庫函數留下,再加上實(shí)現Apache服務(wù)器所需要 的。具體歷程為:
在Linux下建立 目錄/minlinux,我們在此目錄下創(chuàng )立的文件系統 。系統 的所有靜態(tài)鏈接庫,贊助 手冊(man pages),信息頁(yè)(info pages),頭文件,內核源碼對于系統 運行是完整無(wú)用的,所以不需要 它們。在目錄bin下放系統 掩護的一些根基工具,如ls、mv、grep、chown、chmod、chgrp、ln、rm等;在sbin下是系統 啟動(dòng)歷程通常需要 的命令,如bash、e2fsck、mke2fs、fdisk、insmod、rmmod、depmod、modprobe、lsmod、shutdown、reboot、login、init、getty、mount、umount、等;usr/bin下放置Apache利用程序http和其他一些特別工具。然后根據 這些可履行文件需要 的動(dòng)態(tài)鏈接庫來(lái)斷定 lib目錄下的內容。當然目錄etc下的配置文件,dev下的設備 文件需要 的都必須 要有,它們都是和可履行文件對應的,因為許多可履行文件履行時(shí),一般是打開(kāi)設備 ,根據 配置文件來(lái)運行。有一個(gè)特別的目錄proc該當設置,在內核編譯選項文件系統 選擇中,我們選擇對文件系統 proc的支撐,那么在系統 運行之后它下面有許多內容,這些內容是實(shí)時(shí)、不斷跟蹤系統 內核和正在運行的歷程的狀態(tài) 而產(chǎn)生 的,但不占用任何磁盤(pán)空間,而是駐留在內存中。在某些情況 下,可以通過(guò)它來(lái)系統 設置,許多工具從這里獲取信息,如dmesg、ps、top等。
文件系統 制作 完成,大小該當在20M左右。
接下來(lái)把文件系統 拷貝至ramdisk為生成ramdisk映像文件做籌辦。我們把系統 的ramdisk 轉變到30M,重啟盤(pán)算機后,履行下列操作:
dd if=/dev/zero of=/dev/ram bs=1k count=30000 把ramdisk調劑到零,以便后面有更高的收縮率;
mke2fs –m0 /dev/ram 30000 在ramdisk上建立 30M的ext2文件系統 ;
mount /dev/ram /mnt/ram 將已款式化的ramdisk掛載至目錄/mnt/ram;
cp –av /minlinux/* /mnt/ram 將文件結構 拷貝至ramdisk。
然后我們對/mnt/ram/etc目錄下的文件進(jìn)行修正。首要的文件是fstab,它負責在系統 啟動(dòng)時(shí)把系統 要掛載的文件系統 信息傳遞給啟動(dòng)歷程,我們應用 ramdisk作為根文件系統 ,且不需要 交換 分區,所以此文件配置
/dev/ram / ext2 defaults 1 1
none /proc proc defaults 0 0
即可。一般來(lái)說(shuō)系統 啟動(dòng)時(shí)都要激活交換 分區,即在啟動(dòng)腳本中有swapon –a 命令,但我們不需要 交換 分區,因此要把這一項移除,否則啟動(dòng)時(shí)會(huì )打印差錯信息然后收場(chǎng)啟動(dòng)。
最后我們要拷貝ramdisk的映像并將其收縮。首要步驟如下:
運行df ,注意1024-blocks一欄中/dev/ram的數值,在我的機上為25600;
卸載/dev/ram,運行cd /root切換至root目錄并運行umount /dev/ram;
將ramdisk寫(xiě)成映象文件,運行dd if=/dev/ram of=ram30.img bs=1k count=25600
收縮,并在/root目錄下產(chǎn)生 一個(gè)收縮的映象文件ram30.img.gz,運行g(shù)zip –9v ram30.img
3.2創(chuàng )立 initrd ramdisk 映像
首先我們在/dev/ram0中創(chuàng )立一個(gè)適宜大小的ext2文件系統 ,法子 同上,只是大小只有2048K,因為initrd ramdisk是用來(lái)指示(bootstrap)30M的ramdisk,并將它掛載至/mnt/ram。
然后在/dev/ram0中建立 映像需要 的目錄和文件。創(chuàng )立目錄bin、dev、etc、lib、mnt和可履行腳本文件linuxrc,linuxrc的內容為:
#!/bin/bash
mount –o –ro /dev/hda1/ /mnt # 以只讀法子 將flash盤(pán)掛載在/mnt下
zcat /mnt/boot/ram30.img.gz > /dev/ram # 將根文件系統 映像解壓至ram
umount /dev/hda1 # 卸載flash盤(pán)
bin下面為linuxrc中用到的命令;lib為這些命令需要 的動(dòng)態(tài)鏈接庫;etc下為配置文件ld.so.conf,定義命令運行時(shí)尋找所需動(dòng)態(tài)鏈接庫的路徑,運行命令ldconfig –r /mnt/ram產(chǎn)生 文件ld.so.cach,在命令和動(dòng)態(tài)鏈接庫之間建立 對應關(guān)系;dev下根基終端設備 和linuxrc中用到的設備 :console、ram、null、systty、tty1、tty2和hda1;mnt為hda1的掛載點(diǎn)。
最后創(chuàng )立收縮的initrd ramdisk映像。
運行df 看看/dev/ram0的字節數,在我的盤(pán)算機上1684K;
轉換當前目錄至/root并卸載/dev/ram0 umount /dev/ram0;
拷貝/dev/ram0成映像文件 dd if=/dev/ram0 of=initrd.img bs=1k count=1684;
產(chǎn)生 收縮的映像文件initrd.img.gz,運行g(shù)zip -9v initrd.img。
3.3啟動(dòng)
系統 的啟動(dòng)需要 依賴(lài)flash盤(pán),通過(guò)LILO把系統 啟動(dòng)信息寫(xiě)入flash盤(pán)主指示區。
將flash盤(pán)作為第一主盤(pán)hda,而將裝有普通Linux的硬盤(pán)作為第一從盤(pán)hdb并從它啟動(dòng)。在flash硬盤(pán)上創(chuàng )立 ext2文件系統 ,將它掛載至/mnt/flash目錄。在flash盤(pán)上建立 boot目錄,將收縮的文件系統 和initrd映像拷貝至boot目錄下,同時(shí)將Linux內核、指示區記載 boot.b、指示區映射map拷貝至其下。在普通Linux系統 中建立 LILO配置文件ramlilo.conf,配置文件如下:
boot=/dev/hda
map=/mnt/flash/boot/map
install=/mnt/flash/boot/boot.b
prompt
timeout=50
image=/mnt/flash/boot/vmlinuz
append= “ramdisk_size=30000”
label=embedded
root=/dev/ram
initrd=/mnt/flash/boot/initrd.img.gz
運行命令lilo –C ramlilo.conf ,將啟動(dòng)信息寫(xiě)入flash的主指示區MBR。
重新啟動(dòng)盤(pán)算機,登陸后運行mount,我們看到如下兩項:
/dev/ram on / ext2 (rw)
none on /proc type proc (rw)
這顯示只有ramdisk被掛載,制作 成功 。
4 結論
在我們制作 的嵌入式Linux中進(jìn)行各種操作,速度非?,而且系統 很穩固。沒(méi)有出現因為根文件系統 毀壞而導致系統 進(jìn)入手工掩護界面的現象。用它作為HTTP網(wǎng)絡(luò )服務(wù)器、網(wǎng)絡(luò )監督器、寬帶通信 設備 管理器或者其他需要 長(cháng)光陰不停運行的機器,都有很高的利用價(jià)值。
參考文獻
1.鄒思鐵 嵌入式Linux設計與利用 清華大學(xué)出版社 2002 北京
2.黃敦 如何結構嵌入式Linux系統 dunn@163.net 2001
3.Tom Fawcett The Linux Bootdisk HOWTO Bootdisk-HOWTO@linuxdoc.org 200
4.Paul Moody miniHOWTO Embedded Linux 1.1b paulmoody@bigpond.com 1998
【一種實(shí)現嵌入式Linux的新法子】相關(guān)文章:
基于嵌入式Linux的終端AVI視頻編碼器的實(shí)現03-07
在嵌入式linux2.4.18內核中實(shí)現CS8900A網(wǎng)卡驅動(dòng)03-07
嵌入式Linux技術(shù)的現狀與發(fā)展動(dòng)向03-19
嵌入式Linux系統及其應用前景03-18
嵌入式Linux系統下Microwindows的應用03-19