亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1231 | 回復(fù): 0
打印 上一主題 下一主題

制作一個(gè)小型的 Linux [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-04-25 15:53 |只看該作者 |倒序?yàn)g覽
軟件包下載:
http://ftp.osuosl.org/pub/nslu2/sources/
第一章                   前言
目的
     本文的目的,  是講述嵌入式 Linux 系統(tǒng)的建立、開發(fā)的一般過程。      制作一個(gè)小型的 Linux
的系統(tǒng),可以移植至其它硬盤、軟盤、優(yōu)盤、flash rom......
關(guān)于作者
     九賤,E 名 kendo,喜歡網(wǎng)絡(luò)入侵技術(shù)、防火墻、入侵檢測技術(shù)及網(wǎng)絡(luò)技術(shù),對 Linux
也頗感興趣,想認(rèn)識有共同愛好的朋友。最近閑暇,把一些學(xué)過的東西寫下來,總結(jié)總結(jié),
以作備忘這需。已完成的有《網(wǎng)絡(luò)入侵檢測設(shè)計(jì)與 Snort2.2 源碼分析》和這篇《我也來學(xué)做
嵌入式 Linux》 。正在進(jìn)行中的有《Windows 防火墻技術(shù)實(shí)現(xiàn)大全》和《Linux 防火墻實(shí)現(xiàn)及
         。大家可以在 CU 上,或者是到我的小站
www.skynet.org.cn
上與我交流
源碼分析》
做一個(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)將要放到某臺機(jī)器,如手機(jī)或另一
臺 PC 機(jī),這臺機(jī)我們稱為目標(biāo)主機(jī)。
     我們一般開發(fā)機(jī)上已經(jīng)有一套開發(fā)工具,      我們稱之為原生開發(fā)套件,        我們一般就是用它
們來開發(fā)程序,那么,那什么又是交叉編譯環(huán)境呢?其實(shí)一點(diǎn)也不神秘,也就是在開發(fā)機(jī)上
再安裝一套開發(fā)工具,這套開發(fā)工具編譯出來的程序,如內(nèi)核、系統(tǒng)程序或者我們自己的程
序,是放在目標(biāo)主機(jī)上運(yùn)行的,需要用這套新的開發(fā)工具來完成編譯等工作。
     那么或許有初學(xué)者會問,    直接用原生開發(fā)工具為目標(biāo)主機(jī)編譯程序不就完了?至少我當(dāng)
初是這么想的。一般來說,我們的開發(fā)機(jī)都是 X86 平臺,原生開發(fā)套件開發(fā)的工具,也針
對 X86 平臺,而我們的目標(biāo)主機(jī)可能是 PowerPC、IXP、MIPS......所以,我們的交叉編譯
環(huán)境是針對某一類具體平臺的。
     一般來講,交叉開發(fā)環(huán)境需要二進(jìn)制工具程序、編譯器、C 鏈接庫,嵌入式開發(fā)常用的
這三類開發(fā)軟件是:
          :二進(jìn)制工作庫
Binutils
          :C/C++編譯器
Gcc
          :C 函數(shù)庫
uClibc
當(dāng)然,GNU 包含的工具套件不僅于此,你還要以根據(jù)實(shí)際需要,進(jìn)行選擇。
第二步、編譯內(nèi)核
      開發(fā)工具是針對某一類硬件平臺,內(nèi)核同樣也是。這一步,我們需要用第一步中建立的
交叉編譯工具,對內(nèi)核進(jìn)行編譯,對于有內(nèi)核編譯經(jīng)驗(yàn)的人來說,這是非常簡單的;
第三步、建立根文件系統(tǒng)
      也就是建立我們平?吹降 bin、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......
第四步、啟動系統(tǒng)
      在這一步,   我們把建立好的目標(biāo)、       文件、 程序、內(nèi)核及模塊全部拷貝到目標(biāo)機(jī)存儲器上,
如硬盤。然后為系統(tǒng)安裝 bootloader,對于嵌入式系統(tǒng),有許多引導(dǎo)程序可供我們使用。不
過它們許多都有硬件平臺的限制。當(dāng)然,如果你是工作在 X86,可以直接用 lilo 來引導(dǎo),事
實(shí)上,本文就是采用的 lilo。
      做到這一步,將目標(biāo)存儲設(shè)備掛上目標(biāo)機(jī),如果順利,就可以啟動系統(tǒng)了。
      當(dāng)然,針對某些特別的平臺,不能像硬盤這樣拷貝了,需要讀卡器、燒錄......但是基本
的方法是相通的!
第五步、優(yōu)化和個(gè)性化系統(tǒng)
      通過前四步,我們已經(jīng)得到了一個(gè)可以正常工作的系統(tǒng)。在這一步里,就是發(fā)揮你想像
的時(shí)候了......
本文的工作環(huán)境
項(xiàng)目根目錄/home/kendo/project ------>;我將它指定至 PATH:$PRJROOT
子目錄及說明
目錄           內(nèi)容
                目標(biāo)板的引導(dǎo)加載程序,如 lilo 等
bootloader
                建立交叉編譯平臺的工具源碼
build-tools
             調(diào)試工具及所有相關(guān)包
debug
            項(xiàng)目中用到的所有文檔
doc
              編譯好的內(nèi)核映像,以及根文件系統(tǒng)
images
             各個(gè)版本的 Linux 內(nèi)核源碼
kernel
             制作好的根文件系統(tǒng)
rootfs
              目標(biāo)板將要用到的系統(tǒng)應(yīng)用系統(tǒng),比如 thttpd,udhcpd 等
sysapps
            存放臨時(shí)文件
tmp
            編譯好的跨平臺開發(fā)工具鏈以及 C 鏈接庫
tools
工作的腳本
#!/usr/bin
export PROJECT=skynet
export PRJROOT=/home/${PROJECT}
export TARGET=i386-linux
export PREFIX=${PRJROOT}/tools
export TARGET_PREFIX=${PREFIX}/${TARGET}
export PATH=${PREFIX}/bin:/bin:/sbin:/usr/bin:/usr/sbin
cd $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ā)人員;
     自動創(chuàng)建
     無它,方便而。
     因?yàn)榍耙黄恼轮?              已經(jīng)講述了全手工創(chuàng)建交叉編譯環(huán)境的一般性方法,     本文就不打算
