如何做嵌入式Linux操作系統(tǒng)_第1頁
如何做嵌入式Linux操作系統(tǒng)_第2頁
如何做嵌入式Linux操作系統(tǒng)_第3頁
如何做嵌入式Linux操作系統(tǒng)_第4頁
如何做嵌入式Linux操作系統(tǒng)_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

如何做嵌入式Linux操作系統(tǒng)做一個(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ī)上已經(jīng)有一套開發(fā)工具,我們稱之為原生開發(fā)套件,我們一般就是用它們來寫程序,那么,那什么又是交叉編譯環(huán)境呢?其實(shí)一點(diǎn)也不神秘,也就是在開發(fā)機(jī)上再安裝一套開發(fā)工具,這套開發(fā)工具編譯出來的程序,如內(nèi)核、系統(tǒng)工作或者我們自己的程序,是放在目標(biāo)主機(jī)上運(yùn)行的。那么或許有初學(xué)者會(huì)問,直接用原生開發(fā)工具為目標(biāo)主機(jī)編譯程序不就完了?至少我當(dāng)初是這么想的。一般來說,我們的開發(fā)機(jī)都是X86平臺(tái),原生開發(fā)套件開發(fā)的工具,也針對(duì)X86平臺(tái),而我們的目標(biāo)主機(jī)可能是PowerPC、IXP、MIPS……所以,我們的交叉編譯環(huán)境是針對(duì)某一類具體平臺(tái)的。一般來講,交叉開發(fā)環(huán)境需要二進(jìn)制工具程序、編譯器、C鏈接庫,嵌入式開發(fā)常用的這三類軟件是: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)的人來說,這是非常簡單的;第三步、建立根文件系統(tǒng)也就是建立我們平??吹降腷in、dev、proc……這一大堆目錄,以及一些必備的文件;另外,我們還需要為我們的目標(biāo)系統(tǒng)安裝一些常用的工具軟件,如ls、ifconfig……當(dāng)然,一個(gè)辦法是找到這些工具的源代碼,用第一步建立的交叉編譯工具來編譯,但是這些軟件一是數(shù)量多,二是某些體積較大,不適合嵌入式系統(tǒng),這一步,我們一般都是用busybox來完成的,包括系統(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)程序可供我們使用。不過它們?cè)S多都有硬件平臺(tái)的限制。當(dāng)然,如果你是工作在X86,可以直接用lilo來引導(dǎo),事實(shí)上,本文就是采用的lilo。做到這一步,將目標(biāo)存儲(chǔ)設(shè)備掛上目標(biāo)機(jī),如果順利,就可以啟動(dòng)系統(tǒng)了。當(dāng)然,針對(duì)某些特別的平臺(tái),不能像硬盤這樣拷貝了,需要讀卡器、燒錄……但是基本的方法是相通的!第五步、優(yōu)化和個(gè)性化系統(tǒng)通過前四步,我們已經(jīng)得到了一個(gè)可以正常工作的系統(tǒng)。在這一步里,就是發(fā)揮你想像的時(shí)候了……本文的工作環(huán)境項(xiàng)目根目錄/home/kendo/project------>;我將它指定至PATH:$PRJROOT子目錄及說明目錄內(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存放臨時(shí)文件tools編譯好的跨平臺(tái)開發(fā)工具鏈以及C鏈接庫工作的腳本#!/usr/binexportPROJECT=skynetexportPRJROOT=/home/${PROJECT}exportTARGET=i386-linuxexportPREFIX=${PRJROOT}/toolsexportTARGET_PREFIX=${PREFIX}/${TARGET}exportPATH=${PREFIX}/bin:/bin:/sbin:/usr/bin:/usr/sbincd$PRJROOT第二章建立交叉編譯環(huán)境在CU中發(fā)表的另一篇同名的貼子里,我講述了一個(gè)全手工創(chuàng)建交叉編譯環(huán)境的方法。目前,創(chuàng)建交叉編譯環(huán)境,包括建立根文件,一般來講,有兩種方法:手功創(chuàng)建可以得到最大程序的個(gè)性化定制,缺點(diǎn)是過程繁雜,特別是極易出錯(cuò),注意這個(gè)“極”字,包括有經(jīng)驗(yàn)的開發(fā)人員;自動(dòng)創(chuàng)建無它,方便而。因?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ā)包,我用過XX廠家的IXP425和MIPS的,非常地方便,記得我第一次接觸嵌入式開發(fā),拿著這個(gè)開發(fā)包自動(dòng)化創(chuàng)建交叉編譯環(huán)境、編譯內(nèi)核、建立根文件系統(tǒng)、創(chuàng)建RamDisk,我反復(fù)做了三四次,結(jié)果還不知道自己究竟做了些什么,呵呵,夠傻吧……所以,建議沒有這方面經(jīng)驗(yàn)的讀者,還是首先嘗試一下手工創(chuàng)建的方法吧,而本章接下來的內(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,你只需在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.bz2uClibc0.9.27.tar.bz2genext2fs_1.3.orig.tar.gzccache-2.3.tar.gz將它拷貝到${PRJROOT}/build-tools下,解壓[root@skynetbuild-tools]#tarjxvfbuildroot-0.9.27.tar.tar[root@skynetbuild-tools]#cdbuildroot配置它:[root@skynetbuild-tools]#makemenuconfigTargetArchitecture(i386)--->;選擇硬件平臺(tái),我的是i386Buildoptions--->;編譯選項(xiàng)這個(gè)選項(xiàng)下重要的是(${PRJROOT}/tools)Toolchainandheaderfilelocation?編譯好的工具鏈放在哪兒?如果你像我一樣,所有工具包都在本地,不需它到網(wǎng)上自動(dòng)下載,可以把wgetcommand選項(xiàng)清空;ToolchainOptions--->;工具鏈選項(xiàng)---KernelHeaderOptions頭文件它會(huì)自動(dòng)去下載,不過應(yīng)該保證與你將要用的內(nèi)核是同一個(gè)版本;[]UsethedailysnapshotofuClibc?使用最近的uClibc的snapshotBinutilsVersion(binutils.2)--->;Binutils的版本GCCcompilerVersion(gcc3.4.2)--->;gcc版本[*]Build/installc++compilerandlibstdc++?[]Build/installjavacompilerandlibgcj?支持的語言,我沒有選擇java[]Enableccachesupport?啟用ccache的支持,它用于編譯時(shí)頭文件的緩存處理,用它來編譯程序,第一次會(huì)有點(diǎn)慢,但是以后的速度可就很理想了,呵呵……---GdbOptions根據(jù)你的需要,選擇gdb的支持PackageSelectionforthetarget--->;這一項(xiàng)我沒有選擇任意一項(xiàng),因?yàn)槲掖蛩愀募到y(tǒng)及busybox等工具鏈創(chuàng)建成工,手工來做。TargetOptions--->;文件系統(tǒng)類型,根據(jù)實(shí)際需要選,我用的ext2;配置完成后,編譯它:[root@skynetbuild-tools]#make這一項(xiàng)工作是非常花時(shí)間的,我的工具包全部在本地,也花去我一小時(shí)十三分的時(shí)間,如果全要下載,我估計(jì)網(wǎng)速正常也要多花一兩個(gè)鐘頭。經(jīng)過漫長的等待(事實(shí)上并不漫長,去打了幾把游戲,很快過去了):……make[1]:Leavingdirectory`/home/skynet/build-tools/buildroot/build_i386/genext2fs-1.3'touch-c/home/skynet/build-tools/buildroot/build_i386/genext2fs-1.3/genext2fs#-@find/home/skynet/build-tools/buildroot/build_i386/root/lib-typef-name\*.so\*|xargs/home/skynet/tools/bin/i386-linux-uclibc-strip--remove-section=.comment--remove-section=.note--strip-unneeded2>;/dev/null||true;/home/skynet/build-tools/buildroot/build_i386/genext2fs-1.3/genext2fs-i503-b1056\-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)利品讓我來看看它究竟做了哪些事情吧:[root@skynetskynet]#cdtools[root@skynettools]#lsbinbin-ccachei386-linuxi386-linux-uclibcincludeinfoliblibex!ecmanusrbin:所有的編譯工具,如gcc,都在這兒了,只是加了些指定的前綴;bin-ccache:如果在Toolchainoptaion中沒有選擇對(duì)ccache的支持,就沒有這一項(xiàng)了;i386-linux:鏈接文件;實(shí)際指向includei386-linux-uclibc:uclibc的相關(guān)工具;include:供交叉開發(fā)工具使用的頭文件;info:gcc的info文件;lib:供交叉開發(fā)工具使用的鏈接庫文件;……現(xiàn)在可以把編譯工具所在目錄XXX/bin添加至PATH了測試工具鏈如果你現(xiàn)在寫一個(gè)程序,用i386-linux-gcc來編譯,運(yùn)行的程序會(huì)告訴你:./test:linkedagainstGNUlibc因?yàn)槌绦蜻\(yùn)行庫會(huì)尋到默認(rèn)的/lib:/usr/lib上面去,而我們目前的uclibc的庫并不在那里(雖然對(duì)于目標(biāo)機(jī)來講,這是沒有錯(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)清單以及所需功能清單,這樣,才能更合理地裁減內(nèi)核。準(zhǔn)備工具Linux內(nèi)核源碼,我選用的是Linux-2.4.27.tar.bz2編譯內(nèi)核將Linux-2.4.27.tar.bz2拷貝至${PRJROOT}/kernel,解壓#cdlinux-2.4.27//配置#makeARCH=i386CROSS_COMPILE=i386-linux-menuconfig//建立源碼的依存關(guān)系#makeARCH=i386CROSS_COMPILE=i386-linux-cleandep//建立內(nèi)核映像#makeARCH=i386CROSS_COMPILE=i386-linux-bzImageARCH指明了硬件平臺(tái),CROSS_COMPILE指明了這是交叉編譯,且編譯器的名稱為i386-linux-XXX,這里沒有為編譯器指明路徑,是因?yàn)槲仪懊嬉褜⑵浼尤胫镰h(huán)境變量PATH。又是一個(gè)漫長的等待……OK,編譯完成,673K,稍微大了點(diǎn),要移到其它平臺(tái),或許得想辦法做到512以下才好,回頭來想辦法做這個(gè)工作。安裝內(nèi)核內(nèi)核編譯好后,將內(nèi)核及配置文件拷貝至${PRJROOT}/images下。#cparch/i386/boot/bzImage${PRJROOT}/images/bzImage-2.4.27-rmk5#cpvmlinux${PRJROOT}/images/vmlinux-2.4.27-rmk5#cpSystem.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)來說,功能基本上定死了,這樣影響也不太大),所以,剩下的步驟也省去了,如果你還需要模塊的支持,應(yīng)該://建立模塊#makeARCH=i386CROSS_COMPILE=i386-linux-modules//安裝內(nèi)核模塊至${PRJROOT}/images#makeARCH=i386CROSS_COMPILE=i386-linux-\>;INSTALL_MOD_PATH=${PRJROOT}/images/modules-2.4.18-rmk5\>;modules_install最后一步是為模塊建立依存關(guān)系,不能使用原生的depmod來建立,而需要使用交叉編譯工具。需要用到busybox中的depmod.pl腳本,很可惜,我在busybox1.0.0中,并沒有找到這個(gè)腳本,所以,還是借用了busybox0.63中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)并沒有模塊的支持。如果你需要使用模塊,只需按相同方法將其拷貝至相應(yīng)目錄即可。附,內(nèi)核編譯清單附,內(nèi)核選擇:內(nèi)核編譯記錄:Codematurityleveloptions不選Loadablemodulesupport不選Processortypeandfeatures根據(jù)實(shí)際,選擇處理器類型Generalsetup--->;[*]Networkingsupport[*]PCIsupport(Any)PCIaccessmode[*]PCIdevicenamedatabase[*]SystemVIPC[*]Sysctlsupport(ELF)Kernelcore(/proc/kcore)format[*]KernelsupportforELFbinaries[*]PowerManagementsupportMemoryTechnologyDevices(MTD)--->;MTD設(shè)備,我用CF卡,不選Parallelportsupport--->;不選PlugandPlayconfiguration--->;我的系統(tǒng)用不著即插即用,不選Blockdevices--->;[*]Loopbackdevicesupport[*]RAMdisksupport(4096)DefaultRAMdisksize(NEW)[*]InitialRAMdisk(initrd)supportMulti-devicesupport(RAIDandLVM)--->;不選Networkingoptions--->;基本上都選了ATA/IDE/MFM/RLLsupport--->;用了默認(rèn)的TelephonySupport--->;不選SCSIsupport--->;不選FusionMPTdevicesupport--->;不選I2Odevicesupport--->;不選Networkdevicesupport--->;根據(jù)實(shí)際情況選擇AmateurRadiosupport--->;不選IrDA(infrared)support--->;不選ISDNsubsystem--->;不選OldCD-ROMdrivers(notSCSI,notIDE)--->;不選Inputcoresupport--->;不選Characterdevices--->;[*]Virtualterminal[*]Supportforconsoleonvirtualterminal[*]Standard/generic(8250/16550andcompatibleUARTs)serialsupport[*]SupportforconsoleonserialportMultimediadevices--->;不選Filesystems--->;[*]Kernelautomounterversion4support(alsosupportsv3)[*]Virtualmemoryfilesystemsupport(formershmfs)[*]/procfilesystemsupport[*]SecondextendedfssupportConsoledrivers--->;[*]VGAtextconsole調(diào)試時(shí)接顯示器用剩下三個(gè)都不要Sound--->;USBsupport--->;Kernelhacking--->;第四章建立根文件系統(tǒng)1、建立目錄構(gòu)建工作空間時(shí),rootfs文件夾用來存放根文件系統(tǒng),#cdrootfs根據(jù)根文件系統(tǒng)的基本結(jié)構(gòu),建立各個(gè)對(duì)應(yīng)的目錄:#mkdirbindevetclibprocsbintmpusrvarroothome#chmod1777tmp#mkdirusr/binusr/libusr/sbin#lsdevetclibprocsbintmpusrvar#mkdirvar/libvar/lockvar/logvar/runvar/tmp#chmod1777var/tmp對(duì)于單用戶系統(tǒng)來說,root和home并不是必須的。準(zhǔn)備好根文件系統(tǒng)的骨架后,把前面建立的文件安裝到對(duì)應(yīng)的目錄中去。2、拷貝鏈接庫把uclibc的庫文件拷貝到剛才建立的lib文件夾中:#cd${PREFIX}/lib[root@skynetlib]#cp*-*.so${PRJROOT}/rootfs/lib[root@skynetlib]#cp-d*.so.[*0-9]${PRJROOT}/rootfs/lib3、拷貝內(nèi)核映像和內(nèi)核模塊因?yàn)闆]有模塊,所以拷貝模塊就省了,新建boot目錄,把剛才建立好的內(nèi)核拷貝過來#cd/home/kendo/control-project/daq-module/rootfs/#mkdirboot#cd${PRJROOT}/images#cpbzImages-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)限,不過偶本身就是用的root用戶,本來是新建了一個(gè)用戶專門用于嵌入式制作的,不過后來忘記用了……#mknod-m600memc11#mknod-m666nullc13#mknod-m666zeroc15#mknod-m644randomc18#mknod-m600tty0c40#mknod-m600tty1c41#mknod-m600ttyS0c464#mknod-m666ttyc50#mknod-m600consolec51基本的設(shè)備文件建立好后,再創(chuàng)建必要的符號(hào)鏈接:#ln-s/proc/self/fdfd#ln-sfd/0stdin#ln-sfd/1stdout#ln-sfd/2stderr#lsconsolefdmemnullrandomstderrstdinstdoutttytty0tty1ttyS0zero設(shè)備文件也可以不用手動(dòng)創(chuàng)建,聽說RedHat/dev下的腳本MAKEDEV可以實(shí)現(xiàn)這一功能,不過沒有試過……基本上差不多了,不過打算用硬盤/CF卡來做存儲(chǔ)設(shè)備,還需要為它們建立相關(guān)文件,因?yàn)槲业腃F在目標(biāo)機(jī)器上是CF-to-IDE,可以把它們等同來對(duì)待,先看看Redhat下邊had的相關(guān)屬性:#ls-l/dev/hdabrw-rw----1rootdisk3,0Jan302003/dev/hda#ls-l/dev/hda1brw-rw----1rootdisk3,1Jan302003/dev/hda1對(duì)比一下,可以看出,had類型是b,即塊設(shè)備,主編號(hào)為3,次編號(hào)從0遞增,根限位是rw-rw----,即660,所以:#mknod-m660hdab30#mknod-m660hda1b31#mknod-m660hda2b32#mknod-m660hda3b335、添加基本的應(yīng)用程序未來系統(tǒng)的應(yīng)用程序,基本上可以分為三類:基本系統(tǒng)工具,如ls、ifconfig這些……一些服務(wù)程序,管理工具,如WEB、Telnet……自己開發(fā)的應(yīng)用程序這里先添加基本的系統(tǒng)工具,有想過把這些工具的代碼下載下來交叉編譯,不過實(shí)在是麻煩,用BusyBox,又精簡又好用……將busybox-1.00.tar.gz下載至sysapps目錄下,解壓:#tarzxvfbusybox-1.00.tar.gz#cdbusybox-1.00//進(jìn)入配置菜單#makeTARGET_ARCH=i386CROSS=i386-linux-PREFIX=${PRJROOT}/rootfsmenuconfig//建立依存關(guān)系#makeTARGET_ARCH=i386CROSS=i386-linux-PREFIX=${PRJROOT}/rootfsdep//編譯#makeTARGET_ARCH=i386CROSS=i386-linux-PREFIX=${PRJROOT}/rootfs//安裝#makeTARGET_ARCH=i386CROSS=i386-linux-PREFIX=${PRJROOT}/rootfsinstall#cd${PRJROOT}/rootfs/bin#lsaddgroupbusyboxchowndelgroupechokilllsmvpingrmsleepadduserchgrpcpdelusergreplnmkdirnetstatpsrmdirumountashchmoddatedmesghostnameloginmountpidofpwdshvi一下子多了這么多命令……配置busybox的說明:A、如果編譯時(shí)選擇了:RuntimeSUID/SGIDconfigurationvia/etc/busybox.conf系統(tǒng)每次運(yùn)行命令時(shí),都會(huì)出現(xiàn)“Usingfallbacksuidmethod”可以將它去掉,不過我還是在/etc為其建了一個(gè)文件busybox.conf搞定;B、[*]DoyouwanttobuildBusyBoxwithaCrossCompiler?(i386-linux-gcc)CrossCompilerprefix這個(gè)指明交叉編譯器名稱(其實(shí)在編譯時(shí)的命令行已指定過了……)C、安裝選項(xiàng)下的(${PRJROOT}/rootfs)BusyBoxinstallationprefix,這個(gè)指明了編譯好后的工具的安裝目錄。D、靜態(tài)編譯好還是動(dòng)態(tài)編譯好?即是否選擇[]BuildBusyBoxasastaticbinary(nosharedlibs)動(dòng)態(tài)編譯的最大好處是節(jié)省了寶貴空間,一般來說都是用動(dòng)態(tài)編譯,不過我以前動(dòng)態(tài)編譯出過問題(其實(shí)是庫的問題,不關(guān)busybox的事),出于慣性,我選擇了靜態(tài)編譯,為此多付出了107KB的空間。E、其它命令,根據(jù)需要,自行權(quán)衡。6、系統(tǒng)初始化文件內(nèi)核啟動(dòng)時(shí),最后一個(gè)初始化動(dòng)作就是啟動(dòng)init程序,當(dāng)然,大多數(shù)發(fā)行套件的Linux都使用了與SystemVinit相仿的init,可以在網(wǎng)上下載SystemVinit套件,下載下來交叉編譯。另外,我也找到一篇寫得非常不錯(cuò)的講解如何編寫初始化文件的文件,bsd-init,回頭附在后面。不過,對(duì)于嵌入式系統(tǒng)來講,BusyBoxinit可能更為合適,在第6步中選擇命令的時(shí)候,應(yīng)該把init編譯進(jìn)去。#cd${PRJROOT}/rootfs/etc#viinittab我的inittal文件如下:#指定初始化文件::sysinit:/etc/init.d/rcS#打開一個(gè)串口,波特率為9600::respawn:/sbin/getty9600ttyS0#啟動(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保存退出;再來編寫rcS腳本:#mkdir${PRJROOT}/rootfs/etc/init.d#cd${PRJROOT}/rootfs/etc/init.d#vircS我的腳本如下:#!/bin/sh#SetPathPATH=/sbin:/binexportPATHsyslogd-m60klogd#install/procmount-n-tprocnone/proc#reinstallrootfilesystembyread/writemode(need:/etc/fstab)mount-n-oremount,rw/#reinstall/procmount-n-oremount,rw-tprocnone/proc#setloipaddressifconfiglo#seteth0ipaddress#當(dāng)然,這樣子做只是權(quán)宜之計(jì),最后做的應(yīng)該是在這一步引導(dǎo)網(wǎng)絡(luò)啟動(dòng)腳本,像RedHat#那樣,自動(dòng)讀取所有指定的配置文件來啟動(dòng)ifconfigeth08netmask#setroute#同樣的,最終這里應(yīng)該是運(yùn)行啟動(dòng)路由的腳本,讀取路由配置文件routeadddefaultgw#還差一個(gè)運(yùn)行服務(wù)程序的腳本,哪位有現(xiàn)成的么?#網(wǎng)卡/路由/服務(wù)這三步,事實(shí)上可以合在一步,在rcS這一步中,做一個(gè)循環(huán),運(yùn)行指定啟動(dòng)目錄下的所有腳,先將就著這么做吧,確保系統(tǒng)能夠正常啟動(dòng)了,再來寫這個(gè)腳本。#sethostnamehostnameMyLinux保存退出。編寫fstab文件#vifstab我的fstab很簡單:/dev/hda1/ext2defaults11none/procprocdefaults00第五章讓MyLinux能夠啟動(dòng)前一章,我們把編譯好的內(nèi)核、應(yīng)用程序、配置文件都拷貝至rootfs目錄對(duì)應(yīng)的子目錄中去了,這一步,就是把這些文件移植至目標(biāo)機(jī)的存儲(chǔ)器。這里,我是先另外拿一塊硬盤,掛在我的開發(fā)機(jī)上做的測試,因?yàn)槲业谋颈居脕韺懳臋n,PC機(jī)用來做開發(fā)機(jī),已經(jīng)沒有另外的機(jī)器了……但是本章只是講述一個(gè)一般性的過程,并不影響你直接在目標(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è)辦法:把新硬盤掛在IDE0的primary上,進(jìn)入linux后,會(huì)被認(rèn)為是had;原來主機(jī)的裝Redhat的硬盤,我將它從IDE0的primary上變到了IDE1的primary,因?yàn)樗膌ilo早已裝好,基本上不影響系統(tǒng)的使用;分區(qū)和格式化BIOS中改為從第二個(gè)硬盤啟動(dòng);也就是從我原來開發(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)的說明就可以了。編譯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上來#mount–text2/dev/hdc1/mnt/cf回到rootfs#cd${PRJROOT}/rootfs拷貝所有文件至目標(biāo)硬盤#cp–r*/mnt/cf這樣,我們所有的文件都被安裝至目標(biāo)硬盤了,當(dāng)然,它還不能引導(dǎo),因?yàn)闆]有bootloader。使用如下命令:#lilo-r/mnt/cf-Cetc/target.lilo.confWarning:LBA32addressingassumedAddedLinux*-r:改變根目標(biāo)為/mnt/cf,這樣配置文件其實(shí)就是/mnt/cf/etc/target.lilo.conf,也就是我們先前建立的文件。當(dāng)然,完成這一步,需要lilo22.3及以后版本,如果你的版本太舊,比如Redhat9.0自帶的,就會(huì)出現(xiàn)下面的信息:#lilo–r/mnt/cf–Cetc/target.lilo.confFatal:open/boot/boot.b:Nosuchfileordirectory這時(shí),你需要升級(jí)你的lilo,或者重新安裝一個(gè)。啟動(dòng)系統(tǒng)#umount/mnt/cf#reboot將BIOS改為從IDE0啟動(dòng),也就是目標(biāo)硬盤。如果一切順利,你將順利進(jìn)入一個(gè)屬于你的系統(tǒng)?;仡^再來看看我們的工作空間吧[root@skynetlib]#df/dev/hda1Filesystem1K-blocksUsedAvailableUse%Mountedon/dev/hda13953036162837506001%/mnt/cf總共花去了我1628KB的空間,看來是沒有辦法放到軟盤里邊去了^o^,不過一味求小,并不是我的目標(biāo)。[root@skynetskynet]#ls${PRJROOT}bootloaderbuild-toolsdebugdocimageskernelrootfssysappstmptools這幾個(gè)目錄中的文件,呵呵,與本文一開頭規(guī)劃的一樣[root@skynetskynet]#lsbuild-tools/buildrootbuildroot-0.9.27.tar.tar包含了buildroot源碼及壓縮包,事實(shí)上buildroot下邊還包括了GNU其它工具的源碼、編譯文件等諸多內(nèi)容,是我們最重要的一個(gè)文件夾,不過到現(xiàn)在它已經(jīng)沒有多大用處了,如果你喜歡,可以將它刪除掉(不建議)。[root@skynetskynet]#lsimages2.4.18-rmk5bzImage-2.4.18-rmk5System-2.4.18-rmk5vmlinux-2.4.18-rmk5內(nèi)核映像及配置文件等,如果你有模塊,因?yàn)檫€有相應(yīng)的目錄[root@skynetskynet]#lskernel/linux-2.4.27linux-2.4.27.tar.bz2內(nèi)核源碼及壓縮包[root@skynetskynet]#lsrootfs/binbootdevetchomeliblinuxrcprocrootsbintmpusrvar制作好的根文件系統(tǒng),重中之重,注意備份……[root@skynetskynet]#lssysapps/busybox-1.00busybox-1.00.tar.gzbusybox-1.00源碼包,或許你還要繼續(xù)添加/刪除一些命令……[root@skynetskynet]#lstoolsbini386-linuxi386-linux-uclibcincludeinfolibman這個(gè)也很重要,我們制作好的交叉開發(fā)工具鏈。如果你要繼續(xù)開發(fā)程序,這個(gè)目錄重要性就很高了。其它目錄暫時(shí)是空的。第六章完善MyLinux關(guān)于進(jìn)一步的調(diào)試,你可以在開發(fā)機(jī)上使用chroot/mnt/cf/bin/sh這樣的命令,以使我們?cè)谀繕?biāo)根文件系統(tǒng)上工作。支持多用戶因?yàn)槲以诰幾gbusybox時(shí),已經(jīng)將它的多用戶那一大堆命令編譯了進(jìn)來?,F(xiàn)在關(guān)鍵是的要為其建立相應(yīng)的文件;進(jìn)入原來的開發(fā)機(jī),進(jìn)入rootfs目錄,切換根目錄#chrootrootfs//bin/shA、建立/etc/passwd文件,我的文件內(nèi)容如下:root:x:0:0:root:/root:/bin/bashB、建立/etc/group文件,我的文件內(nèi)容如下:root:x:0:bin:x:1:sys:x:2:kmem:x:3:tty:x:4:tape:x:5:daemon:x:6:disk:x:7:C、為root建立密碼#passwdroot試試用addgroup/addusr……這堆命令。然后重啟,從目標(biāo)硬盤上啟動(dòng);從console口,9600登陸試試(因?yàn)槲以趇nittab中啟用了ttyS0,我未來的目標(biāo)機(jī),是沒有顯卡的,需要從console口或SSH進(jìn)去管理)MyLinuxlogin:rootPassword:BusyBoxv1.00(2004.10.10-04:43+0000)Built-inshell(ash)Enter'help'foralistofbuilt-incommands.~#成功了……增加WEBServerBusybox里邊有httpd選項(xiàng),不過我編譯時(shí)并沒有選擇,所以還是自己來安裝。我使用的軟件是thttpd-2.25b.tar.gz,將它移至sysapps目錄下。[root@skynetsysapps]#tarzxvfthttpd-2.25b.tar.gz[root@skynetsysapps]#cdthttpd-2.25b//配置[root@skynetthttpd-2.25b]#CC=i386-linux-gcc./configure--host=$TARGET……i386-linux-gcc-statichtpasswd.o-ohtpasswd-lcryptmake[1]:warning:Clockskewdetected.Yourbuildmaybeincomplete.make[1]:Leavingdirectory`/home/skynet/sysapps/thttpd-2.25b/extras'//拷貝至根文件目錄[root@skynetthttpd-2.25b]#cpthttpd${PRJROOT}/rootfs/usr/sbin//trip處理[root@skynetthttpd-2.25b]#i386-linux-strip${PRJROOT}/rootfs/usr/sbin/thttpd剩下的,就發(fā)揮各人的想像吧……獨(dú)孤九賤2005-11-102:34繼續(xù)補(bǔ)完不好意思,最近工作太忙,好久沒有來搞這個(gè)東東了,加之心愛的手機(jī)丟了,心情又不太好,不過一切都過去了,繼續(xù)來將它補(bǔ)充完整。修改啟動(dòng)腳本在前面寫rcS啟動(dòng)腳本中。當(dāng)時(shí)只是為了系統(tǒng)能夠正常地啟動(dòng),在啟動(dòng)網(wǎng)卡/路由/服務(wù)等時(shí),有如下語句:——————————————————————————————————————————————#setloipaddressifconfiglo#seteth0ipaddress#當(dāng)然,這樣子做只是權(quán)宜之計(jì),最后做的應(yīng)該是在這一步引導(dǎo)網(wǎng)絡(luò)啟動(dòng)腳本,像RedHat#那樣,自動(dòng)讀取所有指定的配置文件來啟動(dòng)ifconfigeth08netmask#setroute#同樣的,最終這里應(yīng)該是運(yùn)行啟動(dòng)路由的腳本,讀取路由配置文件routeadddefaultgw……———————————————————————————————————————————————這樣配置的最大壞處就是不能根據(jù)配置文件自定義,每次開機(jī)都定死了,現(xiàn)在來修改它,將這段語句刪除之,換成如下語句:foriin/etc/start/S??*;do#Ignoredanglingsymlinks(ifany).[!-f"$i"]&&continueecho"Running$i."case"$i"in*.sh)#Sourceshellscriptforspeed.(trap-INTQUITTSTPsetstart.$i);;*)#Noshextension,soforksubprocess.$istart;;esacecho"Done$i."echodone解釋一下,這段語句的作用,就是啟動(dòng)/etc/start/目錄下,所有以S開頭的腳本文件,可以啟動(dòng)兩類,以sh結(jié)尾或沒有sh后綴的。這樣,我們?cè)?etc/目錄下再新建一目錄start/,這里面就是我們啟動(dòng)時(shí)需要的腳本的。先來啟動(dòng)網(wǎng)卡。修改網(wǎng)卡配置文件我是根據(jù)Redhat的作法,把網(wǎng)卡配置放在/etc/sysconfig/network-scripts目錄下,類似于ifcfg-ethXX這樣子,它們的語法是:DEVICE=eth0BOOTPROTO=staticBROADCAST=55IPADDR=4NETMASK=NETWORK=ONBOOT=yes好,建立這些目錄和文件,我共有兩個(gè)文件ifcfg-ethXX。回到/etc/start目錄,建立網(wǎng)卡的啟動(dòng)腳本S01interface:#!/bin/sh./etc/sysconfig/network#enableip_forwordecho>1/proc/sys/net/ipv4/ip_forward#enablesyn_cookieecho>1/proc/sys/net/ipv4/tcp_syncookies#enableloopbackinterface/sbin/ifconfiglo#eanbleethernetinterface/usr/sbin/bootife#sethostnameif[-z"$HOSTNAME"-o"$HOSTNAME"="(none)"]thenHOSTNAME=localhostfi/bin/hostname${HOSTNAME}請(qǐng)注意這個(gè)腳本文件,有兩個(gè)地方:1、包含了另一個(gè)配置文件/etc/sysconfig/network,在這里,我也是照抄了redhat,我的/etc/sysconfig/network這個(gè)文件的內(nèi)容如下:NETWORKING=yesHOSTNAME=skynetGATEWAY=2、在啟動(dòng)網(wǎng)卡時(shí),我使用了#eanbleethernetinterface/usr/sbin/bootifebootife是我自己寫的一個(gè)C程序,作用是讀取/etc/sysconfig/network-scripts/下面的ifcfg-ethXX文件,并配置之,本來這里就該用shell來完成更合適一點(diǎn),無奈,偶shell功底實(shí)在差了一點(diǎn)(剛學(xué)幾天),就是想從Redhat中照抄過來,反復(fù)試了幾次也沒有成功。所以被逼無奈用C來完成之,后面我會(huì)附上我的C的源碼,也希望哪位大哥能夠?qū)懸欢蜸hell的程序代替它,放上來大家共享之。修改路由啟動(dòng)文件同樣的,我在/etc/start下,建立新腳本S02route.sh,它的作用是啟動(dòng)所有配置的靜態(tài)路由:#!/bin/bash./etc/sysconfig/network#Addnoninterface-specificstatic-routes.if[-f/etc/sysconfig/static-routes]thengrep"eth*"/etc/sysconfig/static-routes|whilereadignoreargs;do#echo"/sbin/routeadd-"$args/sbin/routeadd-$argsdonefi#Adddefalutgw/sbin/routeadddefaultgw${GATEWAY}OK,啟動(dòng)時(shí)讀取的配置文件是/etc/sysconfig/static-routes,它的語法和Redhat是一樣的,請(qǐng)參照建立此文件。啟動(dòng)服務(wù)程序新建啟動(dòng)腳本S03server:#!/bin/sh#------------------------------------------------------------------#--Source#--Author(s):kendo#--Email:[email]kendo999@[/email]#--#--2005/10/31#------------------------------------------------------------------./etc/sysconfig/bootserverif["$enable_httpd"=1];then./etc/scripts/httpd.sh$1fiif["$enable_adsl"=1];then……fiif["$enable_udhcpd"=1];then……fi很簡單,根據(jù)相應(yīng)變量的值,調(diào)用相應(yīng)的腳本。1、這些啟動(dòng)標(biāo)志變量,我定義在了/etc/sysconfig/bootserver當(dāng)中,其內(nèi)容如下:#startserveronsystemboot#1:yes0:noenable_httpd=1enable_adsl=1enable_udhcpd=12、每種服務(wù)對(duì)應(yīng)的腳本,我都放在了/etc/scripts下面。這些腳本,取決于你打算使用哪些服務(wù)程序了。腳本的來源,可以自己編寫,有可能其源碼中自帶有,也可以到網(wǎng)上查找……我就不再一一贅述了,OK,基本上,腳本的修改就完成了,下一步,將是建立RamDisk?!?,讀取網(wǎng)卡配置文件,啟動(dòng)網(wǎng)卡的C源碼:/**************************************************************************author:kendo**date:2005/10/26***********************************************************************/#include#include#include#include#include#include#defineNETCFGDIR"/etc/sysconfig/network-scripts/"struct_ifcfg{chardevice[8];charbootproto[8];charbr[16];charnetmask[16];charip[16];charnetwork[16];intonboot;};voidParseKey(struct_ifcfg*ifcfg,char*key,char*value){if(!strcmp(key,"DEVICE")){strcpy(ifcfg->device,value);}elseif(!strcmp(key,"BOOTPROTO")){strcpy(ifcfg->bootproto,value);}elseif(!strcmp(key,"BROADCAST")){strcpy(ifcfg->br,value);}elseif(!strcmp(key,"IPADDR")){strcpy(ifcfg->ip,value);}elseif(!strcmp(key,"NETMASK")){strcpy(ifcfg->netmask,value);}elseif(!strcmp(key,"NETWORK")){strcpy(ifcfg->network,value);}elseif(!strcmp(key,"ONBOOT")){ifcfg->onboot=(strcmp(value,"yes")?0:1);}}intmain(intargc,char**argv){FILE*fp;DIR*dir;inti;charfilename[50],buf[80];char*index,*key,*value,*p;struct_ifcfg*ifcfg;structdirent*ptr;ifcfg=(struct_ifcfg*)malloc(sizeof(struct_ifcfg));memset(ifcfg,0,sizeof(struct_ifcfg));dir=opendir(NETCFGDIR);/*打開腳本目錄*/while((ptr=readdir(dir))!=NULL)/*讀取所有文件*/{if(strncmp(ptr->d_name,"ifcfg-eth",9))/*這里,只啟動(dòng)了以太網(wǎng)卡^o^*/{continue;}memset(filename,0,sizeof(filename));sprintf(filename,"%s%s",NETCFGDIR,ptr->d_name);if((fp=fopen(filename,"r"))==NULL)/*打開配置文件*/{continue;}while(!feof(fp)){memset(buf,0,sizeof(buf));if(fgets(buf,80,fp)!=NULL)/*逐行讀取分析*/{p=strchr(buf,'n');if(p){*p='';}index=buf;key=strtok(index,"=");/*讀取配置變量*/value=strtok(NULL,"=");/*讀取變量的值*/ParseKey(ifcfg,key,value);/*分析之,存入結(jié)構(gòu)ifcfg中*/}}/*構(gòu)建相應(yīng)的命令*/memset(buf,0,80);strcpy(buf,"/sbin/ifconfig");if(ifcfg->onboot){sprintf(buf,"%s%s%snetmask%sbroadcast%s",buf,ifcfg->device,ifcfg->ip,ifcfg->netmask,ifcfg->br);/*直接調(diào)用system來實(shí)現(xiàn),當(dāng)然也可以自己通過ioctl來設(shè)置,相應(yīng)源碼,我以前在c/c++版發(fā)過*/system(buf);}}free(ife);return0;}platinum2005-11-102:52[code]memset(buf,0,80);strcpy(buf,"/sbin/ifconfig");if(ifcfg->onboot){sprintf(buf,"%s%s%snetmask%sbroadcast%s",buf,ifcfg->device,ifcfg->ip,ifcfg->netmask,ifcfg->br);/*直接調(diào)用system來實(shí)現(xiàn),當(dāng)然也可以自己通過ioctl來設(shè)置,相應(yīng)源碼,我以前在c/c++版發(fā)過*/system(buf);[/code]兩個(gè)問題1、從這段代碼看,實(shí)際調(diào)用了/sbin/ifconfig來完成網(wǎng)卡的設(shè)置,那么,這個(gè)程序是否必須用root來執(zhí)行?2、為何不用system("command")呢?獨(dú)孤九賤2005-11-103:03回復(fù)19樓platinum的帖子1、ifconfig本身運(yùn)行,應(yīng)該不需要root吧?而至于在shell中的運(yùn)行權(quán)限,要看看相應(yīng)的權(quán)限位了,事實(shí)上它已經(jīng)能夠在我的系統(tǒng)中很好的運(yùn)行了,測試過很多次的。不過現(xiàn)在我的系統(tǒng),其實(shí)沒有用這種方法的,我是自己封裝了一個(gè)網(wǎng)卡管理的庫,也就是重寫了ifconfig,不過要把這些代碼發(fā)上來,太麻煩了,所以,就用了解system簡單了一點(diǎn)。2、我不是很理解“為何不用system("command")呢?”這句話的含義,我用的是system(buf);你說的是不是為什么要去構(gòu)建一個(gè)buf,而不是直接用system("/sbin/ifconfigethXX……")?清楚一點(diǎn)……^o^獨(dú)孤九賤2005-11-1601:44繼續(xù)工作,交叉編譯SNMP一般系統(tǒng)都會(huì)有SNMP的支持,下載了net-snmp-,先看看INSTALL和FAQ文檔(因?yàn)橐郧皬膩頉]有碰過這個(gè)東東,見笑了……),按照說明,在原生主機(jī)上安裝了一回,安裝完成后,發(fā)現(xiàn)在指定安裝目錄下主要包括了幾塊文件:bin:SNMP的一些功能腳本和程序;sbin:主要的代理程序和trap程序:snmpd和snmptrapinclude/lib:自身兼容及第三方開發(fā)所需的頭文件及庫文件;share:主要是MIB文件;然后回到安裝目錄下,運(yùn)行./configuare--help,仔細(xì)查看了其安裝編譯選項(xiàng),因?yàn)槲叶ㄎ坏男⌒偷南到y(tǒng),只需具備基本的SNMP功能即可,所以:那些bin目錄下的功能程序也不需要,對(duì)應(yīng)--disable-applicationsbin下的腳本也是不需要的,對(duì)應(yīng):--disable-scripts用戶手冊(cè)也不需要:--disable-manuals關(guān)閉ipv6支持:--disable-ipv6還有一個(gè)--enable-mini-agent選項(xiàng),說明是編譯出一個(gè)最小化的snmpd,比較有趣,試試先。對(duì)于交叉編譯,還需要用--host指明目標(biāo)平臺(tái)。OK,看完了幫助說明,開始編譯了:1、配置,根據(jù)以上確定的選項(xiàng):[root@skynetroot]#CC=i386-linux-gcc./configure--host=$TARGET--enable-mini-agent--disable-ipv6--with-endianness=little--disable-applications--disable-manuals--disable-scripts--disable-ucd-snmp-compatibilityCC指明了編譯器;--host指明了我的目標(biāo)平臺(tái),這個(gè)環(huán)境變量在我前面定義的devedaq腳本中。還算順利,繼續(xù)編譯它:[root@skynetnet-snmp-]#makeLDFLAGS="-static"呵呵,因?yàn)闆]有裝lib庫,所以我用了-static選項(xiàng),指明是靜態(tài)編譯;3、安裝安裝就需要指明安裝路徑了,路徑可以在.config的時(shí)候指定,因?yàn)槟莻€(gè)時(shí)候,那串東東太長了,我在install時(shí)指定也不遲:#makeprefix=${TARGET_PREFIX}exec_prefix=${TARGET_PREFIX}install4、檢查一下:[root@skynetnet-snmp-]#ls-l${TARGET_PREFIX}/sbintotal2120-rwxr-xr-x1rootroot2164301Nov1609:22snmpdsnmpd就是我們要的代理主程序了,大約靜態(tài)編譯有2M。[root@skynetnet-snmp-]#ls-l${TARGET_PREFIX}/bintotal4380-rwxr-xr-x2rootroot391980Oct142004ar-rwxr-xr-x2rootroot581228Oct142004as……呵呵,那堆程序和腳本沒有安裝,如snmpwalk……ls${TARGET_PREFIX}/libls-l${TARGET_PREFIX}/include看看我們需要的mib文件:[root@skynetnet-snmp-]#ls${TARGET_PREFIX}/share/snmpmib2c.access_functions.confmib2c.column_defines.conf_watch.confmib2c.old-api.confmib2c.array-user.confmib2c.column_enums.confmib2c.iterate_access.confmib2c.scalar.confmib2c.check_values.confmib2c.confmib2c.iterate.confmibsmib2c.check_values_local.confmib2c.create-dataset.confmib2c.notify.confsnmpconf-data5、移植基本完成了,因?yàn)閟nmpd太大了點(diǎn),對(duì)它進(jìn)行strip處理:先備個(gè)份:[root@skynetnet-snmp-]#cp${TARGET_PREFIX}/sbin/snmpd${TARGET_PREFIX}/sbin/snmpd.bak[root@skynetnet-snmp-]#i386-linux-strip${TARGET_PREFIX}/sbin/snmpd[root@skynetnet-snmp-]#ls-l${TARGET_PREFIX}/sbin/snmpd-rwxr-xr-x1rootroot503300Nov1609:30/home/skynet/tool

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論