- 相關(guān)推薦
一種實(shí)現(xiàn)嵌入式Linux的新法子
摘要 在Linux中會(huì)遇到由于文件系統(tǒng) 毀壞,需要 人工修復(fù)而導(dǎo)致系統(tǒng) 無(wú)法正常啟動(dòng)的現(xiàn)象。本文采納 Linux初始化內(nèi)存盤(INITRD)技巧,并把內(nèi)存的一部分作為L(zhǎng)inux的根目錄,每次啟動(dòng)把完整 的文件系統(tǒng) 解壓到這里,避免了系統(tǒng) 從毀壞的文件系統(tǒng) 啟動(dòng)。這不僅使系統(tǒng) 能正常啟動(dòng),而且進(jìn)步了系統(tǒng) 性能。
要害詞 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操作系統(tǒng) 中,有一項(xiàng)特別的功效 ——初始化內(nèi)存盤INITRD(INITial Ram Disk)技巧,而且內(nèi)核支撐收縮的文件系統(tǒng) 映像。有了這兩項(xiàng)功效,我們可以讓Linux系統(tǒng) 從小的初始化內(nèi)存盤啟動(dòng),并把系統(tǒng) 內(nèi)存的一部分作為根文件系統(tǒng) 掛載,而且不應(yīng)用交換 分區(qū)(如果不運(yùn)行X Windows這是完整可以的),即把Linux系統(tǒng) 完整嵌入到內(nèi)存中,而不依附于任何其他硬盤,F(xiàn)在PC機(jī)內(nèi)存至少128M,而根文件系統(tǒng) 所用的只有30M,因此不僅不會(huì)使整機(jī)性能降落,反而有很大的進(jìn)步。
由于系統(tǒng) 不工作在硬盤上,所以系統(tǒng) 打消了由于機(jī)械驅(qū)動(dòng)而導(dǎo)致的問(wèn)題;因?yàn)橄到y(tǒng) 運(yùn)行于內(nèi)存中,根文件系統(tǒng) 和操作完整在CPU/RAM環(huán)境下,系統(tǒng) 性能在速度和可靠性方面非常好;它不會(huì)由于非法關(guān)機(jī)而毀壞文件系統(tǒng) ,因?yàn)槲覀兠恳淮螁?dòng)是把收縮的文件系統(tǒng) 解壓至內(nèi)存盤中作為根文件系統(tǒng) 掛載。
1 硬件請(qǐng)求
對(duì)于這樣一個(gè)系統(tǒng) ,硬件不需要 特別 的設(shè)計(jì),只是通過(guò)普通的PC機(jī)上的組件實(shí)現(xiàn)。值得一提是系統(tǒng) 的內(nèi)存的大小,它至少該當(dāng)有64M。因?yàn)?0M作為Ramdisk應(yīng)用,剩下30多兆作為系統(tǒng) 運(yùn)行,才干保證系統(tǒng) 的正常工作,我們現(xiàn)在的盤算機(jī)內(nèi)存一般為128M,這個(gè)條件都能滿足。唯一特別 的是一個(gè)flash盤 ,它相當(dāng)于一個(gè)IDE接口的硬盤,大小為20M,首要用它作為啟動(dòng)LILO和放置根文件系統(tǒng) 收縮包。
2 Ramdisk的應(yīng)用
Ramdisk就是將內(nèi)存的一部分分配為一個(gè)分區(qū)并作為硬盤來(lái)應(yīng)用。對(duì)于系統(tǒng) 運(yùn)行時(shí)不斷應(yīng)用的程序,將它們放在Ramdisk中將加快盤算機(jī)的操作,如大數(shù)據(jù)量的網(wǎng)絡(luò)服務(wù)器、無(wú)盤工作站等。為了能夠應(yīng)用 Ramdisk,我們?cè)诰幾g內(nèi)核時(shí)須將block device中的Ramdisk支撐選上,它下面還有兩個(gè)選項(xiàng),一個(gè)是設(shè)定Ramdisk的大小,默認(rèn)是4096k;另一個(gè)是initrd的支撐。它既可以直接編譯進(jìn)內(nèi)核,也可以編譯成模塊,在需要 的時(shí)候加載。我們由于在啟動(dòng)時(shí)就用它,所以必須 將它直接編譯進(jìn)內(nèi)核。
如果對(duì)Ramdisk的支撐已經(jīng)編譯進(jìn)內(nèi)核,我們就可以應(yīng)用它了。首先在/mnt目錄下創(chuàng)立目錄ram,運(yùn)行mkdir /mnt/ram;然后對(duì)/dev/ram0創(chuàng)立文件系統(tǒng) ,運(yùn)行mke2fs /dev/ram;最后掛載上/dev/ram,運(yùn)行mount /dev/ram /mnt/ram,就可以象對(duì)普通硬盤一樣對(duì)它進(jìn)行操作了。值得注意的是,在創(chuàng)立文件系統(tǒng) 的時(shí)候,在屏幕上輸出1024 inodes ,4096 blocks,即ramdisk大小為4M=4096個(gè)塊,但是我們掛載上之后,用命令df –k /dev/ram查看時(shí),顯示出來(lái)ramdisk大小只有3963K,這是由于文件系統(tǒng) 本身占用了一些空間。
我們能根據(jù) 需要 轉(zhuǎn)變 ramdisk地大小。如我們要把默認(rèn)的4M增大到10M,當(dāng)ramdisk是直接編譯進(jìn)內(nèi)核的情況 下,可在LILO配置文件lilo.conf中參加一行:append=“ramdis_size=10000”,運(yùn)行LILO后,重啟盤算機(jī)后,ramdisk大小變?yōu)?0M,或者在啟動(dòng)是作為啟動(dòng)行參數(shù)ramdis_size=10000;當(dāng)ramdisk是作為可加載模塊編譯時(shí),需要 在模塊加載配置文件/etc/modules.conf中參加一行:options rd rd_size=10000,或者在加載rd模塊是在后面加上闡明 ,即insmod rd rd_size=10000.
3 實(shí)現(xiàn)歷程
3.1創(chuàng)立收縮的文件系統(tǒng)
我們的實(shí)現(xiàn)歷程是依附于存在的Linux系統(tǒng) 。首先啟動(dòng)一般的Linux系統(tǒng) ,在這個(gè)系統(tǒng) 中根據(jù) 自己的需要 ,創(chuàng)立一個(gè)適宜功效的文件系統(tǒng) 。例如我們要實(shí)現(xiàn)Apache網(wǎng)絡(luò)服務(wù)器,那么只要把完成系統(tǒng) 啟動(dòng)和根基掩護(hù)需要 的一些命令、腳本、配置文件和庫(kù)函數(shù)留下,再加上實(shí)現(xiàn)Apache服務(wù)器所需要 的。具體歷程為:
在Linux下建立 目錄/minlinux,我們?cè)诖四夸浵聞?chuàng)立的文件系統(tǒng) 。系統(tǒng) 的所有靜態(tài)鏈接庫(kù),贊助 手冊(cè)(man pages),信息頁(yè)(info pages),頭文件,內(nèi)核源碼對(duì)于系統(tǒng) 運(yùn)行是完整無(wú)用的,所以不需要 它們。在目錄bin下放系統(tǒng) 掩護(hù)的一些根基工具,如ls、mv、grep、chown、chmod、chgrp、ln、rm等;在sbin下是系統(tǒng) 啟動(dòng)歷程通常需要 的命令,如bash、e2fsck、mke2fs、fdisk、insmod、rmmod、depmod、modprobe、lsmod、shutdown、reboot、login、init、getty、mount、umount、等;usr/bin下放置Apache利用程序http和其他一些特別工具。然后根據(jù) 這些可履行文件需要 的動(dòng)態(tài)鏈接庫(kù)來(lái)斷定 lib目錄下的內(nèi)容。當(dāng)然目錄etc下的配置文件,dev下的設(shè)備 文件需要 的都必須 要有,它們都是和可履行文件對(duì)應(yīng)的,因?yàn)樵S多可履行文件履行時(shí),一般是打開(kāi)設(shè)備 ,根據(jù) 配置文件來(lái)運(yùn)行。有一個(gè)特別的目錄proc該當(dāng)設(shè)置,在內(nèi)核編譯選項(xiàng)文件系統(tǒng) 選擇中,我們選擇對(duì)文件系統(tǒng) proc的支撐,那么在系統(tǒng) 運(yùn)行之后它下面有許多內(nèi)容,這些內(nèi)容是實(shí)時(shí)、不斷跟蹤系統(tǒng) 內(nèi)核和正在運(yùn)行的歷程的狀態(tài) 而產(chǎn)生 的,但不占用任何磁盤空間,而是駐留在內(nèi)存中。在某些情況 下,可以通過(guò)它來(lái)系統(tǒng) 設(shè)置,許多工具從這里獲取信息,如dmesg、ps、top等。
文件系統(tǒng) 制作 完成,大小該當(dāng)在20M左右。
接下來(lái)把文件系統(tǒng) 拷貝至ramdisk為生成ramdisk映像文件做籌辦。我們把系統(tǒng) 的ramdisk 轉(zhuǎn)變到30M,重啟盤算機(jī)后,履行下列操作:
dd if=/dev/zero of=/dev/ram bs=1k count=30000 把ramdisk調(diào)劑到零,以便后面有更高的收縮率;
mke2fs –m0 /dev/ram 30000 在ramdisk上建立 30M的ext2文件系統(tǒng) ;
mount /dev/ram /mnt/ram 將已款式化的ramdisk掛載至目錄/mnt/ram;
cp –av /minlinux/* /mnt/ram 將文件結(jié)構(gòu) 拷貝至ramdisk。
然后我們對(duì)/mnt/ram/etc目錄下的文件進(jìn)行修正。首要的文件是fstab,它負(fù)責(zé)在系統(tǒng) 啟動(dòng)時(shí)把系統(tǒng) 要掛載的文件系統(tǒng) 信息傳遞給啟動(dòng)歷程,我們應(yīng)用 ramdisk作為根文件系統(tǒng) ,且不需要 交換 分區(qū),所以此文件配置
/dev/ram / ext2 defaults 1 1
none /proc proc defaults 0 0
即可。一般來(lái)說(shuō)系統(tǒng) 啟動(dòng)時(shí)都要激活交換 分區(qū),即在啟動(dòng)腳本中有swapon –a 命令,但我們不需要 交換 分區(qū),因此要把這一項(xiàng)移除,否則啟動(dòng)時(shí)會(huì)打印差錯(cuò)信息然后收?qǐng)鰡?dòng)。
最后我們要拷貝ramdisk的映像并將其收縮。首要步驟如下:
運(yùn)行df ,注意1024-blocks一欄中/dev/ram的數(shù)值,在我的機(jī)上為25600;
卸載/dev/ram,運(yùn)行cd /root切換至root目錄并運(yùn)行umount /dev/ram;
將ramdisk寫成映象文件,運(yùn)行dd if=/dev/ram of=ram30.img bs=1k count=25600
收縮,并在/root目錄下產(chǎn)生 一個(gè)收縮的映象文件ram30.img.gz,運(yùn)行g(shù)zip –9v ram30.img
3.2創(chuàng)立 initrd ramdisk 映像
首先我們?cè)?dev/ram0中創(chuàng)立一個(gè)適宜大小的ext2文件系統(tǒng) ,法子 同上,只是大小只有2048K,因?yàn)閕nitrd ramdisk是用來(lái)指示(bootstrap)30M的ramdisk,并將它掛載至/mnt/ram。
然后在/dev/ram0中建立 映像需要 的目錄和文件。創(chuàng)立目錄bin、dev、etc、lib、mnt和可履行腳本文件linuxrc,linuxrc的內(nèi)容為:
#!/bin/bash
mount –o –ro /dev/hda1/ /mnt # 以只讀法子 將flash盤掛載在/mnt下
zcat /mnt/boot/ram30.img.gz > /dev/ram # 將根文件系統(tǒng) 映像解壓至ram
umount /dev/hda1 # 卸載flash盤
bin下面為linuxrc中用到的命令;lib為這些命令需要 的動(dòng)態(tài)鏈接庫(kù);etc下為配置文件ld.so.conf,定義命令運(yùn)行時(shí)尋找所需動(dòng)態(tài)鏈接庫(kù)的路徑,運(yùn)行命令ldconfig –r /mnt/ram產(chǎn)生 文件ld.so.cach,在命令和動(dòng)態(tài)鏈接庫(kù)之間建立 對(duì)應(yīng)關(guān)系;dev下根基終端設(shè)備 和linuxrc中用到的設(shè)備 :console、ram、null、systty、tty1、tty2和hda1;mnt為hda1的掛載點(diǎn)。
最后創(chuàng)立收縮的initrd ramdisk映像。
運(yùn)行df 看看/dev/ram0的字節(jié)數(shù),在我的盤算機(jī)上1684K;
轉(zhuǎn)換當(dāng)前目錄至/root并卸載/dev/ram0 umount /dev/ram0;
拷貝/dev/ram0成映像文件 dd if=/dev/ram0 of=initrd.img bs=1k count=1684;
產(chǎn)生 收縮的映像文件initrd.img.gz,運(yùn)行g(shù)zip -9v initrd.img。
3.3啟動(dòng)
系統(tǒng) 的啟動(dòng)需要 依賴flash盤,通過(guò)LILO把系統(tǒng) 啟動(dòng)信息寫入flash盤主指示區(qū)。
將flash盤作為第一主盤hda,而將裝有普通Linux的硬盤作為第一從盤hdb并從它啟動(dòng)。在flash硬盤上創(chuàng)立 ext2文件系統(tǒng) ,將它掛載至/mnt/flash目錄。在flash盤上建立 boot目錄,將收縮的文件系統(tǒng) 和initrd映像拷貝至boot目錄下,同時(shí)將Linux內(nèi)核、指示區(qū)記載 boot.b、指示區(qū)映射map拷貝至其下。在普通Linux系統(tǒng) 中建立 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
運(yùn)行命令lilo –C ramlilo.conf ,將啟動(dòng)信息寫入flash的主指示區(qū)MBR。
重新啟動(dòng)盤算機(jī),登陸后運(yùn)行mount,我們看到如下兩項(xiàng):
/dev/ram on / ext2 (rw)
none on /proc type proc (rw)
這顯示只有ramdisk被掛載,制作 成功 。
4 結(jié)論
在我們制作 的嵌入式Linux中進(jìn)行各種操作,速度非?,而且系統(tǒng) 很穩(wěn)固。沒(méi)有出現(xiàn)因?yàn)楦募到y(tǒng) 毀壞而導(dǎo)致系統(tǒng) 進(jìn)入手工掩護(hù)界面的現(xiàn)象。用它作為HTTP網(wǎng)絡(luò)服務(wù)器、網(wǎng)絡(luò)監(jiān)督器、寬帶通信 設(shè)備 管理器或者其他需要 長(zhǎng)光陰不停運(yùn)行的機(jī)器,都有很高的利用價(jià)值。
參考文獻(xiàn)
1.鄒思鐵 嵌入式Linux設(shè)計(jì)與利用 清華大學(xué)出版社 2002 北京
2.黃敦 如何結(jié)構(gòu)嵌入式Linux系統(tǒng) 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í)現(xiàn)嵌入式Linux的新法子】相關(guān)文章:
一個(gè)嵌入式系統(tǒng)的Petri網(wǎng)模型與CPLD實(shí)現(xiàn)05-29
ARM Linux啟動(dòng)過(guò)程分析06-17
都市頻道制作網(wǎng)的設(shè)計(jì)與實(shí)現(xiàn)05-29
基于minigui的網(wǎng)真機(jī)界面的實(shí)現(xiàn)08-05
基于Gene8310的嵌入式家庭服務(wù)機(jī)器人05-11
嵌入式實(shí)時(shí)網(wǎng)絡(luò)通信技術(shù)淺析論文(精選7篇)07-26
城市旅游網(wǎng)站的設(shè)計(jì)與實(shí)現(xiàn)論文(精選6篇)05-07