再重復(fù)這個(gè)步驟了,感興趣的朋友,可以再去搜索那篇貼子,提醒一點(diǎn)的就是,在準(zhǔn)備工具
鏈的時(shí)候,要注意各個(gè)工具版本之間的搭配、每個(gè)工具需要哪些補(bǔ)丁,我建議你在 google
上針對這兩項(xiàng)搜索一下,準(zhǔn)備一個(gè)清單,否則......
     本章要講述的是自動創(chuàng)建交叉編譯環(huán)境的方法。目標(biāo),針對商業(yè)硬件平臺,廠家都會為
你提供一個(gè)開發(fā)包,我用過 XX 廠家的 IXP425 和 MIPS 的,非常地方便,記得我第一次接
觸嵌入式開發(fā),拿著這個(gè)開發(fā)包自動化創(chuàng)建交叉編譯環(huán)境、編譯內(nèi)核、建立根文件系統(tǒng)、創(chuàng)
建 Ram Disk,我反復(fù)做了三四次,結(jié)果還不知道自己究竟做了些什么,呵呵,夠傻吧......
所以,建議沒有這方面經(jīng)驗(yàn)的讀者,還是首先嘗試一下手工創(chuàng)建的方法吧,而本章接下來的
內(nèi)容,    是送給曾經(jīng)被它深深傷害而不想再次去親歷這項(xiàng)工作而又想提高效率而又沒有商業(yè)開
發(fā)包的朋友。
建立交叉開發(fā)工具鏈
準(zhǔn)備工具:
     buildroot-0.9.27.tar.tar
     只需要一個(gè)軟件?對,其它的不用準(zhǔn)備了,buildroot 事實(shí)上是一個(gè)腳本與補(bǔ)丁的集合,
其它需要用到的軟件,如 gcc、uClibc,你只需在 buildroot 中指明相應(yīng)的版本,它會自動去
給你下載。
     事實(shí)上,buildroot 到網(wǎng)上去下載所需的所有工作是需要時(shí)間的,除非你的帶寬足夠,否
則下載軟件時(shí)間或許會占去 80%,而我在做這項(xiàng)工作之間,所需的工作鏈全部都在我本地
硬盤上,我解壓開 buildroot 后,新建 dl 文件夾,將所有工具源碼的壓縮包拷貝進(jìn)去,呵呵,
buildroot 就不用去網(wǎng)上下載了。
我的軟件清單:
Linux-libc-headers-2.4.27.tar.bz2
Gcc-3.3.4.tar.bz2
binutils 2.15.91.0.2.tar.bz2
uClibc 0.9.27.tar.bz2
genext2fs_1.3.orig.tar.gz
ccache-2.3.tar.gz
將它拷貝到${PRJROOT}/build-tools 下,解壓
[root@skynet build-tools]# tar jxvf buildroot-0.9.27.tar.tar
[root@skynet build-tools]#cd buildroot
配置它:
[root@skynet build-tools]#make menuconfig
################################################################################
###出錯(cuò)參考
http://www.cnblogs.com/ottor/articles/1087734.html
################################################################################
Target Architecture (i386) --->; 選擇硬件平臺,我的是 i386
Build options --->; 編譯選項(xiàng)
這個(gè)選項(xiàng)下重要的是:
(${PRJROOT}/tools) Toolchain and header file location?編譯好的工具鏈放在哪兒?
如果你像我一樣,所有工具包都在本地,不需它到網(wǎng)上自動下載,可以把 wget command 選
項(xiàng)清空;
Toolchain Options --->; 工具鏈選項(xiàng)
                                      頭文件它會自動去下載,不過應(yīng)該保證與你將要用的內(nèi)核
--- Kernel Header Options
是同一個(gè)版本;
[] Use the daily snapshot of uClibc? 使用最近的 uClibc 的 snapshot
                                                        Binutils 的版本
Binutils Version (binutils 2.15.91.0.2) --->;
                                                    gcc 版本
GCC compiler Version (gcc 3.4.2) --->;
Build/install c++ compiler and libstdc++?
                                                                 支持的語言,我沒有選擇 java
[]     Build/install java compiler and libgcj?
                                               啟用 ccache 的支持,      它用于編譯時(shí)頭文件的緩存
[ ] Enable ccache support?
處理,用它來編譯程序,第一次會有點(diǎn)慢,但是以后的速度可就很理想了,呵呵......
                                     根據(jù)你的需要,選擇 gdb 的支持
