一、添加目錄
使用mkdir分別建立lib、dev、proc、mnt、sys、tmp、root、usr/lib文件夾:
elf@ubuntu:~/nfs_rootfs/rootfs$ mkdir lib
elf@ubuntu:~/nfs_rootfs/rootfs$ mkdir dev elf@ubuntu:~/nfs_rootfs/rootfs$ mkdir proc elf@ubuntu:~/nfs_rootfs/rootfs$ mkdir mnt elf@ubuntu:~/nfs_rootfs/rootfs$ mkdir sys elf@ubuntu:~/nfs_rootfs/rootfs$ mkdir tmp elf@ubuntu:~/nfs_rootfs/rootfs$ mkdir root elf@ubuntu:~/nfs_rootfs/rootfs$ mkdir usr/lib |
elf@ubuntu:~/nfs_rootfs/rootfs$ ls
bin ?dev ?lib ?linuxrc ?mnt ?proc ?root ?sbin ?sys ?tmp ?usr |
二、添加lib庫內(nèi)容
在rootfs目錄中,使用如下命令,將交叉編譯工具中的lib庫復(fù)制到lib下:
elf@ubuntu:~/nfs_rootfs/rootfs$ cp -d /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/lib/*so* ./lib |
然后繼續(xù)以下操作,將lib中的ld-linux-armhf.so.3軟連接,更改為實體。
刪除軟連接:
elf@ubuntu:~/nfs_rootfs/rootfs$ rm lib/ld-linux-armhf.so.3 |
復(fù)制實體:
elf@ubuntu:~/nfs_rootfs/rootfs$ cp /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/lib/ld-linux-armhf.so.3 ./lib |
三、添加usr/lib庫內(nèi)容
在rootfs目錄中,使用如下命令,將交叉編譯工具中的/usr/lib庫復(fù)制到/usr/lib下:
elf@ubuntu:~/nfs_rootfs/rootfs$ cp -rd /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/*so* ./usr/lib |
四、添加啟動文件
在/busybox/examples/etc文件夾中存在有啟動相關(guān)的文件,我們將該etc文件夾復(fù)制到我們創(chuàng)建的文件系統(tǒng)中:
elf@ubuntu:~/nfs_rootfs/rootfs$ cp -rf /home/elf/work/busybox-1.32.1/examples/bootfloppy/etc/ . |
復(fù)制完成之后,我們打開etc目錄:
elf@ubuntu:~/nfs_rootfs/rootfs$ ls etc/
fstab ?init.d ?inittab ?profile |
其中:
inittab是一個存儲有初始化配置的文本文件,它有若干行指令所組成,這些指令都按照一定的格式進(jìn)行書寫。內(nèi)核在經(jīng)過一系列初始化工作之后,執(zhí)行的第一個用戶進(jìn)程是init進(jìn)程,該進(jìn)程執(zhí)行程序是sbin/目錄下的init程序。init程序會解析inittab文件,獲取其中的配置信息,并按照其中配置創(chuàng)建各種子進(jìn)程。
inittab文件中每個條目用來定義一個子進(jìn)程,并確定它的啟動方法,格式如下 :
Identifier:run_level:action:process
(一)Identifier:對于busybox來說,表示這個進(jìn)程要使用的控制臺(即標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯誤設(shè)備)。如省略,則使用與init進(jìn)程一樣的控制臺。
(二)run_level:系統(tǒng)運(yùn)行級別,對于Busybox init程序,這個字段無意義,可以省略。
(三)action:表示init程序如何控制這個子進(jìn)程。
action字段一般有如下定義:
action定義 | 執(zhí)行說明 |
sysinit | 系統(tǒng)啟動后最先執(zhí)行的進(jìn)程,init程序會等待它執(zhí)行完成之后,才能執(zhí)行下一進(jìn)程 |
wait | Sysinit進(jìn)程執(zhí)行結(jié)束后執(zhí)行的第二個進(jìn)程,init程序會等待它執(zhí)行完成之后,才能執(zhí)行下一進(jìn)程 |
once | Wait進(jìn)程執(zhí)行結(jié)束后,執(zhí)行的進(jìn)程,init程序會等待它執(zhí)行完成之后,才能執(zhí)行下一進(jìn)程 |
respawn | Once進(jìn)程結(jié)束之后,init進(jìn)程監(jiān)測發(fā)現(xiàn)子進(jìn)程退出時,重新啟動子程序 |
askfirst | 與respawn類似,也是在Once進(jìn)程結(jié)束之后,init進(jìn)程監(jiān)測發(fā)現(xiàn)子進(jìn)程退出時,重新啟動子程序,不過init進(jìn)程先輸出“Please press Enter to actvie this console”,等用戶輸入回車鍵之后才啟動子進(jìn)程 |
shutdown | 重啟關(guān)閉系統(tǒng)命令時halt/reboot/poweroff/SIGQUIT啟動子進(jìn)程 |
restart | 重啟時執(zhí)行子進(jìn)程 |
ctrlatldel | 按下Ctr+Alt+del組合鍵時執(zhí)行子進(jìn)程 |
(四)<process>:要執(zhí)行的程序,它可以是可執(zhí)行程序,也可以是腳本
五、修改inittab文件
我們可以打開etc/inittab文件,詳細(xì)看一下:
::sysinit:/etc/init.d/rcs
::respawn:-/bin/sh tty2::askfirst:-/bin/sh ::ctrlaltdel:/bin/umount -a -r |
::sysinit:/etc/init.d/rcS表示系統(tǒng)啟動后會首先運(yùn)行etc/init.d/rcS文件,該文件是一個腳本文件,在此腳本文件中,我們可以執(zhí)行一系列初始化操作,比如設(shè)置環(huán)境變量路徑,開啟程序,掛載文件系統(tǒng)、配置網(wǎng)絡(luò)等等。
::respawn:-/bin/sh表示當(dāng)子進(jìn)程-/bin/sh退出之后,重新開啟。
tty2::askfirst:-/bin/sh表示-/bin/sh交互使用的控制臺是tty2,子進(jìn)程有"-"字符,表示這個程序是可交互的。
::ctrlaltdel:/sbin/unmount -a –r按下組合鍵后卸載文件系統(tǒng)。
我們將inittab文件進(jìn)行按照我們想要的功能進(jìn)行簡單修改:
ttymxc0::sysinit:/etc/init.d/rcS
ttymxc0::askfirst:-/bin/sh ::restart:/sbin/init ::crtlaltdel:/sbin/reboot ::shutdown:/sbin/unmount -a -r ::shutdown:/sbin/swaoff -a |
然后我們打開init.d/rcS文件:
#! /bin/sh
/bin/mount -a |
該腳本文件只有一行命令,我們進(jìn)行簡單修改,增加mdev系統(tǒng)功能,mdev系統(tǒng)啟動和熱插拔或動態(tài)加載驅(qū)動程序時,自動產(chǎn)生驅(qū)動程序所需的節(jié)點文件:
#! /bin/sh
mount -a echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s #./usr/my_app |
mount –a命令用于掛載文件系統(tǒng),掛載所有的應(yīng)該被掛載的文件系統(tǒng),在busybox中mount -a時busybox會去查找etc/fstab文件系統(tǒng)列表文件,這個文件按照一定的格式列出來所有應(yīng)該被掛載的文件系統(tǒng)。
接下來的兩行命令,是mdev系統(tǒng)功能,mdev系統(tǒng)啟動和熱插拔 或動態(tài)加載驅(qū)動程序時,自動創(chuàng)建設(shè)備節(jié)點。
最后的./usr/my_app是我添加的一個測試程序,系統(tǒng)啟動之后,會自動執(zhí)行該程序,這里先注釋掉。
剛才說執(zhí)行mount –a命令時,busybox會去查找etc/fstab文件系統(tǒng)列表文件,我們打開etc/fstab文件:
proc ??/proc ???proc ???defaults ???0 ???0 |
可以看到這里只列出一個proc文件系統(tǒng),我們繼續(xù)在此文件中添加:
proc ??/proc ???proc ???defaults ???0 ???0
sysfs ??????????/sys ???sysfs ??defaults ???0 ??0 tmpfs ??????????/tmp ???tmpfs ??defaults ???0 ??0 tmpfs ??????????/dev ???tmpfs ??defaults ???0 ??0 |
最后,在etc目錄下還有一個profile文件,增加關(guān)于應(yīng)用程序、庫文件的路徑環(huán)境變量配置:
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib export PATH LD_LIBRARY_PATH |