嵌入(ru)式(shi)linux根文件(jian)系統(tong)制作,大神手把手教你(ni)
時間:2018-08-07 來(lai)源(yuan):未知
很(hen)(hen)多人對嵌(qian)入式linux根文件(jian)系統制(zhi)作都有(you)一些(xie)疑(yi)惑或者說(shuo)難點,有(you)時候制(zhi)作嵌(qian)入式linux根文件(jian)系統的時候總會達(da)不到自己(ji)預期的效果,其(qi)實我在這(zhe)里(li)告訴你(ni)根文件(jian)系統的制(zhi)作還是(shi)很(hen)(hen)簡單的,只要(yao)你(ni)掌握好方法就好。
首(shou)先(xian)我們(men)就先(xian)來看一(yi)下(xia)什(shen)么是根文件系統,這樣(yang)的話會對接下(xia)來的制作(zuo)有幫助。
根文(wen)件(jian)(jian)系(xi)統(tong)(tong)首先是(shi)一(yi)種文(wen)件(jian)(jian)系(xi)統(tong)(tong),該文(wen)件(jian)(jian)系(xi)統(tong)(tong)不僅(jin)具(ju)有普通文(wen)件(jian)(jian)系(xi)統(tong)(tong)的(de)(de)(de)存儲數據文(wen)件(jian)(jian)的(de)(de)(de)功能,但是(shi)相對于普通的(de)(de)(de)文(wen)件(jian)(jian)系(xi)統(tong)(tong)而言(yan)它還是(shi)內(nei)核啟(qi)動(dong)(dong)時所掛載(zai)(mount)的(de)(de)(de)第一(yi)個(ge)文(wen)件(jian)(jian)系(xi)統(tong)(tong),系(xi)統(tong)(tong)引導啟(qi)動(dong)(dong)程序會在根文(wen)件(jian)(jian)系(xi)統(tong)(tong)掛之后從中(zhong)(zhong)把一(yi)些初始化腳本(如inittab、rcS)和(he)服務加(jia)載(zai)到內(nei)存中(zhong)(zhong)去運行(xing)。我們要明白(bai)文(wen)件(jian)(jian)系(xi)統(tong)(tong)和(he)內(nei)核是(shi)完全獨立的(de)(de)(de)兩個(ge)部分(fen)。在嵌(qian)入式中(zhong)(zhong)移植(zhi)的(de)(de)(de)內(nei)核下載(zai)到開(kai)發板上,是(shi)沒有辦法真正的(de)(de)(de)啟(qi)動(dong)(dong)Linux操作系(xi)統(tong)(tong)的(de)(de)(de),會出(chu)現(xian)無(wu)法加(jia)載(zai)文(wen)件(jian)(jian)系(xi)統(tong)(tong)的(de)(de)(de)錯誤(wu)。
根(gen)文(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong)之所以(yi)在(zai)前面加一(yi)個(ge)(ge)”根(gen)“,說明(ming)它是(shi)(shi)加載(zai)其(qi)它文(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong)的”根(gen)“,既(ji)然(ran)是(shi)(shi)根(gen)的話,那么如(ru)果沒(mei)有(you)(you)這(zhe)個(ge)(ge)根(gen),其(qi)它的文(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong)也(ye)就沒(mei)有(you)(you)辦(ban)法進行加載(zai)的。它包(bao)括了Linux啟(qi)動(dong)(dong)時所必(bi)須的目(mu)錄和(he)關鍵性的文(wen)件(jian)(jian)(jian),例如(ru)Linux啟(qi)動(dong)(dong)時都需要有(you)(you)init目(mu)錄下(xia)的相關文(wen)件(jian)(jian)(jian),在(zai) Linux掛(gua)(gua)載(zai)分(fen)區時Linux一(yi)定(ding)會找/etc/fstab這(zhe)個(ge)(ge)掛(gua)(gua)載(zai)配(pei)置(zhi)文(wen)件(jian)(jian)(jian)等,根(gen)文(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong)中還包(bao)括了應用程序(如(ru)ls、mkdir、rm、ifconfig等命令)和(he) GNU C 庫(ku)(glibc、eglibc或(huo)uclibc)等。任何(he)包(bao)括這(zhe)些Linux 系(xi)(xi)(xi)(xi)統(tong)(tong)啟(qi)動(dong)(dong)所必(bi)須的文(wen)件(jian)(jian)(jian)都可以(yi)成為根(gen)文(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong)。Linux啟(qi)動(dong)(dong)時,第一(yi)個(ge)(ge)必(bi)須掛(gua)(gua)載(zai)的是(shi)(shi)根(gen)文(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong);若系(xi)(xi)(xi)(xi)統(tong)(tong)不能從指(zhi)定(ding)設備上(shang)掛(gua)(gua)載(zai)根(gen)文(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong),則系(xi)(xi)(xi)(xi)統(tong)(tong)會出錯而退(tui)出啟(qi)動(dong)(dong)。成功之后可以(yi)自動(dong)(dong)或(huo)手動(dong)(dong)掛(gua)(gua)載(zai)其(qi)他的文(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong)。因此,一(yi)個(ge)(ge)系(xi)(xi)(xi)(xi)統(tong)(tong)中可以(yi)同時存在(zai)不同的文(wen)件(jian)(jian)(jian)系(xi)(xi)(xi)(xi)統(tong)(tong)。
看到這里,你(ni)已經可以做接下來的步驟了,前面其實就是想(xiang)讓(rang)你(ni)對根文件系(xi)統(tong)有(you)一個認識(shi),今天我們就使用BusyBox制(zhi)作嵌(qian)入(ru)式Linux根文件系(xi)統(tong):
首先第一步:就是目錄結(jie)構(gou)的構(gou)建