--- Gdb Options
Package Selection for the target --->;
這一項(xiàng)我沒有選擇任意一項(xiàng),因?yàn)槲掖蛩愀募到y(tǒng)及 busybox                                     等工具鏈創(chuàng)建成工,手工
來做。
Target Options --->; 文件系統(tǒng)類型,根據(jù)實(shí)際需要選,我用的 ext2;
配置完成后,編譯它:
[root@skynet build-tools]#make
這一項(xiàng)工作是非常花時(shí)間的,我的工具包全部在本地,也花去我一小時(shí)十三分的時(shí)間,如果
全要下載,我估計(jì)網(wǎng)速正常也要多花一兩個(gè)鐘頭。
經(jīng)過漫長的等待(事實(shí)上并不漫長,去打了幾把游戲,很快過去了)                                             :
......
make[1]: Leaving directory `/home/skynet/build-tools/buildroot/build_i386/genext2fs-1.3'
touch -c /home/skynet/build-tools/buildroot/build_i386/genext2fs-1.3/genext2fs
[email=#-@find]#-@find[/email]
/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-tools/buildroot/build_i386/genext2fs-1.3/genext2fs -i 503 -b 1056 \
           -d          /home/skynet/build-tools/buildroot/build_i386/root            -q      -D
target/default/device_table.txt /home/skynet/build-tools/buildroot/root_fs_i386.ext2
大功告成!!      !
清點(diǎn)戰(zhàn)利品
讓我來看看它究竟做了哪些事情吧:
[root@skynet skynet]# cd tools
[root@skynet tools]# ls
bin bin-ccache i386-linux i386-linux-uclibc include info lib libexec               man usr
bin:所有的編譯工具,如 gcc,都在這兒了,只是加了些指定的前綴;
bin-ccache:如果在 Toolchain optaion 中沒有選擇對 ccache 的支持,就沒有這一項(xiàng)了;
i386-linux:鏈接文件;實(shí)際指向 include
i386-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)行的程序會告訴你:
./test: linked against GNU libc
因?yàn)槌绦蜻\(yùn)行庫會尋到默認(rèn)的/lib:/usr/lib 上面去,而我們目前的 uclibc 的庫并不在那里(雖
然對于目標(biāo)機(jī)來講,這是沒有錯(cuò)的)                ,所以,也只能暫時(shí)靜態(tài)編譯,試試它能否工作了。當(dāng)
然,你也可以在建好根文件系統(tǒng)后,試試用 chroot......
第三章                             編譯內(nèi)核
本章的工作,是為目標(biāo)機(jī)建立一個(gè)合適的內(nèi)核,對于建立內(nèi)核,我想有兩點(diǎn)值得考慮的:
1、功能上的選擇,應(yīng)該能夠滿足需要的情況下,盡量地小;
2、小不是最終目的,穩(wěn)定才是;
所以,最好編譯內(nèi)核前有一份目標(biāo)機(jī)硬件平臺清單以及所需功能清單,這樣,才能更合理地
裁減內(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- bzImage
ARCH 指明了硬件平臺,CROSS_COMPILE 指明了這是交叉編譯,且編譯器的名稱為
i386-linux-XXX,這里沒有為編譯器指明路徑,是因?yàn)槲仪懊嬖?devedaq 腳本中已將其加入
至環(huán)境變量 PATH。
又是一個(gè)漫長的等待......
OK,編譯完成,673K,稍微大了點(diǎn),要移到其它平臺,或許得想辦法做到 512 以下才好,
回頭來想辦法做這個(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.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 下新建對應(yīng)文件夾也是可行的。
安裝內(nèi)核模塊
完整內(nèi)核的編譯后,             剩下的工作就是建立及安裝模塊了,                因?yàn)槲业膬?nèi)核并沒有選擇模塊的支
持 (這樣擴(kuò)展性差了一點(diǎn),               但是對于我的系統(tǒng)來說,         功能基本上定死了,         這樣影響也不太大) ,
所以,剩下的步驟也省去了,如果你還需要模塊的支持,應(yīng)該:
//建立模塊
#make ARCH=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 來建立,而需要使用交叉編譯工
具。需要用到 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í),我只會提到內(nèi)核的拷貝,因?yàn)槲业南到y(tǒng)并沒有模塊的
支持。如果你需要使用模塊,只需按相同方法將其拷貝至相應(yīng)目錄即可。
附,內(nèi)核編譯清單
                                            不選
Code maturity level options
                                             不選
Loadable module support
                                          根據(jù)實(shí)際,選擇處理器類型
Processor type and features
General setup --->;
Networking support
PCI support
(Any)      PCI access mode
PCI device name database
System V IPC
Sysctl support
(ELF) Kernel core (/proc/kcore) format
Kernel support for ELF binaries
Power Management support
                                                       MTD 設(shè)備,我用 CF 卡,不選
Memory Technology Devices (MTD)        --->;
                                                              不選
Parallel port support --->;
                                                             我的系統(tǒng)用不著即插
Plug and Play configuration --->;
即用,不選
Block devices --->;
Loopback device support
RAM disk support
(4096) Default RAM disk size (NEW)
    Initial RAM disk (initrd) support
                                          --->; 不選
Multi-device support (RAID and LVM)
                                                基本上都選了
Networking options --->;
                                                    用了默認(rèn)的
ATA/IDE/MFM/RLL support --->;
                                              不選
Telephony Support --->;
                                         不選
SCSI support --->;
                                              不選
Fusion MPT device support --->;
                                                  不選
I2O device support --->;
                                                    根據(jù)實(shí)際情況選擇
Network device support --->;
                                                   不選
Amateur Radio support --->;
                                                  不選
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 console on serial port
                                               不選
Multimedia 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 support
Console drivers --->;
                               調(diào)試時(shí)接顯示器用
VGA text console
剩下三個(gè)都不要
Sound --->;
USB support --->;
Kernel hacking --->;
第四章                                   建立根文件系統(tǒng)
1、建立目錄
構(gòu)建工作空間時(shí),rootfs 文件夾用來存放根文件系統(tǒng),
#cd rootfs
根據(jù)根文件系統(tǒng)的基本結(jié)構(gòu),建立各個(gè)對應(yīng)的目錄:
# mkdir bin dev etc lib proc sbin tmp usr var root home
# chmod 1777 tmp
# mkdir usr/bin usr/lib usr/sbin
# ls
dev etc lib proc sbin tmp usr var
# mkdir var/lib var/lock var/log var/run var/tmp
# chmod 1777 var/tmp
對于單用戶系統(tǒng)來說,root 和 home 并不是必須的。
準(zhǔn)備好根文件系統(tǒng)的骨架后,把前面建立的文件安裝到對應(yīng)的目錄中去。
2、拷貝鏈接庫
把 uclibc 的庫文件拷貝到剛才建立的 lib 文件夾中:
# cd ${PREFIX}/lib
[root@skynet lib]# cp *-*.so ${PRJROOT}/rootfs/lib
[root@skynet lib]# cp -d *.so.[*0-9] ${PRJROOT}/rootfs/lib
3、拷貝內(nèi)核映像和內(nèi)核模塊
因?yàn)闆]有模塊,所以拷貝模塊就省了,
新建 boot 目錄,把剛才建立好的內(nèi)核拷貝過來
# cd /home/kendo/control-project/daq-module/rootfs/
# mkdir boot
# cd ${PRJROOT}/images
# cp bzImages-2.4.18-rmk5 /home/kendo/control-project/daq-module/rootfs/boot
4、建立/dev 下的設(shè)備文件
在 linux 中,所有的的設(shè)備文件都存放在/dev 中,使用 mknod 命令創(chuàng)建基本的設(shè)備文件。
mknod 命令需要 root 權(quán)限,不過偶本身就是用的 root 用戶,本來是新建了一個(gè)用戶專門用
于嵌入式制作的,不過后來忘記用了......
# mknod -m 600 mem c 1 1
# mknod -m 666 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)建必要的符號鏈接:
# ln -s /proc/self/fd fd
# ln -s fd/0 stdin
# ln -s fd/1 stdout
# ln -s fd/2 stderr
# ls
console fd mem null random stderr stdin stdout tty tty0 tty1 ttyS0 zero
設(shè)備文件也可以不用手動創(chuàng)建,                 聽說 RedHat /dev 下的腳本 MAKEDEV 可以實(shí)現(xiàn)這一功能,
不過沒有試過......
基本上差不多了,不過打算用硬盤/CF 卡來做存儲設(shè)備,還需要為它們建立相關(guān)文件,因?yàn)?br /> 我的 CF 在目標(biāo)機(jī)器上是 CF-to-IDE,可以把它們等同來對待,先看看 Redhat 下邊 had 的相
關(guān)屬性:
# ls -l /dev/hda
brw-rw----       1 root   disk    3, 0 Jan 30 2003 /dev/hda
# ls -l /dev/hda1
brw-rw----       1 root   disk    3, 1 Jan 30 2003 /dev/hda1
對比一下,可以看出,had 類型是 b,即塊設(shè)備,主編號為 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 3
5、添加基本的應(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 目錄下,解壓:
#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 TARGET_ARCH=i386 CROSS= i386-linux- PREFIX=${PRJROOT}/rootfs
//安裝
#make TARGET_ARCH=i386 CROSS= i386-linux- PREFIX=${PRJROOT}/rootfs install
# cd ${PRJROOT}/rootfs/bin
# ls
addgroup busybox chown            delgroup    echo         kill    ls      mv          ping   rm
sleep
adduser     chgrp      cp         deluser     grep        ln        mkdir  netstat ps       rmdir
umount
ash          chmod       date      dmesg         hostname    login   mount  pidof     pwd      sh
vi
一下子多了這么多命令......
配置 busybox 的說明:
A、如果編譯時(shí)選擇了:
Runtime SUID/SGID configuration via /etc/busybox.conf
系統(tǒng)每次運(yùn)行命令時(shí),都會出現(xiàn)“Using fallback suid method ”
可以將它去掉,不過我還是在/etc 為其建了一個(gè)文件 busybox.conf 搞定;
B 、 Do           you     want       to    build    BusyBox       with    a   Cross    Compiler?
(i386-linux-gcc) Cross Compiler prefix
這個(gè)指明交叉編譯器名稱(其實(shí)在編譯時(shí)的命令行已指定過了......)
    安裝選項(xiàng)下的(${PRJROOT}/rootfs) BusyBox installation prefix,             這個(gè)指明了編譯好后的工
C、
具的安裝目錄。
D、靜態(tài)編譯好還是動態(tài)編譯?
[ ] Build BusyBox as a static binary (no shared libs)
動態(tài)編譯的最大好處是節(jié)省了寶貴空間,                  一般來說都是用動態(tài)編譯,   不過我以前動態(tài)編譯出
過問題(其實(shí)是庫的問題,不關(guān) busybox 的事)             ,出于慣性,我選擇了靜態(tài)編譯,為此多付
出了 107KB 的空間。
E、其它命令,根據(jù)需要,自行權(quán)衡。
6、系統(tǒng)初始化文件
      內(nèi)核啟動時(shí),最后一個(gè)初始化動作就是啟動 init 程序,當(dāng)然,大多數(shù)發(fā)行套件的 Linux
都使用了與 System V init 相仿的 init,可以在網(wǎng)上下載 System V init 套件,下載下來交叉編
譯。另外,我也找到一篇寫得非常不錯(cuò)的講解如何編寫初始化文件的文件,bsd-init,回頭
附在后面。不過,對于嵌入式系統(tǒng)來講,BusyBox init 可能更為合適,在第 6 步中選擇命令
的時(shí)候,應(yīng)該把 init 編譯進(jìn)去。
inittab
#cd ${PRJROOT}/rootfs/etc
#vi inittab
我的 inittal 文件如下:
#指定初始化文件
::sysinit:/etc/init.d/rcS
#打開一個(gè)串口,波特率為 9600
::respawn:/sbin/getty 9600 ttyS0
#啟動時(shí)執(zhí)行的 shell
::respawn:/bin/sh
#重啟時(shí)動作
::restart:/sbin/init
#關(guān)機(jī)時(shí)動作,卸載所有文件系統(tǒng)
::shutdown:/bin/umount -a –r
保存退出;
rcS 腳本:
#mkdir ${PRJROOT}/rootfs/etc/init.d
#cd ${PRJROOT}/rootfs/etc/init.d
#vi rcS
腳本內(nèi)容如下:
#!/bin/sh
#Set Path
#PATH=/sbin:/bin:
#export PATH
PATH=$PATH:/usr/local/sbin:.
export PATH
#start syslogd
syslogd -m 60
klogd
#install /proc
mount -n -t proc none /proc
#reinstall root file system by read/write mode(need: /etc/fstab)
mount -n -o remount,rw /
#reinstall /proc
mount -n -o remount,rw -t proc none /proc
#Trap Ctrl+C only in this shell so we can interrupt subprocesses
trap ":" 2 3 20
for i in /etc/start/S??* ;do
      # Ignore dangling symlinks (if any).
      [ ! -f "$i" ] && continue
      echo "Running $i ."
      case "$i" in
             *.sh)
                   # Source shell script for speed.
                   (
                   trap - INT QUIT TSTP
                   set start
                   . $i
                   )
                   ;;
             *)
                   # No sh extension, so fork subprocess.
                   $i start
                   ;;
      esac
      echo "Done $i ."
      echo
done
保存退出。
腳本中最后一個(gè) for 循環(huán),是讀取/etc/start 中所有的以 S 開頭的腳本,新建此目錄:
#mkdir ${PRJROOT}/roofts/etc/start
新建三個(gè)啟動腳本:
S01network.sh S02route.sh S03server.sh
分別對應(yīng)了啟動網(wǎng)絡(luò)/路由/服務(wù)程序
S01network.sh
       腳本用來啟動網(wǎng)卡。
       我是根據(jù) Red hat 的作法,把網(wǎng)卡配置放在/etc/sysconfig/network-scripts 目錄下,類似于
ifcfg-ethXX 這樣子,它們的語法是:
DEVICE=eth0
BOOTPROTO=static
BROADCAST=88.88.88.255
IPADDR=88.88.88.44
NETMASK=255.255.255.0
NETWORK=88.88.88.0
ONBOOT=yes
S01network.sh 的內(nèi)容如下:
#!/bin/sh
. /etc/sysconfig/network
#enable ip_forword
echo >1 /proc/sys/net/ipv4/ip_forward
#enable syn_cookie
echo >1 /proc/sys/net/ipv4/tcp_syncookies
#enable loopback interface
/sbin/ifconfig lo 127.0.0.1
#eanble ethernet interface
/usr/sbin/bootife
#set hostname
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]
then
           HOSTNAME=localhost
fi
/bin/hostname ${HOSTNAME}
請注意這個(gè)腳本文件,有兩個(gè)地方:
1、包含了另一個(gè)配置文件/etc/sysconfig/network,在這里,我也是照抄了 redhat,我的
/etc/sysconfig/network 這個(gè)文件的內(nèi)容如下:
NETWORKING=yes
HOSTNAME=skynet
GATEWAY=88.88.88.2
2、在啟動網(wǎng)卡時(shí),我使用了
#eanble ethernet interface
/usr/sbin/bootife
bootife 是 我 自 己 寫 的 一 個(gè) C 程 序 , 作 用 是 讀 取 /etc/sysconfig/network-scripts/ 下 面 的
ifcfg-ethXX 文件,并配置之,本來這里就該用 shell 來完成更合適一點(diǎn),無奈,偶 shell 功底
實(shí)在差了一點(diǎn)(剛學(xué)幾天)                      ,所以被逼無奈用 C 來完成之,后面我會附上我的 C 的源碼。
S02route.sh
在/etc/start 下,建立新腳本 S02route.sh,它的作用是啟動所有配置的靜態(tài)路由:
#!/bin/bash
. /etc/sysconfig/network
# Add non interface-specific static-routes.
if [ -f /etc/sysconfig/static-routes ]
then
             grep "eth*" /etc/sysconfig/static-routes | while read ignore args ; do
#                       echo "/sbin/route add -"$args
                        /sbin/route add -$args
             done
fi
#Add defalut gw
/sbin/route add default gw ${GATEWAY}
OK,啟動時(shí)讀取的配置文件是/etc/sysconfig/static-routes ,它的語法和 Redhat 是一樣的,請
參照建立此文件。
S03server.sh
新建啟動腳本 S03server:
#!/bin/sh
#------------------------------------------------------------------
#-- Source
#--         Author(s)             : kendo
#--                                    Email:
kendo999@sohu.com
#--                                    
http://www.skynet.org.cn
#--         2005/10/31
#------------------------------------------------------------------
. /etc/sysconfig/bootserver
if [ "$enable_httpd" = 1 ] ; then
           . /etc/scripts/httpd.sh $1
fi
if [ "$enable_adsl" = 1 ] ; then
           ......
fi
if [ "$enable_udhcpd" = 1 ] ; then
           ......
fi
很簡單,根據(jù)相應(yīng)變量的值,調(diào)用相應(yīng)的腳本。
1、這些啟動標(biāo)志變量,我定義在了/etc/sysconfig/bootserver 當(dāng)中,其內(nèi)容如下:
#start server on system boot
#1:yes 0:no
enable_httpd=1
enable_adsl=1
enable_udhcpd=1
2、每種服務(wù)對應(yīng)的腳本,我都放在了/etc/scripts 下面。這些腳本,取決于你打算使用哪些
服務(wù)程序了。腳本的來源,可以自己編寫,有可能其源碼中自帶有,也可以到網(wǎng)上查找......
我就不再一一贅述了,
OK,基本上,腳本的修改就完成了,下一步,將是建立 RamDisk。
———————————————————————————————————————
———————
附,讀取網(wǎng)卡配置文件,啟動網(wǎng)卡的 C 源碼:
/************************************************************************
** author:kendo
** date:2005/10/26
***********************************************************************/
#include
#include
#include
#include
#include
#include
#define NETCFGDIR                   "/etc/sysconfig/network-scripts/"
struct _ifcfg{
           char device[8];
           char bootproto[8];
           char br[16];
           char netmask[16];
           char ip[16];
           char network[16];
           int onboot;
};
void ParseKey(struct _ifcfg *ifcfg,char *key,char *value)
{
           if(!strcmp(key,"DEVICE"))
           {
                       strcpy(ifcfg->device,value);
           }
           else if(!strcmp(key,"BOOTPROTO"))
           {
                       strcpy(ifcfg->bootproto,value);
           }
           else if(!strcmp(key,"BROADCAST"))
           {
                       strcpy(ifcfg->br,value);
           }
           else if(!strcmp(key,"IPADDR"))
           {
                       strcpy(ifcfg->ip,value);
           }
           else if(!strcmp(key,"NETMASK"))
           {
                       strcpy(ifcfg->netmask,value);
           }
           else if(!strcmp(key,"NETWORK"))
           {
                       strcpy(ifcfg->network,value);
           }
           else if(!strcmp(key,"ONBOOT"))
           {
                       ifcfg->onboot=(strcmp(value,"yes") ? 0 : 1);
           }
}
int main(int argc,char **argv)
{
          FILE *fp;
          DIR *dir;
          int i;
          char filename[50],buf[80];
          char *index,*key,*value,*p;
          struct _ifcfg *ifcfg;
          struct dirent *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))                  /*這里,只啟動了
以太網(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 %s netmask %s broadcast %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);
          return 0;
}
fstab 文件
#vi fstab
我的 fstab 很簡單:
/dev/hda1 / ext2 defaults 1 1
none /proc proc defaults 0 0
第五章 讓 MyLinux 能夠啟動
     前一章,我們把編譯好的內(nèi)核、應(yīng)用程序、配置文件都拷貝至 rootfs 目錄對應(yīng)的子目錄
中去了,這一步,就是把這些文件移植至目標(biāo)機(jī)的存儲器。這里,我是先另外拿一塊硬盤,
掛在我的開發(fā)機(jī)上做的測試,因?yàn)槲业谋颈居脕韺懳臋n,PC 機(jī)用來做開發(fā)機(jī),已經(jīng)沒有另
外的機(jī)器了......但是本章只是講述一個(gè)一般性的過程,并不影響你直接在目標(biāo)主機(jī)上的工
作。
      因?yàn)橐院竽繕?biāo)機(jī)識別硬盤序號都是 hda,而我現(xiàn)在直接掛上去,則會是 hdb、hdc......這
樣,安裝 lilo 時(shí)有點(diǎn)麻煩(雖然也可以實(shí)現(xiàn))                           。所以我想了另一個(gè)辦法:
      把新硬盤掛在 IDE0 的 primary 上,進(jìn)入 linux 后,會被認(rèn)為是 hda;
      原來主機(jī)的裝 Redhat 的硬盤,                我將它從 IDE0 的 primary 上變到了 IDE1 的 primary,    因
為它的 lilo 早已裝好,基本上不影響系統(tǒng)的使用;
分區(qū)和格式化
BIOS 中改為從第二個(gè)硬盤啟動;也就是從我原來開發(fā)機(jī)啟動,新的硬盤被識別成了 had。
#fdisk /dev/hda
用 d 參數(shù)刪除已存在的所有分區(qū)
用 n 參數(shù)新建一個(gè)分區(qū),也是就/dev/hda1
格式化
#mkfs.ext2 /dev/hda1
安裝 bootloader
      因?yàn)槲沂?X86 平臺,所以直接用了 lilo,如果你是其這平臺,當(dāng)然,有許多優(yōu)秀的
bootloader 供你選擇,你只需查看其相應(yīng)的說明就可以了。
      編譯 lilo 配置文件,         我的配置文件名為 target.lilo.conf,置于${PRJROOT}/rootfs/etc 目錄。
內(nèi)容如下所示:
boot=/dev/hda
disk=/dev/hda
            bios=0x80
image=/boot/bzImage-2.4.18-rmk5
            label=Linux
            root=/dev/hda1
append="root=/dev/hda1"
            read-only
//新建文件夾,為 mount 做新準(zhǔn)備
#mkdir /mnt/cf
//把目標(biāo)硬盤 mount 上來
#mount –t ext2 /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 -C etc/target.lilo.conf
Warning: LBA32 addressing assumed
Added Linux *
-r :改變根目標(biāo)為/mnt/cf ,這樣配置文件其實(shí)就是/mnt/cf/etc/target.lilo.conf,也就是我們先
前建立的文件。
當(dāng)然,完成這一步,需要 lilo22.3 及以后版本,如果你的版本太舊,比如 Redhat9.0 自帶的,
就會出現(xiàn)下面的信息:
#lilo –r /mnt/cf –C etc/target.lilo.conf
Fatal: open /boot/boot.b: No such file or directory
這時(shí),你需要升級你的 lilo,或者重新安裝一個(gè)。
啟動系統(tǒng)
#umount /mnt/cf
#reboot
將 BIOS 改為從 IDE0 啟動,也就是目標(biāo)硬盤。如果一切順利,你將順利進(jìn)入一個(gè)屬于你的
系統(tǒng)。
回頭再來看看我們的工作空間吧
[root@skynet lib]# df /dev/hda1
Filesystem              1K-blocks     Used Available Use% Mounted on
/dev/hda1                  3953036     1628 3750600 1% /mnt/cf
總共花去了我 1628KB 的空間,看來是沒有辦法放到軟盤里邊去了^o^,不過一味求小,并
不是我的目標(biāo)。
[root@skynet skynet]# ls ${PRJROOT}
bootloader build-tools debug doc images kernel rootfs sysapps tmp tools
這幾個(gè)目錄中的文件,呵呵,與本文一開頭規(guī)劃的一樣
[root@skynet skynet]# ls build-tools/
buildroot buildroot-0.9.27.tar.tar
包含了 buildroot 源碼及壓縮包,              事實(shí)上 buildroot 下邊還包括了 GNU 其它工具的源碼、     編譯
文件等諸多內(nèi)容,是我們最重要的一個(gè)文件夾,不過到現(xiàn)在它已經(jīng)沒有多大用處了,如果你
喜歡,可以將它刪除掉(不建議)                     。
[root@skynet skynet]# ls images
2.4.18-rmk5 bzImage-2.4.18-rmk5 System-2.4.18-rmk5 vmlinux-2.4.18-rmk5
內(nèi)核映像及配置文件等,如果你有模塊,因?yàn)檫有相應(yīng)的目錄
[root@skynet skynet]# ls kernel/
linux-2.4.27 linux-2.4.27.tar.bz2
內(nèi)核源碼及壓縮包
[root@skynet skynet]# ls rootfs/
bin boot dev etc home lib linuxrc proc root           sbin tmp   usr var
制作好的根文件系統(tǒng),重中之重,注意備份......
[root@skynet skynet]# ls sysapps/
busybox-1.00 busybox-1.00.tar.gz
busybox-1.00 源碼包,或許你還要繼續(xù)添加/刪除一些命令......
[root@skynet skynet]# ls tools
bin i386-linux i386-linux-uclibc include info lib man
這個(gè)也很重要,我們制作好的交叉開發(fā)工具鏈。如果你要繼續(xù)開發(fā)程序,這個(gè)目錄重要性就
很高了。
其它目錄暫時(shí)是空的。
第六章 完善 MyLinux
      關(guān)于進(jìn)一步的調(diào)試,你可以在開發(fā)機(jī)上使用 chroot /mnt/cf /bin/sh 這樣的命令,以使我
們在目標(biāo)根文件系統(tǒng)上工作。
支持多用戶
      因?yàn)槲以诰幾g busybox 時(shí),已經(jīng)將它的多用戶那一大堆命令編譯了進(jìn)來。現(xiàn)在關(guān)鍵是的
要為其建立相應(yīng)的文件;
進(jìn)入原來的開發(fā)機(jī),進(jìn)入 rootfs 目錄,切換根目錄
#chroot rootfs/ /bin/sh
      A、建立/etc/passwd 文件,我的文件內(nèi)容如下:
root:x:0:0:root:/root:/bin/bash
      B、建立/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 建立密碼
#passwd root
      試試用 addgroup/addusr......這堆命令。然后重啟,從目標(biāo)硬盤上啟動;從 console 口,
9600 登陸試試(因?yàn)槲以?inittab 中啟用了 ttyS0,我未來的目標(biāo)機(jī),是沒有顯卡的,需要從
console 口或 SSH 進(jìn)去管理)
MyLinux login: root
Password:
BusyBox v1.00 (2004.10.10-04:43+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
~#
成功了......
增加 WEB Server
      Busybox 里邊有 httpd 選項(xiàng),不過我編譯時(shí)并沒有選擇,所以還是自己來安裝。我使用
的軟件是 thttpd-2.25b.tar.gz,將它移至 sysapps 目錄下。
[root@skynet sysapps]# tar zxvf thttpd-2.25b.tar.gz
[root@skynet sysapps]# cd thttpd-2.25b
//配置
[root@skynet thttpd-2.25b]# CC=i386-linux-gcc ./configure --host=$TARGET
......
i386-linux-gcc -static htpasswd.o -o htpasswd -lcrypt
make[1]: Leaving directory `/home/skynet/sysapps/thttpd-2.25b/extras'
//拷貝至根文件目錄
[root@skynet thttpd-2.25b]# cp thttpd ${PRJROOT}/rootfs/usr/sbin
//trip 處理
[root@skynet thttpd-2.25b]# i386-linux-strip ${PRJROOT}/rootfs/usr/sbin/thttpd
增加 ADSL 撥號功能
準(zhǔn)備工具:
ppp-2.4.1.tar.gz
rp-pppoe-3.6.tar.gz
將這兩個(gè)包拷貝到 sysapps/中,解壓。
#cd ppp-2.4.1
./configuare –-help
沒有看到幫助信息,郁悶。于是先配置它吧:
./configuration
打開 MakeFile 文件,
vi Makefile
在最開始添加如下兩句:
CC=i386-linux-gcc
DESTDIR=${PRJROOT}/rootfs
前者指明了交叉編譯工具
后者指明了目標(biāo)目錄,因?yàn)槲覐暮竺嫒湟杂械哪_本:
BINDIR = $(DESTDIR)/usr/sbin
MANDIR = $(DESTDIR)/usr/man
ETCDIR = $(DESTDIR)/etc/ppp
可以看出 DESTDIR 決定了二制進(jìn)文件目錄,幫助文件目錄和配置文件目錄
建立設(shè)備文件:
#cd ${PRJROOT}/rootfs/dev
# mknod ppp c 108 0
# chmod 600 ppp
#make;make install
交叉編譯 rp-pppoe-3.6.tar.gz
#cd rp-pppoe-3.6
# CC=i386-linux-gcc ./configure --prefix=${PRJROOT}/rootfs/usr --host=$TARGET
#make;make install
增加 SNMP 功能
     一般系統(tǒng)都會有 SNMP 的支持,下載了 net-snmp-5.1.3.1,先看看 INSTALL 和 FAQ 文
