![構(gòu)建嵌入式linux(詳細(xì)步驟)參考模板_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/aa676290-24bc-428e-846f-56e772592fdb/aa676290-24bc-428e-846f-56e772592fdb1.gif)
![構(gòu)建嵌入式linux(詳細(xì)步驟)參考模板_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/aa676290-24bc-428e-846f-56e772592fdb/aa676290-24bc-428e-846f-56e772592fdb2.gif)
![構(gòu)建嵌入式linux(詳細(xì)步驟)參考模板_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/aa676290-24bc-428e-846f-56e772592fdb/aa676290-24bc-428e-846f-56e772592fdb3.gif)
![構(gòu)建嵌入式linux(詳細(xì)步驟)參考模板_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/aa676290-24bc-428e-846f-56e772592fdb/aa676290-24bc-428e-846f-56e772592fdb4.gif)
![構(gòu)建嵌入式linux(詳細(xì)步驟)參考模板_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/aa676290-24bc-428e-846f-56e772592fdb/aa676290-24bc-428e-846f-56e772592fdb5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、如何構(gòu)建嵌入式linux操作系統(tǒng)第一章前言目的本文的目的,是講述嵌入式Linux 系統(tǒng)的建立、開發(fā)的一般過(guò)程。制作一個(gè)小型的Linux的系統(tǒng),可以移植至其它硬盤、軟盤、優(yōu)盤、flash rom做一個(gè)嵌入式Linux系統(tǒng)究竟要做哪些工作做一個(gè)嵌入式 Linux 系統(tǒng)究竟需要做哪些工作?也就是本文究竟要講述哪些內(nèi)容?我先介紹一個(gè)脈絡(luò),可以做為我們后面工作的一個(gè)總的提綱:第一步、建立交叉編譯環(huán)境沒有交叉開發(fā)經(jīng)驗(yàn)的讀者,可能一時(shí)很難接受這個(gè)概念。首先,要明白兩個(gè)概念:一般我們工作的機(jī)器,稱為開發(fā)機(jī)、主機(jī);我們制作好的系統(tǒng)將要放到某臺(tái)機(jī)器,如手機(jī)或另一臺(tái)PC機(jī),這臺(tái)機(jī)我們稱為目標(biāo)主機(jī)。我們一般開發(fā)機(jī)上已
2、經(jīng)有一套開發(fā)工具,我們稱之為原生開發(fā)套件,我們一般就是用它們來(lái)寫程序,那么,那什么又是交叉編譯環(huán)境呢?其實(shí)一點(diǎn)也不神秘,也就是在開發(fā)機(jī)上再安裝一套開發(fā)工具,這套開發(fā)工具編譯出來(lái)的程序,如內(nèi)核、系統(tǒng)工作或者我們自己的程序,是放在目標(biāo)主機(jī)上運(yùn)行的。那么或許有初學(xué)者會(huì)問,直接用原生開發(fā)工具為目標(biāo)主機(jī)編譯程序不就完了?至少我當(dāng)初是這么想的。一般來(lái)說(shuō),我們的開發(fā)機(jī)都是X86 平臺(tái),原生開發(fā)套件開發(fā)的工具,也針對(duì)X86 平臺(tái),而我們的目標(biāo)主機(jī)可能是PowerPC、IXP、MIPS所以,我們的交叉編譯環(huán)境是針對(duì)某一類具體平臺(tái)的。一般來(lái)講,交叉開發(fā)環(huán)境需要二進(jìn)制工具程序、編譯器、C鏈接庫(kù),嵌入式開發(fā)常用的這三
3、類軟件是:BinutilsGccuClibc當(dāng)然,GNU包含的工具套件不僅于此,你還要以根據(jù)實(shí)際需要,進(jìn)行選擇第二步、編譯內(nèi)核開發(fā)工具是針對(duì)某一類硬件平臺(tái),內(nèi)核同樣也是。這一步,我們需要用第一步中建立的工具,對(duì)內(nèi)核進(jìn)行編譯,對(duì)于有內(nèi)核編譯經(jīng)驗(yàn)的人來(lái)說(shuō),這是非常簡(jiǎn)單的;第三步、建立根文件系統(tǒng)也就是建立我們平??吹降腷in、dev、proc這一大堆目錄,以及一些必備的文件;另外,我們還需要為我們的目標(biāo)系統(tǒng)安裝一些常用的工具軟件,如ls、ifconfig當(dāng)然,一個(gè)辦法是找到這些工具的源代碼,用第一步建立的交叉編譯工具來(lái)編譯,但是這些軟件一2 / 16是數(shù)量多,二是某些體積較大,不適合嵌入式系統(tǒng),這一
4、步,我們一般都是用busybox來(lái)完成的,包括系統(tǒng)引導(dǎo)軟件init;最后,我們?yōu)橄到y(tǒng)還需要建立初始化的引導(dǎo)文件,如inittab第四步、啟動(dòng)系統(tǒng)在這一步,我們把建立好的目標(biāo)、文件、程序、內(nèi)核及模塊全部拷貝到目標(biāo)機(jī)存儲(chǔ)器上,如硬盤。然后為系統(tǒng)安裝bootloader,對(duì)于嵌入式系統(tǒng),有許多引導(dǎo)程序可供我們使用。不過(guò)它們?cè)S多都有硬件平臺(tái)的限制。當(dāng)然,如果你是工作在X86,可以直接用lilo來(lái)引導(dǎo),事實(shí)上,本文就是采用的lilo。做到這一步,將目標(biāo)存儲(chǔ)設(shè)備掛上目標(biāo)機(jī),如果順利,就可以啟動(dòng)系統(tǒng)了。當(dāng)然,針對(duì)某些特別的平臺(tái),不能像硬盤這樣拷貝了,需要讀卡器、燒錄但是基本的方法是相通的!第五步、優(yōu)化和個(gè)性
5、化系統(tǒng)通過(guò)前四步,我們已經(jīng)得到了一個(gè)可以正常工作的系統(tǒng)。在這一步里,就是發(fā)揮你想像的時(shí)候了本文的工作環(huán)境項(xiàng)目根目錄/home/kendo/project ->我將它指定至PATH:$PRJROOT子目錄及說(shuō)明目錄內(nèi)容bootloader 目標(biāo)板的引導(dǎo)加載程序,如lilo等build-tools 建立交叉編譯平臺(tái)的工具源碼debug 調(diào)試工具及所有相關(guān)包doc 項(xiàng)目中用到的所有文檔images 編譯好的內(nèi)核映像,以及根文件系統(tǒng)kernel 各個(gè)版本的Linux 內(nèi)核源碼rootfs 制作好的根文件系統(tǒng)sysapps 目標(biāo)板將要用到的系統(tǒng)應(yīng)用系統(tǒng),比如thttpd,udhcpd 等tmp 存
6、放臨時(shí)文件tools 編譯好的跨平臺(tái)開發(fā)工具鏈以及C鏈接庫(kù)工作的腳本#!/usr/binexport PROJECT=skynetexport PRJROOT=/home/$PROJECTexport TARGET=i386-linuxexport PREFIX=$PRJROOT/toolsexport TARGET_PREFIX=$PREFIX/$TARGETexport PATH=$PREFIX/bin:/bin:/sbin:/usr/bin:/usr/sbincd $PRJROOT第二章建立交叉編譯環(huán)境在 CU中發(fā)表的另一篇同名的貼子里,我講述了一個(gè)全手工創(chuàng)建交叉編譯環(huán)境的方法。目前,創(chuàng)
7、建交叉編譯環(huán)境,包括建立根文件,一般來(lái)講,有兩種方法:手功創(chuàng)建可以得到最大程序的個(gè)性化定制,缺點(diǎn)是過(guò)程繁雜,特別是極易出錯(cuò),注意這個(gè)“極”字,包括有經(jīng)驗(yàn)的開發(fā)人員;自動(dòng)創(chuàng)建無(wú)它,方便而。因?yàn)榍耙黄恼轮?,已?jīng)講述了全手工創(chuàng)建交叉編譯環(huán)境的一般性方法,本文就不打算再重復(fù)這個(gè)步驟了,感興趣的朋友,可以再去搜索那篇貼子,提醒一點(diǎn)的就是,在準(zhǔn)備工具鏈的時(shí)候,要注意各個(gè)工具版本之間的搭配、每個(gè)工具需要哪些補(bǔ)丁,我建議你在google上針對(duì)這兩項(xiàng)搜索一下,準(zhǔn)備一個(gè)清單,否則本章要講述的是自動(dòng)創(chuàng)建交叉編譯環(huán)境的方法。目標(biāo),針對(duì)商業(yè)硬件平臺(tái),廠家都會(huì)為你提供一個(gè)開發(fā)包,我用過(guò)XX 廠家的IXP425 和MIP
8、S 的,非常地方便,記得我第一次接觸嵌入式開發(fā),拿著這個(gè)開發(fā)包自動(dòng)化創(chuàng)建交叉編譯環(huán)境、編譯內(nèi)核、建立根文件系統(tǒng)、創(chuàng)建Ram Disk,我反復(fù)做了三四次,結(jié)果還不知道自己究竟做了些什么,呵呵,夠傻吧所以,建議沒有這方面經(jīng)驗(yàn)的讀者,還是首先嘗試一下手工創(chuàng)建的方法吧,而本章接下來(lái)的內(nèi)容,是送給曾經(jīng)被它深深傷害而不想再次去親歷這項(xiàng)工作而又想提高交率而又在通用平臺(tái)上工作沒有商業(yè)開發(fā)包的朋友。建立交叉開發(fā)工具鏈準(zhǔn)備工具:buildroot-0.9.27.tar.tar只需要一個(gè)軟件?對(duì),其它的不用準(zhǔn)備了,buildroot 事實(shí)上是一個(gè)腳本與補(bǔ)丁的集合,其它需要用到的軟件,如gcc、uClibc,你只需在
9、buildroot 中指明相應(yīng)的版本,它會(huì)自動(dòng)去給你下載。事實(shí)上,buildroot 到網(wǎng)上去下載所需的所有工作是需要時(shí)間的,除非你的帶寬足夠,否則下載軟件時(shí)間或許會(huì)占去80%,而我在做這項(xiàng)工作之間,所需的工作鏈全部都在我本地硬盤上,我解壓開buildroot后,新建dl 文件夾,將所有工具源碼的壓縮包拷貝進(jìn)去,呵呵,buildroot 就不用去網(wǎng)上下載了。我的軟件清單:Linux-libc-headers-2.4.27.tar.bz2Gcc-3.3.4.tar.bz2binutils .2.tar.bz2uClibc 0.9.27.tar.bz2genext2fs_1.3.
10、orig.tar.gzccache-2.3.tar.gz將它拷貝到$PRJROOT/build-tools下,解壓rootskynet build-tools# tar jxvf buildroot-0.9.27.tar.tarrootskynet build-tools#cd buildroot配置它:rootskynet build-tools#make menuconfigTarget Architecture (i386) -> 選擇硬件平臺(tái),我的是i386Build options -> 編譯選項(xiàng)這個(gè)選項(xiàng)下重要的是($PRJROOT/tools) Toolchain an
11、d header file location?編譯好的工具鏈放在哪兒?如果你像我一樣,所有工具包都在本地,不需它到網(wǎng)上自動(dòng)下載,可以把wget command選項(xiàng)清空;Toolchain Options -> 工具鏈選項(xiàng)- Kernel Header Options 頭文件它會(huì)自動(dòng)去下載,不過(guò)應(yīng)該保證與你將要用的內(nèi)核是同一個(gè)版本; Use the daily snapshot of uClibc? 使用最近的uClibc的snapshotBinutils Version (binutils .2) -> Binutils的版本GCC compiler Versio
12、n (gcc 3.4.2) -> gcc 版本* Build/install c+ compiler and libstdc+? Build/install java compiler and libgcj? 支持的語(yǔ)言,我沒有選擇java Enable ccache support? 啟用ccache的支持,它用于編譯時(shí)頭文件的緩存處理,用它來(lái)編譯程序,第一次會(huì)有點(diǎn)慢,但是以后的速度可就很理想了,呵呵- Gdb Options 根據(jù)你的需要,選擇gdb 的支持Package Selection for the target ->這一項(xiàng)我沒有選擇任意一項(xiàng),因?yàn)槲掖蛩愀募到y(tǒng)及bu
13、sybox 等工具鏈創(chuàng)建成工,手工來(lái)做。Target Options -> 文件系統(tǒng)類型,根據(jù)實(shí)際需要選,我用的ext2;配置完成后,編譯它:rootskynet build-tools#make這一項(xiàng)工作是非?;〞r(shí)間的,我的工具包全部在本地,也花去我一小時(shí)十三分的時(shí)間,如果全要下載,我估計(jì)網(wǎng)速正常也要多花一兩個(gè)鐘頭。經(jīng)過(guò)漫長(zhǎng)的等待(事實(shí)上并不漫長(zhǎng),去打了幾把游戲,很快過(guò)去了):make1: Leaving directory /home/skynet/build-tools/buildroot/build_i386/genext2fs-1.3'touch -c /home/sk
14、ynet/build-tools/buildroot/build_i386/genext2fs-1.3/genext2fs#-find /home/skynet/build-tools/buildroot/build_i386/root/lib -type f -name *.so* | xargs/home/skynet/tools/bin/i386-linux-uclibc-strip -remove-section=.comment-remove-section=.note -strip-unneeded 2>/dev/null | true;/home/skynet/build-
15、tools/buildroot/build_i386/genext2fs-1.3/genext2fs -i 503 -b 1056 -d /home/skynet/build-tools/buildroot/build_i386/root -q -Dtarget/default/device_table.txt /home/skynet/build-tools/buildroot/root_fs_i386.ext2大功告成!清點(diǎn)戰(zhàn)利品讓我來(lái)看看它究竟做了哪些事情吧:rootskynet skynet# cd toolsrootskynet tools# lsbin bin-ccache i38
16、6-linux i386-linux-uclibc include info lib libexec man usrbin:所有的編譯工具,如gcc,都在這兒了,只是加了些指定的前綴;bin-ccache:如果在Toolchain optaion中沒有選擇對(duì)ccache的支持,就沒有這一項(xiàng)了;i386-linux:鏈接文件;實(shí)際指向includei386-linux-uclibc:uclibc的相關(guān)工具;include:供交叉開發(fā)工具使用的頭文件;info:gcc 的info文件;lib:供交叉開發(fā)工具使用的鏈接庫(kù)文件;現(xiàn)在可以把編譯工具所在目錄XXX/bin添加至PATH 了測(cè)試工具鏈如果你
17、現(xiàn)在寫一個(gè)程序,用i386-linux-gcc來(lái)編譯,運(yùn)行的程序會(huì)告訴你:./test: linked against GNU libc因?yàn)槌绦蜻\(yùn)行庫(kù)會(huì)尋到默認(rèn)的/lib:/usr/lib 上面去,而我們目前的uclibc的庫(kù)并不在那里(雖然對(duì)于目標(biāo)機(jī)來(lái)講,這是沒有錯(cuò)的),所以,也只能暫時(shí)靜態(tài)編譯,試試它能否工作了。當(dāng)然,你也可以在建好根文件系統(tǒng)后,試試用chroot第三章 編譯內(nèi)核本章的工作,是為目標(biāo)機(jī)建立一個(gè)合適的內(nèi)核,對(duì)于建立內(nèi)核,我想有兩點(diǎn)值得考慮的:1、功能上的選擇,應(yīng)該能夠滿足需要的情況下,盡量地?。?、小不是最終目的,穩(wěn)定才是;所以,最好編譯內(nèi)核前有一份目標(biāo)機(jī)硬件平臺(tái)清單以及所需
18、功能清單,這樣,才能更合理地裁減內(nèi)核。準(zhǔn)備工具Linux 內(nèi)核源碼,我選用的是Linux-2.4.27.tar.bz2編譯內(nèi)核將 Linux-2.4.27.tar.bz2 拷貝至$PRJROOT/kernel,解壓#cd linux-2.4.27/配置# make ARCH=i386 CROSS_COMPILE=i386-linux- menuconfig/建立源碼的依存關(guān)系# make ARCH=i386 CROSS_COMPILE=i386-linux- clean dep/建立內(nèi)核映像# make ARCH=i386 CROSS_COMPILE=i386-linux- bzImageAR
19、CH 指明了硬件平臺(tái),CROSS_COMPILE 指明了這是交叉編譯,且編譯器的名稱為i386-linux-XXX,這里沒有為編譯器指明路徑,是因?yàn)槲仪懊嬉褜⑵浼尤胫镰h(huán)境變量PATH。又是一個(gè)漫長(zhǎng)的等待OK,編譯完成,673K,稍微大了點(diǎn),要移到其它平臺(tái),或許得想辦法做到512 以下才好,回頭來(lái)想辦法做這個(gè)工作。安裝內(nèi)核內(nèi)核編譯好后,將內(nèi)核及配置文件拷貝至$PRJROOT/images 下。# cp arch/i386/boot/bzImage $PRJROOT/images/bzImage-2.4.27-rmk5# cp vmlinux $PRJROOT/images/vmlinux-2.4
20、.27-rmk5# cp System.map $PRJROOT/images/System-2.4.27-rmk5# cp .config $PRJROOT/images/2.4.27-rmk5我采用了后綴名的方式重命名,以便管理多個(gè)不同版本的內(nèi)核,當(dāng)然,你也可以不用這樣,單獨(dú)為每個(gè)版本的內(nèi)核在images下新建對(duì)應(yīng)文件夾也是可行的。安裝內(nèi)核模塊完整內(nèi)核的編譯后,剩下的工作就是建立及安裝模塊了,因?yàn)槲业膬?nèi)核并沒有選擇模塊的支持(這樣擴(kuò)展性差了一點(diǎn),但是對(duì)于我的系統(tǒng)來(lái)說(shuō),功能基本上定死了,這樣影響也不太大),所以,剩下的步驟也省去了,如果你還需要模塊的支持,應(yīng)該:/建立模塊#make ARCH
21、=i386 CROSS_COMPILE=i386-linux- modules/安裝內(nèi)核模塊至$PRJROOT/images#make ARCH=i386 CROSS_COMPILE= i386-linux- >INSTALL_MOD_PATH=$PRJROOT/images/modules-2.4.18-rmk5 >modules_install最后一步是為模塊建立依存關(guān)系,不能使用原生的depmod來(lái)建立,而需要使用交叉編譯工具。需要用到busybox 中的depmod.pl腳本,很可惜,我在busybox1.0.0中,并沒有找到這個(gè)腳本,所以,還是借用了busybox0.63
22、中scripts中的depmod.pl。將 depmod.pl拷貝至$PREFIX/bin目錄中,也就是交叉編譯工具鏈的bin目錄。#depmod.pl >-k ./vmlinux F ./System.map >-b $PRJROOT/images/modules-2.4.27-rmk5/lib/modules > >$PRJROOT/images/modules-2.4.27-rmk5/lib/modules/2.4.27-rmk5/modules.dep注:后面討論移植內(nèi)核和模塊內(nèi)容時(shí),我只會(huì)提到內(nèi)核的拷貝,因?yàn)槲业南到y(tǒng)并沒有模塊的支持。如果你需要使用模塊,只需按
23、相同方法將其拷貝至相應(yīng)目錄即可。附,內(nèi)核編譯清單附,內(nèi)核選擇:內(nèi)核編譯記錄:Code maturity level options 不選Loadable module support 不選Processor type and features 根據(jù)實(shí)際,選擇處理器類型General setup ->* Networking support* PCI support(Any) PCI access mode* PCI device name database* System V IPC* Sysctl support(ELF) Kernel core (/proc/kcore) forma
24、t* Kernel support for ELF binaries* Power Management supportMemory Technology Devices (MTD) -> MTD 設(shè)備,我用CF卡,不選Parallel port support -> 不選Plug and Play configuration -> 我的系統(tǒng)用不著即插即用,不選Block devices ->* Loopback device support* RAM disk support(4096) Default RAM disk size (NEW)* Initial RAM
25、 disk (initrd) supportMulti-device support (RAID and LVM) -> 不選Networking options -> 基本上都選了ATA/IDE/MFM/RLL support -> 用了默認(rèn)的Telephony Support -> 不選SCSI support -> 不選Fusion MPT device support -> 不選I2O device support -> 不選Network device support -> 根據(jù)實(shí)際情況選擇Amateur Radio support -
26、> 不選IrDA (infrared) support -> 不選ISDN subsystem -> 不選Old CD-ROM drivers (not SCSI, not IDE) -> 不選Input core support -> 不選Character devices ->* Virtual terminal* Support for console on virtual terminal* Standard/generic (8250/16550 and compatible UARTs) serial support* Support for c
27、onsole on serial portMultimedia devices -> 不選File systems ->* Kernel automounter version 4 support (also supports v3)* Virtual memory file system support (former shm fs)* /proc file system support* Second extended fs supportConsole drivers ->* VGA text console 調(diào)試時(shí)接顯示器用剩下三個(gè)都不要Sound ->USB
28、support ->Kernel hacking ->第四章 建立根文件系統(tǒng)1、建立目錄構(gòu)建工作空間時(shí),rootfs 文件夾用來(lái)存放根文件系統(tǒng),#cd rootfs根據(jù)根文件系統(tǒng)的基本結(jié)構(gòu),建立各個(gè)對(duì)應(yīng)的目錄:# mkdir bin dev etc lib proc sbin tmp usr var root home# chmod 1777 tmp# mkdir usr/bin usr/lib usr/sbin# lsdev etc lib proc sbin tmp usr var# mkdir var/lib var/lock var/log var/run var/tmp#
29、 chmod 1777 var/tmp對(duì)于單用戶系統(tǒng)來(lái)說(shuō),root 和home并不是必須的。準(zhǔn)備好根文件系統(tǒng)的骨架后,把前面建立的文件安裝到對(duì)應(yīng)的目錄中去。2、拷貝鏈接庫(kù)把uclibc的庫(kù)文件拷貝到剛才建立的lib 文件夾中:# cd $PREFIX/librootskynet lib# cp *-*.so $PRJROOT/rootfs/librootskynet lib# cp -d *.so.*0-9 $PRJROOT/rootfs/lib3、拷貝內(nèi)核映像和內(nèi)核模塊因?yàn)闆]有模塊,所以拷貝模塊就省了,新建boot 目錄,把剛才建立好的內(nèi)核拷貝過(guò)來(lái)# cd /home/kendo/contr
30、ol-project/daq-module/rootfs/# mkdir boot# cd $PRJROOT/images# cp bzImages-2.4.18-rmk5 /home/kendo/control-project/daq-module/rootfs/boot4、建立/dev 下邊的設(shè)備文件在 linux 中,所有的的設(shè)備文件都存放在/dev中,使用mknod命令創(chuàng)建基本的設(shè)備文件。mknod 命令需要root 權(quán)限,不過(guò)偶本身就是用的root 用戶,本來(lái)是新建了一個(gè)用戶專門用于嵌入式制作的,不過(guò)后來(lái)忘記用了# mknod -m 600 mem c 1 1# mknod -m 6
31、66 null c 1 3# mknod -m 666 zero c 1 5# mknod -m 644 random c 1 8# mknod -m 600 tty0 c 4 0# mknod -m 600 tty1 c 4 1# mknod -m 600 ttyS0 c 4 64# mknod -m 666 tty c 5 0# mknod -m 600 console c 5 1基本的設(shè)備文件建立好后,再創(chuàng)建必要的符號(hào)鏈接:# ln -s /proc/self/fd fd# ln -s fd/0 stdin# ln -s fd/1 stdout# ln -s fd/2 stderr# l
32、sconsole fd mem null random stderr stdin stdout tty tty0 tty1 ttyS0 zero設(shè)備文件也可以不用手動(dòng)創(chuàng)建,聽說(shuō)RedHat /dev下的腳本MAKEDEV 可以實(shí)現(xiàn)這一功能,不過(guò)沒有試過(guò)基本上差不多了,不過(guò)打算用硬盤/CF卡來(lái)做存儲(chǔ)設(shè)備,還需要為它們建立相關(guān)文件,因?yàn)槲业腃F在目標(biāo)機(jī)器上是CF-to-IDE,可以把它們等同來(lái)對(duì)待,先看看Redhat 下邊had的相關(guān)屬性:# ls -l /dev/hdabrw-rw- 1 root disk 3, 0 Jan 30 2003 /dev/hda# ls -l /dev/hda1br
33、w-rw- 1 root disk 3, 1 Jan 30 2003 /dev/hda1對(duì)比一下,可以看出,had類型是b,即塊設(shè)備,主編號(hào)為3,次編號(hào)從0 遞增,根限位是rw-rw-,即660,所以:# mknod -m 660 hda b 3 0# mknod -m 660 hda1 b 3 1# mknod -m 660 hda2 b 3 2# mknod -m 660 hda3 b 3 35、添加基本的應(yīng)用程序未來(lái)系統(tǒng)的應(yīng)用程序,基本上可以分為三類:u 基本系統(tǒng)工具,如ls、ifconfig這些u 一些服務(wù)程序,管理工具,如WEB、Telnetu 自己開發(fā)的應(yīng)用程序這里先添加基本的系統(tǒng)
34、工具,有想過(guò)把這些工具的代碼下載下來(lái)交叉編譯,不過(guò)實(shí)在是麻煩,用BusyBox,又精簡(jiǎn)又好用將 busybox-1.00.tar.gz 下載至sysapps 目錄下,解壓:#tar zxvf busybox-1.00.tar.gz#cd busybox-1.00/進(jìn)入配置菜單#make TARGET_ARCH=i386 CROSS=i386-linux- PREFIX=$PRJROOT/rootfs menuconfig/建立依存關(guān)系#make TARGET_ARCH=i386 CROSS= i386-linux- PREFIX=$PRJROOT/rootfs dep/編譯#make TARG
35、ET_ARCH=i386 CROSS= i386-linux- PREFIX=$PRJROOT/rootfs/安裝#make TARGET_ARCH=i386 CROSS= i386-linux- PREFIX=$PRJROOT/rootfs install# cd $PRJROOT/rootfs/bin# lsaddgroup busybox chown delgroup echo kill ls mv ping rmsleepadduser chgrp cp deluser grep ln mkdir netstat ps rmdirumountash chmod date dmesg h
36、ostname login mount pidof pwd shvi一下子多了這么多命令配置 busybox 的說(shuō)明:A、如果編譯時(shí)選擇了:Runtime SUID/SGID configuration via /etc/busybox.conf系統(tǒng)每次運(yùn)行命令時(shí),都會(huì)出現(xiàn)“Using fallback suid method ”可以將它去掉,不過(guò)我還是在/etc為其建了一個(gè)文件busybox.conf搞定;B 、* Do you want to build BusyBox with a Cross Compiler?(i386-linux-gcc) Cross Compiler prefix
37、這個(gè)指明交叉編譯器名稱(其實(shí)在編譯時(shí)的命令行已指定過(guò)了)C、安裝選項(xiàng)下的($PRJROOT/rootfs) BusyBox installation prefix,這個(gè)指明了編譯好后的工具的安裝目錄。D、靜態(tài)編譯好還是動(dòng)態(tài)編譯好?即是否選擇 Build BusyBox as a static binary (no shared libs)動(dòng)態(tài)編譯的最大好處是節(jié)省了寶貴空間,一般來(lái)說(shuō)都是用動(dòng)態(tài)編譯,不過(guò)我以前動(dòng)態(tài)編譯出過(guò)問題(其實(shí)是庫(kù)的問題,不關(guān)busybox 的事),出于慣性,我選擇了靜態(tài)編譯,為此多付出了107KB的空間。E、其它命令,根據(jù)需要,自行權(quán)衡。6、系統(tǒng)初始化文件內(nèi)核啟動(dòng)時(shí),最后一
38、個(gè)初始化動(dòng)作就是啟動(dòng)init 程序,當(dāng)然,大多數(shù)發(fā)行套件的Linux都使用了與System V init相仿的init,可以在網(wǎng)上下載System V init套件,下載下來(lái)交叉編譯。另外,我也找到一篇寫得非常不錯(cuò)的講解如何編寫初始化文件的文件,bsd-init,回頭附在后面。不過(guò),對(duì)于嵌入式系統(tǒng)來(lái)講,BusyBox init可能更為合適,在第6 步中選擇命令的時(shí)候,應(yīng)該把init編譯進(jìn)去。#cd $PRJROOT/rootfs/etc#vi inittab我的inittal文件如下:#指定初始化文件:sysinit:/etc/init.d/rcS#打開一個(gè)串口,波特率為9600:respaw
39、n:/sbin/getty 9600 ttyS0#啟動(dòng)時(shí)執(zhí)行的shell:respawn:/bin/sh#重啟時(shí)動(dòng)作:restart:/sbin/init#關(guān)機(jī)時(shí)動(dòng)作,卸載所有文件系統(tǒng):shutdown:/bin/umount -a r保存退出;再來(lái)編寫rcS腳本:#mkdir $PRJROOT/rootfs/etc/init.d#cd $PRJROOT/rootfs/etc/init.d#vi rcS我的腳本如下:#!/bin/sh#Set PathPATH=/sbin:/binexport PATHsyslogd -m 60klogd#install /procmount -n -t pr
40、oc none /proc#reinstall root file system by read/write mode(need: /etc/fstab)mount -n -o remount,rw /#reinstall /procmount -n -o remount,rw -t proc none /proc#set lo ip addressifconfig lo #set eth0 ip address#當(dāng)然,這樣子做只是權(quán)宜之計(jì),最后做的應(yīng)該是在這一步引導(dǎo)網(wǎng)絡(luò)啟動(dòng)腳本,像RedHat#那樣,自動(dòng)讀取所有指定的配置文件來(lái)啟動(dòng)ifconfig eth0 192.168
41、.0.68 netmask #set route#同樣的,最終這里應(yīng)該是運(yùn)行啟動(dòng)路由的腳本,讀取路由配置文件route add default gw #還差一個(gè)運(yùn)行服務(wù)程序的腳本,哪位有現(xiàn)成的么?#網(wǎng)卡/路由/服務(wù)這三步,事實(shí)上可以合在一步,在rcS這一步中,做一個(gè)循環(huán),運(yùn)行指定啟動(dòng)目錄下的所有腳,先將就著這么做吧,確保系統(tǒng)能夠正常啟動(dòng)了,再來(lái)寫這個(gè)腳本。#set hostnamehostname MyLinux保存退出。編寫fstab文件#vi fstab我的fstab很簡(jiǎn)單:/dev/hda1 / ext2 defaults 1 1none
42、/proc proc defaults 0 0第五章 讓 MyLinux 能夠啟動(dòng)前一章,我們把編譯好的內(nèi)核、應(yīng)用程序、配置文件都拷貝至rootfs 目錄對(duì)應(yīng)的子目錄中去了,這一步,就是把這些文件移植至目標(biāo)機(jī)的存儲(chǔ)器。這里,我是先另外拿一塊硬盤,掛在我的開發(fā)機(jī)上做的測(cè)試,因?yàn)槲业谋颈居脕?lái)寫文檔,PC 機(jī)用來(lái)做開發(fā)機(jī),已經(jīng)沒有另外的機(jī)器了但是本章只是講述一個(gè)一般性的過(guò)程,并不影響你直接在目標(biāo)主機(jī)上的工作。因?yàn)橐院竽繕?biāo)機(jī)識(shí)別硬盤序號(hào)都是hda,而我現(xiàn)在直接掛上去,則會(huì)是hdb、hdc這樣,安裝lilo時(shí)有點(diǎn)麻煩(雖然也可以實(shí)現(xiàn))。所以我想了另一個(gè)辦法:u 把新硬盤掛在IDE0的primary上,進(jìn)
43、入linux后,會(huì)被認(rèn)為是had;u 原來(lái)主機(jī)的裝Redhat的硬盤,我將它從IDE0的primary上變到了IDE1 的primary,因?yàn)樗膌ilo早已裝好,基本上不影響系統(tǒng)的使用;分區(qū)和格式化BIOS中改為從第二個(gè)硬盤啟動(dòng);也就是從我原來(lái)開發(fā)機(jī)啟動(dòng),新的硬盤被識(shí)別成了had。#fdisk /dev/hda用d參數(shù)刪除已存在的所有分區(qū)用n參數(shù)新建一個(gè)分區(qū),也是就/dev/hda1格式化#mkfs.ext2 /dev/hda1安裝 bootloader因?yàn)槲沂荴86 平臺(tái),所以直接用了lilo,如果你是其這平臺(tái),當(dāng)然,有許多優(yōu)秀的bootloader 供你選擇,你只需查看其相應(yīng)的說(shuō)明就可以
44、了。編譯 lilo配置文件,我的配置文件名為target.lilo.conf,置于$PRJROOT/rootfs/etc目錄。內(nèi)容如下所示:boot=/dev/hdadisk=/dev/hdabios=0x80image=/boot/bzImage-2.4.18-rmk5label=Linuxroot=/dev/hda1append="root=/dev/hda1"read-only/新建文件夾,為mount 做新準(zhǔn)備#mkdir /mnt/cf/把目標(biāo)硬盤mount上來(lái)#mount t ext2 /dev/hdc1 /mnt/cf回到rootfs#cd $PRJROOT/
45、rootfs拷貝所有文件至目標(biāo)硬盤#cp r * /mnt/cf這樣,我們所有的文件都被安裝至目標(biāo)硬盤了,當(dāng)然,它還不能引導(dǎo),因?yàn)闆]有bootloader。使用如下命令:# lilo -r /mnt/cf -C etc/target.lilo.confWarning: LBA32 addressing assumedAdded Linux *-r :改變根目標(biāo)為/mnt/cf ,這樣配置文件其實(shí)就是/mnt/cf/etc/target.lilo.conf,也就是我們先前建立的文件。當(dāng)然,完成這一步,需要lilo22.3 及以后版本,如果你的版本太舊,比如Redhat9.0自帶的,就會(huì)出現(xiàn)下面的
46、信息:#lilo r /mnt/cf C etc/target.lilo.confFatal: open /boot/boot.b: No such file or directory這時(shí),你需要升級(jí)你的lilo,或者重新安裝一個(gè)。啟動(dòng)系統(tǒng)#umount /mnt/cf#reboot將 BIOS 改為從IDE0 啟動(dòng),也就是目標(biāo)硬盤。如果一切順利,你將順利進(jìn)入一個(gè)屬于你的系統(tǒng)。回頭再來(lái)看看我們的工作空間吧rootskynet lib# df /dev/hda1Filesystem 1K-blocks Used Available Use% Mounted on/dev/hda1 3953036
47、 1628 3750600 1% /mnt/cf總共花去了我1628KB 的空間,看來(lái)是沒有辦法放到軟盤里邊去了o,不過(guò)一味求小,并不是我的目標(biāo)。rootskynet skynet# ls $PRJROOTbootloader build-tools debug doc images kernel rootfs sysapps tmp tools這幾個(gè)目錄中的文件,呵呵,與本文一開頭規(guī)劃的一樣rootskynet skynet# ls build-tools/buildroot buildroot-0.9.27.tar.tar包含了buildroot源碼及壓縮包,事實(shí)上buildroot 下邊還包括了GNU其它工具的源碼、編譯文件等諸多內(nèi)容,是我們最重要的一個(gè)文件夾,不過(guò)到現(xiàn)在它已經(jīng)沒有多大用處了,如果你喜歡,可以將它刪除掉(不建議)。rootskynet skynet# ls images2.4.18-rmk5 bzImage-2.4.18-rmk5 System-2.4.18-rmk5 vmlinux-2.4.18-rmk5內(nèi)核映像及配置文件等,如果你有模塊,因?yàn)檫€有相應(yīng)的目錄rootskynet skynet# ls
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 商務(wù)合同范本
- 兩人股份合作合同范本
- 中藥材種苗購(gòu)銷合同
- 目標(biāo)決定未來(lái)
- 房屋買賣合同協(xié)議書26609
- 房產(chǎn)買賣中介合同
- 吊籃設(shè)備租賃合同書
- 中級(jí)財(cái)務(wù)會(huì)計(jì)案例講課教案
- 風(fēng)電項(xiàng)目主吊車裝拆方案
- 基于CiteSpace的AED配置國(guó)內(nèi)外研究現(xiàn)狀與進(jìn)展的可視化分析
- 中學(xué)安全辦2024-2025學(xué)年工作計(jì)劃
- 2024年山東省東營(yíng)市中考數(shù)學(xué)試題 (解析版)
- 2024年陜西西安亮麗電力集團(tuán)有限責(zé)任公司招聘筆試沖刺題(帶答案解析)
- 2024年鄉(xiāng)村振興(產(chǎn)業(yè)、文化、生態(tài))等實(shí)施戰(zhàn)略知識(shí)考試題庫(kù)與答案
- 網(wǎng)絡(luò)安全基礎(chǔ)知識(shí)入門教程
- AI智慧物流園區(qū)整體建設(shè)方案
- 2024年遼寧鐵道職業(yè)技術(shù)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 無(wú)痛人工流產(chǎn)術(shù)課件
- 心力衰竭業(yè)務(wù)學(xué)習(xí)護(hù)理課件
- 美發(fā)學(xué)徒助理職業(yè)規(guī)劃書
- 法醫(yī)病理學(xué)課件
評(píng)論
0/150
提交評(píng)論