根文件(jian)系統的(de)目錄是(shi)要(yao)創建的(de),他(ta)的(de)目錄主要(yao)包括:
/dev /etc /lib /usr /var /proc /tmp /home /root /mnt /bin /sbin /sys
#mkdir /home/rootfs
#cd /home/rootfs
#mkdir dev etc lib usr var proc tmp home root mnt sys
第(di)二步:開始使(shi)用busybox來對(dui)/bin /sbin linuxrc進行構建(jian)
我們用的是busybox-1.16.1,進(jin)入,然后(hou)執行下面(mian)的命(ming)令:
#make defconfig
#make menuconfig
Busybox Setting ----->
Build Options ----->
//1選擇將busybox進行靜態編譯(yi)
[*]Build BusyBox as a static binary (no shared libs)
//2.指(zhi)定交(jiao)叉編譯器為
(/usr/local/arm/4.3.2/bin/arm-linux-)Cross Compiler prefix
Installation Options -----> (選(xuan)擇生成的(de)文件存放(fang)目錄,也可以直接(jie)放(fang)在rootfs下就不(bu)用拷貝了)
//3.選擇上 Don’t use /usr
Busybox Library Tuning--->
[*]Username completion
[*]Fancy shell prompts
[*]Query cursor position from terminal
//4.編譯出的busybox的shell命令(ling)解釋器支持顯(xian)示當前路徑及主機信息(xi)
保存退出
#make
#make install
通(tong)過(guo)上面的步驟,那么在busybox目(mu)(mu)錄(lu)下你就會看(kan)到 _install目(mu)(mu)錄(lu),里(li)面就有/bin /sbin linuxrc三個(ge)文件
將(jiang)這三個目錄或文件(jian)拷到第一步所建的(de)rootfs文件(jian)夾下。
#cp bin/ sbin/ linuxrc /home/rootfs -ra
在(zai)這里一(yi)定要記住要帶上(shang)-a的參數,因為在(zai)bin的這個目錄里很多都(dou)是(shi)鏈(lian)接,如果(guo)你沒有帶-a的參數,那么拷(kao)貝過去就不(bu)是(shi)鏈(lian)接的形式了。
第三步:etc目錄的構建:

1)進(jin)入根文件系統rootfs的etc目(mu)錄,執行(xing)如(ru)下操作:
拷貝Busybox-1.16.1/examples/bootfloopy/etc/* 到(dao)當(dang)前目(mu)錄下
#cp –r busybox-1.16.1/examples/bootfloopy/etc/* rootfs/etc
修改inittab,
原始文件為:
1 ::sysinit:/etc/init.d/rcS
2 ::respawn:-/bin/sh
3 tty2::askfirst:-/bin/sh
4 ::ctrlaltdel:/bin/umount -a -r
修改后為:
---(1):開機免登陸,直接打(da)開shell(前(qian)面數字為行號(hao))
1 ::sysinit:/etc/init.d/rcS
2 #::respawn:-/bin/sh
3 #::respawn:-/bin/login
4 console::askfirst:-/bin/sh
5 #tty2::askfirst:-/bin/sh
6 ::ctrlaltdel:/bin/umount -a -r
---(2):開(kai)機需要登陸(前面數字為行號(hao))
1 ::sysinit:/etc/init.d/rcS
2 #::respawn:-/bin/sh
3 ::respawn:-/bin/login
4 #console::askfirst:-/bin/sh
5 #tty2::askfirst:-/bin/sh
6 ::ctrlaltdel:/bin/umount -a -r
2)拷貝虛(xu)擬機(ji)上的/etc/passwd, /etc/group, /etc/shadow到rootfs/etc下(xia)
# cp /etc/passwd rootfs/etc
# cp /etc/group rootfs/etc
# cp /etc/shadow roofs/etc
對以下三個文件修(xiu)改(gai),只保存與root相關的項(xiang),根據具體(ti)情況(kuang)內容會有(you)所不同(tong)。
修改(gai)(gai)passwd為root:x:0:0:root:/root:/bin/sh,即只(zhi)保存(cun)與root相關項,而且最后(hou)改(gai)(gai)成/bin/ash。
修改(gai)group為(wei)root:x:0:root
修(xiu)改shadow為root:$1$x9yv1WlB$abJ2v9jOlOc9xW/y0QwPs.:14034:0:99999:7:::
登陸開發(fa)板時需輸(shu)入用(yong)戶名密(mi)碼,同(tong)虛擬機相同(tong)
3)修(xiu)改(gai)profile
PATH=/bin:/sbin:/usr/bin:/usr/sbin //可執行(xing)程序 環境變量
export LD_LIBRARY_PATH=/lib:/usr/lib //動態鏈(lian)接庫 環境(jing)變(bian)量
/bin/hostname osee
USER="`id -un`"
LOGNAME=$USER
HOSTNAME='/bin/hostname'
PS1='[\u@\h \W]# ' //顯示主機名、當前路(lu)徑等信(xin)息(xi):
4)修改 etc/init.d/rc.S文件
/bin/mount -n -t ramfs ramfs /var
/bin/mount -n -t ramfs ramfs /tmp
/bin/mount -n -t sysfs none /sys
/bin/mount -n -t ramfs none /dev
/bin/mkdir /var/tmp
/bin/mkdir /var/modules
/bin/mkdir /var/run
/bin/mkdir /var/log
/bin/mkdir -p /dev/pts //telnet服務需要
/bin/mkdir -p /dev/shm //telnet服務需要(yao)
#echo /sbin/mdev > /proc/sys/kernel/hotplug//USB自動掛載需要
/sbin/mdev -s //啟動mdev在/dev下(xia)自(zi)動創建設備文件節點
/bin/mount -a
#######配(pei)置網絡################################
/sbin/ifconfig lo 127.0.0.1 netmask 255.0.0.0
/sbin/ifconfig eth0 192.168.1.70
/sbin/ifconfig eth0 netmask 255.255.255.0
/sbin/route add default gw 192.168.1.1 eth0
/sbin/ifconfig eth1 192.168.1.71 netmask 255.255.255.0
/sbin/route add default gw 192.168.1.1 eth1
5)修改etc/fstab文件,增加以下文件
none /dev/pts devpts mode=0622 0 0
tmpfs /dev/shm tmpfs defaults 0 0
第四(si)步: 那也是最(zui)后一步lib目錄構建:
(~/at91/x-tools/arm-zch-linux-gnueabi/arm-zch-linux-gnueabi/sysroot/lib我的只是把(ba)這個(ge)目錄下的SO文件復制就可以了)
1)#cd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib
講(jiang)動態庫拷到(dao)rootfs/lib下
#cp *so* roofs/lib -a
2)#cd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib
將下(xia)面動態庫拷貝到rootfs/lib下(xia)
#cp ./libstdc++.so.* rootfs/lib -a
這樣就(jiu)大功告成了(le),其(qi)實你看(kan)看(kan)這些(xie)步驟也就(jiu)是4步就(jiu)完成了(le)嵌入(ru)式linux根文(wen)件系(xi)統(tong)的制作(zuo),其(qi)實不難,按(an)著我的這個(ge)步驟,如果(guo)最(zui)后有問(wen)題,那么就(jiu)是你太(tai)粗心了(le),仔細檢(jian)查(cha)檢(jian)查(cha),嵌入(ru)式linux根文(wen)件系(xi)統(tong)的制作(zuo)方法(fa)你get到了(le)嗎?