檔(因?yàn)橐郧皬膩頉]有碰過這個(gè)東東,見笑了......)                                 ,按照說明,在原生主機(jī)上安裝了一回,
安裝完成后,發(fā)現(xiàn)在指定安裝目錄下主要包括了幾塊文件:
1. bin:SNMP 的一些功能腳本和程序;
2. sbin:主要的代理程序和 trap 程序:snmpd 和 snmptrap
3. include/lib:自身兼容及第三方開發(fā)所需的頭文件及庫文件;
4. share:主要是 MIB 文件;
     回到安裝目錄下,運(yùn)行./configuare --help,仔細(xì)查看了其安裝編譯選項(xiàng),因?yàn)槲叶ㄎ坏?br /> 小型的系統(tǒng),只需具備基本的 SNMP 功能即可,所以:
     那些 bin 目錄下的功能程序也不需要,對應(yīng)--disable-applications
     bin 下的腳本也是不需要的,對應(yīng):--disable-scripts
     用戶手冊也不需要:--disable-manuals
     關(guān)閉 ipv6 支持:--disable-ipv6
     還有一個(gè)--enable-mini-agent 選項(xiàng),說明是編譯出一個(gè)最小化的 snmpd,比較有趣,試
試先。
     對于交叉編譯,還需要用--host 指明目標(biāo)平臺。
