![構建嵌入式linux(詳細步驟)參考模板_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/aa676290-24bc-428e-846f-56e772592fdb/aa676290-24bc-428e-846f-56e772592fdb1.gif)
![構建嵌入式linux(詳細步驟)參考模板_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/aa676290-24bc-428e-846f-56e772592fdb/aa676290-24bc-428e-846f-56e772592fdb2.gif)
![構建嵌入式linux(詳細步驟)參考模板_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/aa676290-24bc-428e-846f-56e772592fdb/aa676290-24bc-428e-846f-56e772592fdb3.gif)
![構建嵌入式linux(詳細步驟)參考模板_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/aa676290-24bc-428e-846f-56e772592fdb/aa676290-24bc-428e-846f-56e772592fdb4.gif)
![構建嵌入式linux(詳細步驟)參考模板_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/6/aa676290-24bc-428e-846f-56e772592fdb/aa676290-24bc-428e-846f-56e772592fdb5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、如何構建嵌入式linux操作系統(tǒng)第一章前言目的本文的目的,是講述嵌入式Linux 系統(tǒng)的建立、開發(fā)的一般過程。制作一個小型的Linux的系統(tǒng),可以移植至其它硬盤、軟盤、優(yōu)盤、flash rom做一個嵌入式Linux系統(tǒng)究竟要做哪些工作做一個嵌入式 Linux 系統(tǒng)究竟需要做哪些工作?也就是本文究竟要講述哪些內(nèi)容?我先介紹一個脈絡,可以做為我們后面工作的一個總的提綱:第一步、建立交叉編譯環(huán)境沒有交叉開發(fā)經(jīng)驗的讀者,可能一時很難接受這個概念。首先,要明白兩個概念:一般我們工作的機器,稱為開發(fā)機、主機;我們制作好的系統(tǒng)將要放到某臺機器,如手機或另一臺PC機,這臺機我們稱為目標主機。我們一般開發(fā)機上已
2、經(jīng)有一套開發(fā)工具,我們稱之為原生開發(fā)套件,我們一般就是用它們來寫程序,那么,那什么又是交叉編譯環(huán)境呢?其實一點也不神秘,也就是在開發(fā)機上再安裝一套開發(fā)工具,這套開發(fā)工具編譯出來的程序,如內(nèi)核、系統(tǒng)工作或者我們自己的程序,是放在目標主機上運行的。那么或許有初學者會問,直接用原生開發(fā)工具為目標主機編譯程序不就完了?至少我當初是這么想的。一般來說,我們的開發(fā)機都是X86 平臺,原生開發(fā)套件開發(fā)的工具,也針對X86 平臺,而我們的目標主機可能是PowerPC、IXP、MIPS所以,我們的交叉編譯環(huán)境是針對某一類具體平臺的。一般來講,交叉開發(fā)環(huán)境需要二進制工具程序、編譯器、C鏈接庫,嵌入式開發(fā)常用的這三
3、類軟件是:BinutilsGccuClibc當然,GNU包含的工具套件不僅于此,你還要以根據(jù)實際需要,進行選擇第二步、編譯內(nèi)核開發(fā)工具是針對某一類硬件平臺,內(nèi)核同樣也是。這一步,我們需要用第一步中建立的工具,對內(nèi)核進行編譯,對于有內(nèi)核編譯經(jīng)驗的人來說,這是非常簡單的;第三步、建立根文件系統(tǒng)也就是建立我們平??吹降腷in、dev、proc這一大堆目錄,以及一些必備的文件;另外,我們還需要為我們的目標系統(tǒng)安裝一些常用的工具軟件,如ls、ifconfig當然,一個辦法是找到這些工具的源代碼,用第一步建立的交叉編譯工具來編譯,但是這些軟件一2 / 16是數(shù)量多,二是某些體積較大,不適合嵌入式系統(tǒng),這一
4、步,我們一般都是用busybox來完成的,包括系統(tǒng)引導軟件init;最后,我們?yōu)橄到y(tǒng)還需要建立初始化的引導文件,如inittab第四步、啟動系統(tǒng)在這一步,我們把建立好的目標、文件、程序、內(nèi)核及模塊全部拷貝到目標機存儲器上,如硬盤。然后為系統(tǒng)安裝bootloader,對于嵌入式系統(tǒng),有許多引導程序可供我們使用。不過它們許多都有硬件平臺的限制。當然,如果你是工作在X86,可以直接用lilo來引導,事實上,本文就是采用的lilo。做到這一步,將目標存儲設備掛上目標機,如果順利,就可以啟動系統(tǒng)了。當然,針對某些特別的平臺,不能像硬盤這樣拷貝了,需要讀卡器、燒錄但是基本的方法是相通的!第五步、優(yōu)化和個性
5、化系統(tǒng)通過前四步,我們已經(jīng)得到了一個可以正常工作的系統(tǒng)。在這一步里,就是發(fā)揮你想像的時候了本文的工作環(huán)境項目根目錄/home/kendo/project ->我將它指定至PATH:$PRJROOT子目錄及說明目錄內(nèi)容bootloader 目標板的引導加載程序,如lilo等build-tools 建立交叉編譯平臺的工具源碼debug 調(diào)試工具及所有相關包doc 項目中用到的所有文檔images 編譯好的內(nèi)核映像,以及根文件系統(tǒng)kernel 各個版本的Linux 內(nèi)核源碼rootfs 制作好的根文件系統(tǒng)sysapps 目標板將要用到的系統(tǒng)應用系統(tǒng),比如thttpd,udhcpd 等tmp 存
6、放臨時文件tools 編譯好的跨平臺開發(fā)工具鏈以及C鏈接庫工作的腳本#!/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ā)表的另一篇同名的貼子里,我講述了一個全手工創(chuàng)建交叉編譯環(huán)境的方法。目前,創(chuàng)
7、建交叉編譯環(huán)境,包括建立根文件,一般來講,有兩種方法:手功創(chuàng)建可以得到最大程序的個性化定制,缺點是過程繁雜,特別是極易出錯,注意這個“極”字,包括有經(jīng)驗的開發(fā)人員;自動創(chuàng)建無它,方便而。因為前一篇文章中,已經(jīng)講述了全手工創(chuàng)建交叉編譯環(huán)境的一般性方法,本文就不打算再重復這個步驟了,感興趣的朋友,可以再去搜索那篇貼子,提醒一點的就是,在準備工具鏈的時候,要注意各個工具版本之間的搭配、每個工具需要哪些補丁,我建議你在google上針對這兩項搜索一下,準備一個清單,否則本章要講述的是自動創(chuàng)建交叉編譯環(huán)境的方法。目標,針對商業(yè)硬件平臺,廠家都會為你提供一個開發(fā)包,我用過XX 廠家的IXP425 和MIP
8、S 的,非常地方便,記得我第一次接觸嵌入式開發(fā),拿著這個開發(fā)包自動化創(chuàng)建交叉編譯環(huán)境、編譯內(nèi)核、建立根文件系統(tǒng)、創(chuàng)建Ram Disk,我反復做了三四次,結果還不知道自己究竟做了些什么,呵呵,夠傻吧所以,建議沒有這方面經(jīng)驗的讀者,還是首先嘗試一下手工創(chuàng)建的方法吧,而本章接下來的內(nèi)容,是送給曾經(jīng)被它深深傷害而不想再次去親歷這項工作而又想提高交率而又在通用平臺上工作沒有商業(yè)開發(fā)包的朋友。建立交叉開發(fā)工具鏈準備工具:buildroot-0.9.27.tar.tar只需要一個軟件?對,其它的不用準備了,buildroot 事實上是一個腳本與補丁的集合,其它需要用到的軟件,如gcc、uClibc,你只需在
9、buildroot 中指明相應的版本,它會自動去給你下載。事實上,buildroot 到網(wǎng)上去下載所需的所有工作是需要時間的,除非你的帶寬足夠,否則下載軟件時間或許會占去80%,而我在做這項工作之間,所需的工作鏈全部都在我本地硬盤上,我解壓開buildroot后,新建dl 文件夾,將所有工具源碼的壓縮包拷貝進去,呵呵,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) -> 選擇硬件平臺,我的是i386Build options -> 編譯選項這個選項下重要的是($PRJROOT/tools) Toolchain an
11、d header file location?編譯好的工具鏈放在哪兒?如果你像我一樣,所有工具包都在本地,不需它到網(wǎng)上自動下載,可以把wget command選項清空;Toolchain Options -> 工具鏈選項- Kernel Header Options 頭文件它會自動去下載,不過應該保證與你將要用的內(nèi)核是同一個版本; 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? 支持的語言,我沒有選擇java Enable ccache support? 啟用ccache的支持,它用于編譯時頭文件的緩存處理,用它來編譯程序,第一次會有點慢,但是以后的速度可就很理想了,呵呵- Gdb Options 根據(jù)你的需要,選擇gdb 的支持Package Selection for the target ->這一項我沒有選擇任意一項,因為我打算根文件系統(tǒng)及bu
13、sybox 等工具鏈創(chuàng)建成工,手工來做。Target Options -> 文件系統(tǒng)類型,根據(jù)實際需要選,我用的ext2;配置完成后,編譯它:rootskynet build-tools#make這一項工作是非?;〞r間的,我的工具包全部在本地,也花去我一小時十三分的時間,如果全要下載,我估計網(wǎng)速正常也要多花一兩個鐘頭。經(jīng)過漫長的等待(事實上并不漫長,去打了幾把游戲,很快過去了):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大功告成!清點戰(zhàn)利品讓我來看看它究竟做了哪些事情吧: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中沒有選擇對ccache的支持,就沒有這一項了;i386-linux:鏈接文件;實際指向includei386-linux-uclibc:uclibc的相關工具;include:供交叉開發(fā)工具使用的頭文件;info:gcc 的info文件;lib:供交叉開發(fā)工具使用的鏈接庫文件;現(xiàn)在可以把編譯工具所在目錄XXX/bin添加至PATH 了測試工具鏈如果你
17、現(xiàn)在寫一個程序,用i386-linux-gcc來編譯,運行的程序會告訴你:./test: linked against GNU libc因為程序運行庫會尋到默認的/lib:/usr/lib 上面去,而我們目前的uclibc的庫并不在那里(雖然對于目標機來講,這是沒有錯的),所以,也只能暫時靜態(tài)編譯,試試它能否工作了。當然,你也可以在建好根文件系統(tǒng)后,試試用chroot第三章 編譯內(nèi)核本章的工作,是為目標機建立一個合適的內(nèi)核,對于建立內(nèi)核,我想有兩點值得考慮的:1、功能上的選擇,應該能夠滿足需要的情況下,盡量地小;2、小不是最終目的,穩(wěn)定才是;所以,最好編譯內(nèi)核前有一份目標機硬件平臺清單以及所需
18、功能清單,這樣,才能更合理地裁減內(nèi)核。準備工具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/建立源碼的依存關系# make ARCH=i386 CROSS_COMPILE=i386-linux- clean dep/建立內(nèi)核映像# make ARCH=i386 CROSS_COMPILE=i386-linux- bzImageAR
19、CH 指明了硬件平臺,CROSS_COMPILE 指明了這是交叉編譯,且編譯器的名稱為i386-linux-XXX,這里沒有為編譯器指明路徑,是因為我前面已將其加入至環(huán)境變量PATH。又是一個漫長的等待OK,編譯完成,673K,稍微大了點,要移到其它平臺,或許得想辦法做到512 以下才好,回頭來想辦法做這個工作。安裝內(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我采用了后綴名的方式重命名,以便管理多個不同版本的內(nèi)核,當然,你也可以不用這樣,單獨為每個版本的內(nèi)核在images下新建對應文件夾也是可行的。安裝內(nèi)核模塊完整內(nèi)核的編譯后,剩下的工作就是建立及安裝模塊了,因為我的內(nèi)核并沒有選擇模塊的支持(這樣擴展性差了一點,但是對于我的系統(tǒ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最后一步是為模塊建立依存關系,不能使用原生的depmod來建立,而需要使用交叉編譯工具。需要用到busybox 中的depmod.pl腳本,很可惜,我在busybox1.0.0中,并沒有找到這個腳本,所以,還是借用了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)容時,我只會提到內(nèi)核的拷貝,因為我的系統(tǒng)并沒有模塊的支持。如果你需要使用模塊,只需按
23、相同方法將其拷貝至相應目錄即可。附,內(nèi)核編譯清單附,內(nèi)核選擇:內(nèi)核編譯記錄:Code maturity level options 不選Loadable module support 不選Processor type and features 根據(jù)實際,選擇處理器類型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 設備,我用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 -> 用了默認的Telephony Support -> 不選SCSI support -> 不選Fusion MPT device support -> 不選I2O device support -> 不選Network device support -> 根據(jù)實際情況選擇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)試時接顯示器用剩下三個都不要Sound ->USB
28、support ->Kernel hacking ->第四章 建立根文件系統(tǒng)1、建立目錄構建工作空間時,rootfs 文件夾用來存放根文件系統(tǒng),#cd rootfs根據(jù)根文件系統(tǒ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對于單用戶系統(tǒng)來說,root 和home并不是必須的。準備好根文件系統(tǒng)的骨架后,把前面建立的文件安裝到對應的目錄中去。2、拷貝鏈接庫把uclibc的庫文件拷貝到剛才建立的lib 文件夾中:# cd $PREFIX/librootskynet lib# cp *-*.so $PRJROOT/rootfs/librootskynet lib# cp -d *.so.*0-9 $PRJROOT/rootfs/lib3、拷貝內(nèi)核映像和內(nèi)核模塊因為沒有模塊,所以拷貝模塊就省了,新建boot 目錄,把剛才建立好的內(nè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 下邊的設備文件在 linux 中,所有的的設備文件都存放在/dev中,使用mknod命令創(chuàng)建基本的設備文件。mknod 命令需要root 權限,不過偶本身就是用的root 用戶,本來是新建了一個用戶專門用于嵌入式制作的,不過后來忘記用了# 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基本的設備文件建立好后,再創(chuàng)建必要的符號鏈接:# 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設備文件也可以不用手動創(chuàng)建,聽說RedHat /dev下的腳本MAKEDEV 可以實現(xiàn)這一功能,不過沒有試過基本上差不多了,不過打算用硬盤/CF卡來做存儲設備,還需要為它們建立相關文件,因為我的CF在目標機器上是CF-to-IDE,可以把它們等同來對待,先看看Redhat 下邊had的相關屬性:# 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對比一下,可以看出,had類型是b,即塊設備,主編號為3,次編號從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、添加基本的應用程序未來系統(tǒng)的應用程序,基本上可以分為三類:u 基本系統(tǒng)工具,如ls、ifconfig這些u 一些服務程序,管理工具,如WEB、Telnetu 自己開發(fā)的應用程序這里先添加基本的系統(tǒng)
34、工具,有想過把這些工具的代碼下載下來交叉編譯,不過實在是麻煩,用BusyBox,又精簡又好用將 busybox-1.00.tar.gz 下載至sysapps 目錄下,解壓:#tar zxvf busybox-1.00.tar.gz#cd busybox-1.00/進入配置菜單#make TARGET_ARCH=i386 CROSS=i386-linux- PREFIX=$PRJROOT/rootfs menuconfig/建立依存關系#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 的說明:A、如果編譯時選擇了:Runtime SUID/SGID configuration via /etc/busybox.conf系統(tǒng)每次運行命令時,都會出現(xiàn)“Using fallback suid method ”可以將它去掉,不過我還是在/etc為其建了一個文件busybox.conf搞定;B 、* Do you want to build BusyBox with a Cross Compiler?(i386-linux-gcc) Cross Compiler prefix
37、這個指明交叉編譯器名稱(其實在編譯時的命令行已指定過了)C、安裝選項下的($PRJROOT/rootfs) BusyBox installation prefix,這個指明了編譯好后的工具的安裝目錄。D、靜態(tài)編譯好還是動態(tài)編譯好?即是否選擇 Build BusyBox as a static binary (no shared libs)動態(tài)編譯的最大好處是節(jié)省了寶貴空間,一般來說都是用動態(tài)編譯,不過我以前動態(tài)編譯出過問題(其實是庫的問題,不關busybox 的事),出于慣性,我選擇了靜態(tài)編譯,為此多付出了107KB的空間。E、其它命令,根據(jù)需要,自行權衡。6、系統(tǒng)初始化文件內(nèi)核啟動時,最后一
38、個初始化動作就是啟動init 程序,當然,大多數(shù)發(fā)行套件的Linux都使用了與System V init相仿的init,可以在網(wǎng)上下載System V init套件,下載下來交叉編譯。另外,我也找到一篇寫得非常不錯的講解如何編寫初始化文件的文件,bsd-init,回頭附在后面。不過,對于嵌入式系統(tǒng)來講,BusyBox init可能更為合適,在第6 步中選擇命令的時候,應該把init編譯進去。#cd $PRJROOT/rootfs/etc#vi inittab我的inittal文件如下:#指定初始化文件:sysinit:/etc/init.d/rcS#打開一個串口,波特率為9600:respaw
39、n:/sbin/getty 9600 ttyS0#啟動時執(zhí)行的shell:respawn:/bin/sh#重啟時動作:restart:/sbin/init#關機時動作,卸載所有文件系統(tǒng):shutdown:/bin/umount -a r保存退出;再來編寫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#當然,這樣子做只是權宜之計,最后做的應該是在這一步引導網(wǎng)絡啟動腳本,像RedHat#那樣,自動讀取所有指定的配置文件來啟動ifconfig eth0 192.168
41、.0.68 netmask #set route#同樣的,最終這里應該是運行啟動路由的腳本,讀取路由配置文件route add default gw #還差一個運行服務程序的腳本,哪位有現(xiàn)成的么?#網(wǎng)卡/路由/服務這三步,事實上可以合在一步,在rcS這一步中,做一個循環(huán),運行指定啟動目錄下的所有腳,先將就著這么做吧,確保系統(tǒng)能夠正常啟動了,再來寫這個腳本。#set hostnamehostname MyLinux保存退出。編寫fstab文件#vi fstab我的fstab很簡單:/dev/hda1 / ext2 defaults 1 1none
42、/proc proc defaults 0 0第五章 讓 MyLinux 能夠啟動前一章,我們把編譯好的內(nèi)核、應用程序、配置文件都拷貝至rootfs 目錄對應的子目錄中去了,這一步,就是把這些文件移植至目標機的存儲器。這里,我是先另外拿一塊硬盤,掛在我的開發(fā)機上做的測試,因為我的本本用來寫文檔,PC 機用來做開發(fā)機,已經(jīng)沒有另外的機器了但是本章只是講述一個一般性的過程,并不影響你直接在目標主機上的工作。因為以后目標機識別硬盤序號都是hda,而我現(xiàn)在直接掛上去,則會是hdb、hdc這樣,安裝lilo時有點麻煩(雖然也可以實現(xiàn))。所以我想了另一個辦法:u 把新硬盤掛在IDE0的primary上,進
43、入linux后,會被認為是had;u 原來主機的裝Redhat的硬盤,我將它從IDE0的primary上變到了IDE1 的primary,因為它的lilo早已裝好,基本上不影響系統(tǒng)的使用;分區(qū)和格式化BIOS中改為從第二個硬盤啟動;也就是從我原來開發(fā)機啟動,新的硬盤被識別成了had。#fdisk /dev/hda用d參數(shù)刪除已存在的所有分區(qū)用n參數(shù)新建一個分區(qū),也是就/dev/hda1格式化#mkfs.ext2 /dev/hda1安裝 bootloader因為我是X86 平臺,所以直接用了lilo,如果你是其這平臺,當然,有許多優(yōu)秀的bootloader 供你選擇,你只需查看其相應的說明就可以
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 做新準備#mkdir /mnt/cf/把目標硬盤mount上來#mount t ext2 /dev/hdc1 /mnt/cf回到rootfs#cd $PRJROOT/
45、rootfs拷貝所有文件至目標硬盤#cp r * /mnt/cf這樣,我們所有的文件都被安裝至目標硬盤了,當然,它還不能引導,因為沒有bootloader。使用如下命令:# lilo -r /mnt/cf -C etc/target.lilo.confWarning: LBA32 addressing assumedAdded Linux *-r :改變根目標為/mnt/cf ,這樣配置文件其實就是/mnt/cf/etc/target.lilo.conf,也就是我們先前建立的文件。當然,完成這一步,需要lilo22.3 及以后版本,如果你的版本太舊,比如Redhat9.0自帶的,就會出現(xiàn)下面的
46、信息:#lilo r /mnt/cf C etc/target.lilo.confFatal: open /boot/boot.b: No such file or directory這時,你需要升級你的lilo,或者重新安裝一個。啟動系統(tǒng)#umount /mnt/cf#reboot將 BIOS 改為從IDE0 啟動,也就是目標硬盤。如果一切順利,你將順利進入一個屬于你的系統(tǒng)?;仡^再來看看我們的工作空間吧rootskynet lib# df /dev/hda1Filesystem 1K-blocks Used Available Use% Mounted on/dev/hda1 3953036
47、 1628 3750600 1% /mnt/cf總共花去了我1628KB 的空間,看來是沒有辦法放到軟盤里邊去了o,不過一味求小,并不是我的目標。rootskynet skynet# ls $PRJROOTbootloader build-tools debug doc images kernel rootfs sysapps tmp tools這幾個目錄中的文件,呵呵,與本文一開頭規(guī)劃的一樣rootskynet skynet# ls build-tools/buildroot buildroot-0.9.27.tar.tar包含了buildroot源碼及壓縮包,事實上buildroot 下邊還包括了GNU其它工具的源碼、編譯文件等諸多內(nèi)容,是我們最重要的一個文件夾,不過到現(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)核映像及配置文件等,如果你有模塊,因為還有相應的目錄rootskynet skynet# ls
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商務合同范本
- 兩人股份合作合同范本
- 中藥材種苗購銷合同
- 目標決定未來
- 房屋買賣合同協(xié)議書26609
- 房產(chǎn)買賣中介合同
- 吊籃設備租賃合同書
- 中級財務會計案例講課教案
- 風電項目主吊車裝拆方案
- 基于CiteSpace的AED配置國內(nèi)外研究現(xiàn)狀與進展的可視化分析
- 中學安全辦2024-2025學年工作計劃
- 2024年山東省東營市中考數(shù)學試題 (解析版)
- 2024年陜西西安亮麗電力集團有限責任公司招聘筆試沖刺題(帶答案解析)
- 2024年鄉(xiāng)村振興(產(chǎn)業(yè)、文化、生態(tài))等實施戰(zhàn)略知識考試題庫與答案
- 網(wǎng)絡安全基礎知識入門教程
- AI智慧物流園區(qū)整體建設方案
- 2024年遼寧鐵道職業(yè)技術學院高職單招(英語/數(shù)學/語文)筆試歷年參考題庫含答案解析
- 無痛人工流產(chǎn)術課件
- 心力衰竭業(yè)務學習護理課件
- 美發(fā)學徒助理職業(yè)規(guī)劃書
- 法醫(yī)病理學課件
評論
0/150
提交評論