OK,看完了幫助說明,開始編譯了:
1、配置,根據(jù)以上確定的選項(xiàng):
[root@skynet root]# CC=i386-linux-gcc ./configure --host=$TARGET --enable-mini-agent
--disable-ipv6 --with-endianness=little --disable-applications --disable-manuals --disable-scripts
--disable-ucd-snmp-compatibility
CC 指明了編譯器;          --host 指明了我的目標(biāo)平臺,             這個(gè)環(huán)境變量在我前面定義的 devedaq 腳本
中。
2、編譯
還算順利,繼續(xù)編譯它:
[root@skynet net-snmp-5.1.3.1]# make LDFLAGS="-static"
呵呵,因?yàn)闆]有裝 lib 庫,所以我用了-static 選項(xiàng),指明是靜態(tài)編譯;
3、安裝
      安裝就需要指明安裝路徑了,路徑可以在.config 的時(shí)候指定,因?yàn)槟莻(gè)時(shí)候,那串東
東太長了,我在 install 時(shí)指定也不遲:
#make prefix=${TARGET_PREFIX} exec_prefix=${TARGET_PREFIX} install
4、檢查一下:
[root@skynet net-snmp-5.1.3.1]# ls -l ${TARGET_PREFIX}/sbin
total 2120
-rwxr-xr-x     1 root      root       2164301 Nov 16 09:22 snmpd
snmpd 就是我們要的代理主程序了,大約靜態(tài)編譯有 2M。
[root@skynet net-snmp-5.1.3.1]# ls -l ${TARGET_PREFIX}/bin
total 4380
-rwxr-xr-x     2 root      root        391980 Oct 14 2004 ar
-rwxr-xr-x     2 root      root        581228 Oct 14 2004 as
......
呵呵,那堆程序和腳本沒有安裝,如 snmpwalk......
ls ${TARGET_PREFIX}/lib
ls -l ${TARGET_PREFIX}/include
看看我們需要的 mib 文件:
[root@skynet net-snmp-5.1.3.1]# ls ${TARGET_PREFIX}/share/snmp
mib2c.access_functions.conf              mib2c.column_defines.conf     mib2c.int_watch.conf
mib2c.old-api.conf
mib2c.array-user.conf                 mib2c.column_enums.conf       mib2c.iterate_access.conf
mib2c.scalar.conf
mib2c.check_values.conf                mib2c.conf                          mib2c.iterate.conf
mibs
mib2c.check_values_local.conf             mib2c.create-dataset.conf         mib2c.notify.conf
snmpconf-data
5、移植
基本完成了,因?yàn)?snmpd 太大了點(diǎn),對它進(jìn)行 strip 處理:
先備個(gè)份:
[root@skynet              net-snmp-5.1.3.1]#          cp    ${TARGET_PREFIX}/sbin/snmpd
${TARGET_PREFIX}/sbin/snmpd.bak
[root@skynet net-snmp-5.1.3.1]# i386-linux-strip ${TARGET_PREFIX}/sbin/snmpd
[root@skynet net-snmp-5.1.3.1]# ls -l ${TARGET_PREFIX}/sbin/snmpd
-rwxr-xr-x               1 root                  root            503300 Nov 16 09:30
/home/skynet/tools/i386-linux/sbin/snmpd
經(jīng)過處理后,還有近 500KB 了。
因?yàn)橹挥?SNMP agent 功能,即 snmpd 程序,其它的都可以忽略。用了靜態(tài)編譯,lib 下邊
那些 libnetsnmp 文件都可以不需要了,程序運(yùn)行
需要 MIB 庫,也就是 share 下的內(nèi)容,把這兩個(gè)東東拷到 rootfs 相應(yīng)的目錄中去:
[root@skynet              net-snmp-5.1.3.1]#          cp    ${TARGET_PREFIX}/sbin/snmpd
${PRJROOT}/rootfs/usr/sbin
[root@skynet net-snmp-5.1.3.1]# mkdir -p ${PRJROOT}/rootfs/usr/local/share
[root@skynet           net-snmp-5.1.3.1]#         cp     -r ${TARGET_PREFIX}/share/snmp
${PRJROOT}/rootfs/usr/local/share
[root@skynet                      net-snmp-5.1.3.1]#        cp              EXAMPLE.conf
${PRJROOT}/rootfs/usr/local/share/snmp/snmpd.conf
最后一步是把安裝目錄下的配置文件范例拷到 snmpd 啟動時(shí)默認(rèn)的搜索目錄中去。
6、測試
打開 snmpd.conf 看看:
[root@skynet net-snmp-5.1.3.1]# vi ${PRJROOT}/rootfs/usr/local/share/snmp/snmpd.conf
有如下語句:
#         sec.name source                    community
com2sec local          localhost          COMMUNITY
com2sec mynetwork NETWORK/24                    COMMUNITY
定義了兩個(gè)用戶,本地及網(wǎng)絡(luò)的,以及它們的通讀密鑰,按自己的需要修改一下,如:
#         sec.name source                    community
com2sec local          127.0.0.1         public
com2sec mynetwork 0.0.0.0               public
后面是定義用戶的用戶組等一大堆東東,事實(shí)上不用修改它們了。運(yùn)行它:
[root@skynet net-snmp-5.1.3.1]# chroot ${PRJROOT}/rootfs /bin/sh
BusyBox v1.00 (2004.10.13-06:32+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
/ # snmpd
/ # exit
在我們自己的根文件系統(tǒng)環(huán)境下運(yùn)行它,然后退出來。用 ps 查看:
#ps -aux
......
root       32270 0.0 0.3 1212 936 ?            S      09:38 0:00 snmpd
[root@skynet net-snmp-5.1.3.1]# netstat -anu
......
udp            0        0 0.0.0.0:161         0.0.0.0:*
呵呵,已經(jīng)成功啟動了。用一個(gè) SNMP 管理軟件試試,可以成功地獲取到信息。OK!
總結(jié)一下:
1、主程序+MIB 庫大了點(diǎn),共計(jì)約 2M,不過我確實(shí)沒有辦法再小了,而且一味求小,也不
是我的目的。
2、功能稍微簡單了些,只有 agent,如果需要,可以類似地把其它程序加上去就可以了。
3、第一次玩 net-snmp,還是有點(diǎn)生疏,比如我靜態(tài)編譯二進(jìn)制程序,并不需要 include/lib
下的文件,但是如何關(guān)閉它們呢?我試過--disable-ucd-snmp-compatibility,不過好像不是這
個(gè)選項(xiàng)......下次改進(jìn)了......
增加防火墻功能
準(zhǔn)備工具:
iptables-1.2.7a.tar.bz2
將其拷貝到 sysapps 中,解壓:
#tar jxvf iptables-1.2.7a.tar.bz2
#cd iptables-1.2.7
編譯
make KERNEL_DIR=${PRJROOT}/kernel/linux-2.4.27 DO_IPV6=1 PREFIX=${PREFIX}
CC=i386-linux-gcc
KERNEL_DIR:對應(yīng)的內(nèi)核所在路徑;
DO_IPV6:對應(yīng) IPV6 支持;
PREFIX:程序及庫文件安裝路徑
CC:編譯器
安裝
[root@skynet iptables-1.2.7]# make install KERNEL_DIR=${PRJROOT}/kernel/linux-2.4.27
PREFIX=${PREFIX}
拷貝
[root@skynet sbin]# cp ${PRJROOT}/tools/sbin/* ${PRJROOT}/rootfs/sbin
[root@skynet sbin]# cp -r ${PRJROOT}/tools/lib/iptables ${PRJROOT}/rootfs/lib/
[root@skynet sbin]# du -s ${PRJROOT}/rootfs/lib/
976       /home/skynet/rootfs/lib
[root@skynet sbin]# ls -lh ${PRJROOT}/rootfs/sbin/ip*
-rwxr-xr-x    1 root        root           73K Nov 16 15:36 /home/skynet/rootfs/sbin/ip6tables
-rwxr-xr-x    1 root        root           72K Nov 16 15:36 /home/skynet/rootfs/sbin/iptables
-rwxr-xr-x           1 root               root                       77K Nov 16 15:36
/home/skynet/rootfs/sbin/iptables-restore
-rwxr-xr-x           1 root               root                       74K Nov 16 15:36
/home/skynet/rootfs/sbin/iptables-save
測試,chroot,試一下 iptables 能不能正常運(yùn)行。


本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u2/67300/showart_585680.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP