嵌入式云IOT技術(shù)圈" data-alias="" data-signature="分享單片機(jī)、嵌入式Linux/Android、物聯(lián)網(wǎng)等相關(guān)產(chǎn)品項(xiàng)目開發(fā)經(jīng)驗(yàn),打造最硬核嵌入式技術(shù)公眾號(hào)。" data-from="0">關(guān)注、星標(biāo)嵌入式云IOT技術(shù)圈,精彩及時(shí)送達(dá)
來源 | Github-EmbeddedSystem
1.1 為什么需要根文件系統(tǒng)
- init進(jìn)程的應(yīng)用程序在根文件系統(tǒng)上
- 根文件系統(tǒng)提供了根目錄 /
- 內(nèi)核啟動(dòng)后的應(yīng)用層配置( etc 目錄)在根文件系統(tǒng)上。幾乎可以認(rèn)為:發(fā)行版=內(nèi)核 rootfs
- shell命令程序在根文件系統(tǒng)上,比如 ls、cd 等命令
一套linux體系,只有內(nèi)核本身是不能工作的,必須要 rootfs 上的 etc 目錄下的配置文件、/bin /sbin 等目錄下的 shell 命令,還有 /lib 目錄下的庫文件等···)相配合才能工作 。
1.2 根文件系統(tǒng)的實(shí)質(zhì)
- 根文件系統(tǒng)是特殊用途的文件系統(tǒng)。
- 根文件系統(tǒng)也必須屬于某種文件系統(tǒng)格式。rootfstype=
存儲(chǔ)設(shè)備(塊設(shè)備,像硬盤、flash等)是分塊(扇區(qū))的,物理上底層去訪問存儲(chǔ)設(shè)備時(shí)是按照塊號(hào)(扇區(qū)號(hào))來訪問的。文件系統(tǒng)是一些代碼,是一套軟件,這套軟件的功能就是對(duì)存儲(chǔ)設(shè)備的扇區(qū)進(jìn)行管理,將這些扇區(qū)的訪問變成了對(duì)目錄和文件名的訪問。我們?cè)谏蠈影凑仗囟ǖ哪夸浐臀募ピL問一個(gè)文件時(shí),文件系統(tǒng)會(huì)將這個(gè)目錄 文件名轉(zhuǎn)換成對(duì)扇區(qū)號(hào)的訪問。不同的文件系統(tǒng)的差異就在于對(duì)這些扇區(qū)的管理策略和方法不同,譬如壞塊管理、碎片管理。
1.3 根文件系統(tǒng)的形式
- 使用專用工具軟件制作的可供燒錄的鏡像文件
- 鏡像中包含了根文件系統(tǒng)中的所有文件
- 燒錄此鏡像類似于對(duì)相應(yīng)分區(qū)格式化。
- 鏡像文件系統(tǒng)具有一定的格式,格式是內(nèi)化的,跟文件名后綴是無關(guān)的。
以文件夾形式構(gòu)成的文件系統(tǒng):
- 根文件系統(tǒng)其實(shí)就是一個(gè)包含特定內(nèi)容的文件夾
- 根文件系統(tǒng)可由任何一個(gè)空文件夾添加必要文件構(gòu)成而成
- 根文件系統(tǒng)的雛形就是在開發(fā)主機(jī)中構(gòu)造的文件夾形式的
鏡像文件形式的根文件系統(tǒng)主要目的是用來燒錄到塊設(shè)備上,設(shè)備上的內(nèi)核啟動(dòng)后去掛載它。鏡像文件形式的根文件系統(tǒng)是由文件夾形式的根文件系統(tǒng)使用專用的鏡像制作工具制作而成的。最初在開發(fā)主機(jī)中隨便 mkdir 創(chuàng)建了一個(gè)空文件夾,然后向其中添加一些必要的文件(包括etc目錄下的運(yùn)行時(shí)配置文件、/bin 等目錄下的可執(zhí)行程序、/lib目錄下的庫文件等···)后就形成了一個(gè)文件夾形式的 rootfs。然后這個(gè)文件夾形式的 rootfs 可以被 kernel 通過 nfs 方式來遠(yuǎn)程掛載使用,但是不能用來燒錄塊設(shè)備。我們?yōu)榱藢⑦@個(gè) rootfs 燒錄到塊設(shè)備中于是用一些專用的軟件工具將其制作成可供燒錄的一定格式的根文件系統(tǒng)鏡像。文件夾形式的 rootfs 是沒有格式的,制作成鏡像后就有了一定的 rootfs 格式了,格式是由我們的鏡像制作過程和制作工具來決定的。每一種格式的鏡像制作工具的用法都不同。
1.4 自己制作簡(jiǎn)單的根文件系統(tǒng)
1.4.1 動(dòng)手制作ext3格式的根文件系統(tǒng)
mke2fs 是一個(gè)應(yīng)用程序,在 ubuntu 中默認(rèn)是安裝了的。這個(gè)應(yīng)用程序就是用來制作 ext2、ext3、ext4 等格式的根文件系統(tǒng)的。一般用來制作各種不同格式的 rootfs 的應(yīng)用程序的名字都很相似,類似于 mkfs.xxx(譬如用來制作 ext2 格式的 rootfs 的工具叫 mkfs.ext2、用來制作 jffs2 格式的 rootfs 的工具就叫 mkfs.jffs2)。ubuntu14.04中的 mkfs.ext2 等都是 mke2fs 的符號(hào)鏈接而已。
- 創(chuàng)建rootfs.ext2文件并且將之掛載到一個(gè)目錄下方便訪問它 《參考資料:http://blog.csdn.net/zhengmeifu/article/details/24174513》
dd?if=/dev/zero?of=rootfs.ext2?bs=1024?count=2048
losetup??/dev/loop1?rootfs.ext2
mke2fs?-m?0?/dev/loop1?2048
mount?-t?ext2?/dev/loop1?./rootfs/
- 我們向鏡像中寫入一個(gè)普通文件linuxrc。這個(gè)文件就會(huì)成為我們制作的鏡像中的/linuxrc。內(nèi)核掛載了這個(gè)鏡像后就會(huì)嘗試去執(zhí)行/linuxrc。然后執(zhí)行時(shí)必然會(huì)失敗。我們將來實(shí)驗(yàn)看到的現(xiàn)象就應(yīng)該是:掛載成功,執(zhí)行/linuxrc失敗。
- 將來真正去做有用的rootfs時(shí),就要在這一步添加真正可以執(zhí)行的 linuxrc 程序,然后還要添加別的 /lib 目錄下的庫文件,/etc目錄下的配置文件等。
- 卸載掉,然后鏡像就做好了。
umount?/dev/loop1
losetup?-d?/dev/loop1
1.4.2 nfs 方式啟動(dòng) rootfs
nfs 是一種網(wǎng)絡(luò)通訊協(xié)議,由服務(wù)器和客戶端構(gòu)成。利用 nfs 協(xié)議可以做出很多直接性應(yīng)用,我們這里使用 nfs 主要是做 rootfs 掛載。開發(fā)板中運(yùn)行 kernel 做 nfs 客戶端,主機(jī) ubuntu 中搭建 nfs 服務(wù)器。在主機(jī) ubuntu 的 nfs 服務(wù)器中導(dǎo)出我們制作的文件夾形式的 rootfs 目錄,則在客戶端中就可以去掛載這個(gè)文件夾形式的 rootfs 進(jìn)而去啟動(dòng)系統(tǒng)。
配置內(nèi)核以支持 nfs 作為 rootfs,設(shè)置 nfs 啟動(dòng)方式的 bootargs,在 menuconfig 中配置支持 nfs 啟動(dòng)方式。
nfs 方式啟動(dòng)相當(dāng)于開發(fā)板上的內(nèi)核遠(yuǎn)程掛載到主機(jī)上的 rootfs,nfs 方式啟動(dòng)不用制作 rootfs 鏡像。nfs 方式不適合真正的產(chǎn)品,一般作為產(chǎn)品開發(fā)階段調(diào)試使用。
- uboot 中的啟動(dòng)參數(shù)設(shè)置
setenv?bootargs?root=/dev/nfs?nfsroot=192.168.1.104:/home/SummerGift/work/samsung_kernel/rootfs/rootfs?ip=192.168.1.88:192.168.1.104:192.168.1.1:255.255.255.0::eth0:off??init=/linuxrc?console=ttySAC2,115200?
mount?-t?nfs?-o?nolock?192.168.1.104:/home/SummerGift/work/samsung_kernel/rootfs/rootfs??/opt
1.4.3 關(guān)于 linuxrc
- /linuxrc 是一個(gè)可執(zhí)行的應(yīng)用程序 /linuxrc 是應(yīng)用層的,和內(nèi)核源碼一點(diǎn)關(guān)系都沒有,/linuxrc 在開發(fā)板當(dāng)前內(nèi)核系統(tǒng)下是可執(zhí)行的。因此在 ARM SoC 的 linux 系統(tǒng)下,這個(gè)應(yīng)用程序就是用 arm-linux-gcc 編譯鏈接的;如果是在 PC 機(jī) linux 系統(tǒng)下,那么這個(gè)程序就是用 gcc 編譯連接的。
/linuxrc如果是靜態(tài)編譯連接的那么直接可以運(yùn)行;如果是動(dòng)態(tài)編譯連接的那么我們還必須給他提供必要的庫文件才能運(yùn)行。但是因?yàn)槲覀?/linuxrc 這個(gè)程序是由內(nèi)核直接調(diào)用執(zhí)行的,因此用戶沒有機(jī)會(huì)去導(dǎo)出庫文件的路徑,因此實(shí)際上這個(gè) /linuxrc 沒法動(dòng)態(tài)連接,一般都是靜態(tài)連接的。
- /linuxrc執(zhí)行時(shí)引出用戶界面 操作系統(tǒng)啟動(dòng)后在一系列的自己運(yùn)行配置之后,最終會(huì)給用戶一個(gè)操作界面(也許是 cmdline,也許是 GUI),這個(gè)用戶操作界面就是由 /linuxrc 帶出來的。
用戶界面等很多事并不是在 /linuxrc 程序中負(fù)責(zé)的,用戶界面有自己專門的應(yīng)用程序,但是用戶界面的應(yīng)用程序是直接或者間接的被 /linuxrc 調(diào)用執(zhí)行的。用戶界面程序和其他的應(yīng)用程序就是進(jìn)程2、3、4·····,這就是我們說的進(jìn)程1(init進(jìn)程,也就是 /linuxrc)是其他所有應(yīng)用程序進(jìn)程的祖宗進(jìn)程。
- /linuxrc 負(fù)責(zé)系統(tǒng)啟動(dòng)后的配置 就好像一個(gè)房子建好之后不能直接住,還要裝修一樣;操作系統(tǒng)啟動(dòng)起來后也不能直接用,要配置下。操作系統(tǒng)啟動(dòng)后的應(yīng)用層的配置(一般叫運(yùn)行時(shí)配置,英文簡(jiǎn)寫 etc)是為了讓我們的操作系統(tǒng)用起來更方便,更適合我個(gè)人的愛好或者實(shí)用性。
- /linuxrc在嵌入式linux中一般就是busybox busybox 是一個(gè) C 語言寫出來的項(xiàng)目,里面包含了很多 .c 文件和 .h 文件。這個(gè)項(xiàng)目可以被配置編譯成各個(gè)平臺(tái)下面可以運(yùn)行的應(yīng)用程序。我們?nèi)绻?arm-linux-gcc 來編譯busybox就會(huì)得到一個(gè)可以在我們開發(fā)板 linux 內(nèi)核上運(yùn)行的應(yīng)用程序。
busybox 這個(gè)程序開發(fā)出來就是為了在嵌入式環(huán)境下構(gòu)建 rootfs 使用的,也就是說他就是專門開發(fā)的 init 進(jìn)程應(yīng)用程序。busybox 為當(dāng)前系統(tǒng)提供了一整套的 shell 命令程序集。譬如 vi、cd、mkdir、ls 等。在桌面版的linux 發(fā)行版(譬如ubuntu、redhat、centOS等)中 vi、cd、ls 等都是一個(gè)一個(gè)的單獨(dú)的應(yīng)用程序。但是在嵌入式 linux 中,為了省事我們把 vi、cd 等所有常用的 shell 命令集合到一起構(gòu)成了一個(gè)shell 命令包,起名叫 busybox。
1.4.4 rootfs 中的其他目錄
在linux中一切皆是文件,因此一個(gè)硬件設(shè)備也被虛擬化成一個(gè)設(shè)備文件來訪問,在linux系統(tǒng)中/dev/xxx就表示一個(gè)硬件設(shè)備,我們要操作這個(gè)硬件時(shí)就是open打開這個(gè)設(shè)備文件,然后read/write/ioctl操作這個(gè)設(shè)備,最后close關(guān)閉這個(gè)設(shè)備。在最小 rootfs 中 /dev 目錄也是不可少的,這里面有一兩個(gè)設(shè)備文件是 rootfs 必須的。
在最小 rootfs 中也是不可省略的,但是這兩個(gè)只要?jiǎng)?chuàng)建了空文件夾即可,里面是沒東西的,也不用有東西。這兩個(gè)目錄也是和驅(qū)動(dòng)有關(guān)的。屬于linux中的虛擬文件系統(tǒng)。
- usr是系統(tǒng)的用戶所有的一些文件的存放地,這個(gè)東西將來 busybox 安裝時(shí)會(huì)自動(dòng)生成。
- etc 目錄中的所有文件全部都是運(yùn)行時(shí)配置文件。/etc 目錄下的所有配置文件會(huì)直接或者間接的被 /linuxrc 所調(diào)用執(zhí)行,完成操作系統(tǒng)的運(yùn)行時(shí)配置。etc 目錄是制作 rootfs 的關(guān)鍵,所以后面下一個(gè)課程專門講這個(gè) etc 目錄。
- lib 目錄也是 rootfs 中很關(guān)鍵的一個(gè),不能省略的一個(gè)。lib目錄下放的是當(dāng)前操作系統(tǒng)中的動(dòng)態(tài)和靜態(tài)鏈接庫文件。我們主要是為了其中的動(dòng)態(tài)鏈接庫。
2. 用 busybox 制作一個(gè)簡(jiǎn)單的 rootfs
2.1 移植 busybox 到開發(fā)板
busybox 是一個(gè)開源項(xiàng)目,所以源代碼可以直接從網(wǎng)上下載。版本差異不大,版本新舊無所謂。下載busybox可以去 linuxidc 等鏡像網(wǎng)站,也可以去 www.busybox.net官方網(wǎng)站下載。
ARCH?=?arm
CROSS_COMPILE?=?/usr/local/arm/arm-2009q3/bin//arm-none-linux-gnueabi-
- make menuconfig 進(jìn)行配置
Busybox?Settings--->
?Build?Options--->
??[*]Build?BusyBox?as?a?static?binary(no?shared?libs)
Busybox?Library?Tuning--->
?[*]vi-style?line?editing?commands
?[*]Fancy?shell?prompts
Linux?Module?Utilities--->
?[?]Simplified?modutils
?[*]insmod
?[*]rmmod
?[*]lsmod
?[*]modprobe
?[*]depmod
Linux?System?Utilities--->[*]mdev
?[*]Support?/etc/mdev.conf
?[*]Support?subdirs/symlinks
?[*]Support?regular?expressions?substitutions?when?renaming?dev
?[*]Support?command?execution?at?device?addition/removal
?[*]Support?loading?of?firmwares
make 編譯,如果有錯(cuò)誤解決之,make install 執(zhí)行的時(shí)候其實(shí)是在執(zhí)行 busybox 頂層目錄下的一個(gè)目標(biāo) install。make install 在所有的 linux 下的軟件中作用都是安裝軟件。在傳統(tǒng)的 linux 系統(tǒng)中安裝軟件時(shí)都是選擇源代碼方式安裝的。我們下載要安裝的軟件源代碼,然后配置、編譯、安裝。make install的目的就是將編譯生成的可執(zhí)行程序及其依賴的庫文件、配置文件、頭文件安裝到當(dāng)前系統(tǒng)中指定(一般都可以自己指定安裝到哪個(gè)目錄下,如果不指定一般都有個(gè)默認(rèn)目錄)的目錄下。
- 設(shè)置 bootargs 掛載添加了busybox移植的rootfs
之前建立了一個(gè)空的文件夾然后自己 touch linuxrc 隨便創(chuàng)建了一個(gè)不能用的 /linuxrc 然后去 nfs 掛載 rootfs,實(shí)驗(yàn)結(jié)果是:掛載成功,執(zhí)行 /linuxrc 失敗?,F(xiàn)在我們移植了 busybox 后 /linuxrc 就可以用了,然后再次去 nfs 掛載這個(gè) rootfs。預(yù)計(jì)看到的效果是:掛載成功,執(zhí)行/linuxrc也能成功。uboot 的 bootargs 設(shè)置成:
setenv?bootargs?root=/dev/nfs?nfsroot=192.168.1.141:/root/porting_x210/rootfs?ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off??init=/linuxrc?console=ttySAC2,115200?
掛載成功,執(zhí)行 /linuxrc(也就是busybox)成功,但是因?yàn)檎也坏?/etc/init.d/rcS 和 /dev/tty2 等文件所以一直在打印錯(cuò)誤提示信息,但是其實(shí)有進(jìn)入命令行。
2.2 inittab 詳解
將一個(gè)典型的 inittab 文件復(fù)制到我們制作的 rootfs 的根目錄下的 /etc/ 目錄下,再次啟動(dòng)內(nèi)核掛載這個(gè) rootfs 看效果,實(shí)驗(yàn)現(xiàn)象是成功啟動(dòng)并且掛載 rootfs 進(jìn)入了控制臺(tái)命令行。當(dāng)前制作的最小rootfs 成功了。
inittab 的工作原理就是被 /linuxrc(也就是busybox)執(zhí)行時(shí)所調(diào)用起作用。inittab 在 /etc 目錄下,所以屬于一個(gè)運(yùn)行時(shí)配置文件,是文本格式的(內(nèi)容是由一系列的遵照一個(gè)格式組織的字符組成的),實(shí)際工作的時(shí)候 busybox 會(huì)(按照一定的格式)解析這個(gè) inittab 文本文件,然后根據(jù)解析的內(nèi)容來決定要怎么工作。busybox 究竟如何完成解析并且解析結(jié)果如何去工作(busybox 中實(shí)現(xiàn) /etc/inittab 的原理)并不是我們的目標(biāo),我們的重點(diǎn)是 inittab 的格式究竟怎樣的?我們看到一個(gè) inittab 后怎么去分析這個(gè)inittab 對(duì)啟動(dòng)的影響。inittab 的格式在 busybox 中定義的。
第一個(gè):#開始的行是注釋 第二個(gè):冒號(hào)在里面是分隔符,分隔開各個(gè)部分。第三個(gè):inittab內(nèi)容是以行為單位的,行與行之間沒有關(guān)聯(lián),每行都是一個(gè)獨(dú)立的配置項(xiàng),每一個(gè)配置項(xiàng)表示一個(gè)具體的含義。第四個(gè):每一行的配置項(xiàng)都是由3個(gè)冒號(hào)分隔開的4個(gè)配置值共同確定的。這四個(gè)配置值就是id:runlevels:action:process。值得注意的
是有些配置值可以空缺,空缺后冒號(hào)不能空缺,所以有時(shí)候會(huì)看到連續(xù)2個(gè)冒號(hào)。第五個(gè):每一行的配置項(xiàng)中4個(gè)配置值中最重要的是 action 和 process,action 是一個(gè)條件/狀態(tài),process 是一個(gè)可被執(zhí)行的程序的 pathname。合起來的意思就是:當(dāng)滿足 action 的條件時(shí)就會(huì)執(zhí)行process 這個(gè)程序。理解 inittab 的關(guān)鍵就是明白“當(dāng)滿足 action 的條件時(shí)就會(huì)執(zhí)行 process 這個(gè)程序?!?分析 busybox的源代碼就會(huì)發(fā)現(xiàn),busybox 最終會(huì)進(jìn)入一個(gè)死循環(huán),在這個(gè)死循環(huán)中去反復(fù)檢查是否滿足各個(gè)action 的條件,如果某個(gè) action 的條件滿足就會(huì)去執(zhí)行對(duì)應(yīng)的 process。
3. busybox 源碼分析
3.1 分析 busybox 啟動(dòng)狀況
分析一個(gè)程序,不管多龐大還是小,最好的路線都是按照程序運(yùn)行時(shí)的邏輯順序來。所以找到一個(gè)程序的入口至關(guān)重要。主函數(shù)main函數(shù)就是整個(gè)程序的入口,這種情況適應(yīng)于操作系統(tǒng)下工作的應(yīng)用程序的情況。在 uboot 和 linux kernel 這兩個(gè)大的 C 語言的項(xiàng)目中,main函數(shù)都沒有,都不是入口。在我們這種裸機(jī)程序中入口不是 main 函數(shù),而是由連接腳本來指定的。busybox 是 linux 啟動(dòng)起來后工作的一個(gè)應(yīng)用程序,因此其中必然有 main 函數(shù),而且 main 就是入口。
3.2 busybox 中 main 函數(shù)全解析
busybox 入口就是 main 函數(shù),其中有很多個(gè) main 但是只有一個(gè)起作用了,其他的是沒起作用的。真正的busybox工作時(shí)的入口是 libbb/appletlib.c 中的 main 函數(shù)。busybox中有很多 xxx_main 函數(shù),這些 main 函數(shù)每一個(gè)都是 busybox 支持的一個(gè)命令的真正入口。例如 ls_main 函數(shù)就是 busybox 當(dāng)作 ls 函數(shù)使用時(shí)的入口程序。ls 或者 cd 等命令其實(shí)都是 busybox 一個(gè)程序,但是實(shí)際執(zhí)行時(shí)的效果卻是各自的效果。busybox 每次執(zhí)行時(shí)都是先執(zhí)行其 main,在 main 函數(shù)中識(shí)別(靠 main 函數(shù)的傳參 argv[0] 來識(shí)別)我們真正要執(zhí)行的函數(shù)(譬如ls)然后去調(diào)用相應(yīng)的xxx_main(譬如ls_main)來具體實(shí)現(xiàn)這個(gè)命令。
3.3 inittab 解析與執(zhí)行
inittab 的解析是在 busybox/init/init.c/init_main 函數(shù)中。執(zhí)行邏輯是:先通過 parse_inittab 函數(shù)解析 /etc/inittab(解析的重點(diǎn)是將 inittab 中的各個(gè) action 和 process 解析出來),然后后面先直接執(zhí)行 sysinit 和 wait 和 once(注意這里只執(zhí)行一遍),然后在 while(1) 死循環(huán)中去執(zhí)行 respwan 和 askfirst。
3.4 busybox 的體積優(yōu)勢(shì)原理
busybox 實(shí)際上就是把 ls、cd、mkdir 等很多個(gè) linux 中常用的 shell 命令集成在一起了。集成在一起后有一個(gè)體積優(yōu)勢(shì):就是 busybox 程序的大小比 busybox 中實(shí)現(xiàn)的那些命令的大小加起來要小很多。busybox 體積變小的原因主要有2個(gè):
- 第一個(gè)是 busybox 本身提供的 shell 命令是閹割版的(busybox 中的命令支持的參數(shù)選項(xiàng)比發(fā)行版中要少,譬如ls在發(fā)行版中可以有幾十個(gè) -x,但是在 busybox 中只保留了幾個(gè)常用的選項(xiàng),不常用的都刪除掉了)
- 第二個(gè)是 busybox 中因?yàn)樗械拿畹膶?shí)現(xiàn)代碼都在一個(gè)程序中實(shí)現(xiàn),而各個(gè)命令中有很多代碼函數(shù)都是通用的(譬如 ls 和 cd、mkdir 等命令都會(huì)需要去操作目錄,因此在 busybox 中實(shí)現(xiàn)目錄操作的函數(shù)就可以被這些命令共用),共用會(huì)降低重復(fù)代碼出現(xiàn)的次數(shù),從而減少總的代碼量和體積。
busybox 的體積優(yōu)勢(shì)是嵌入式系統(tǒng)本身的要求和特點(diǎn)造成的。
4. rcS 文件分析與實(shí)戰(zhàn)
4.1 rcS 文件介紹
/etc/init.d/rcS 文件是linux的運(yùn)行時(shí)配置文件中最重要的一個(gè),其他的一些配置都是由這個(gè)文件引出來的。這個(gè)文件可以很復(fù)雜也可以很簡(jiǎn)單,里面可以有很多的配置項(xiàng)。
首先從shell腳本的語法角度分析,這一行定義了一個(gè)變量PATH,值等于后面的字符串,后面用export導(dǎo)出了這個(gè)PATH,那么PATH就變成了一個(gè)環(huán)境變量。PATH 這個(gè)環(huán)境變量是 linux 系統(tǒng)內(nèi)部定義的一個(gè)環(huán)境變量,含義是操作系統(tǒng)去執(zhí)行程序時(shí)會(huì)默認(rèn)到PATH 指定的各個(gè)目錄下去尋找。如果找不到就認(rèn)定這個(gè)程序不存在,如果找到了就去執(zhí)行它。將一個(gè)可執(zhí)行程序的目錄導(dǎo)出到 PATH,可以讓我們不帶路徑來執(zhí)行這個(gè)程序。
因?yàn)槲覀兿M坏┻M(jìn)入命令行下時(shí),PATH 環(huán)境變量中就有默認(rèn)的 /bin /sbin /usr/bin /usr/sbin 這幾個(gè)常見的可執(zhí)行程序的路徑,這樣我們進(jìn)入命令行后就可以 ls、cd 等直接使用了。為什么rcS 文件還沒添加,系統(tǒng)啟動(dòng)就有了 PATH 中的值?原因在于 busybox 自己用代碼硬編碼為我們導(dǎo)出了一些環(huán)境變量,其中就有 PATH。
runlevel也是一個(gè)shell變量,并且被導(dǎo)出為環(huán)境變量,runlevel=S表示將系統(tǒng)設(shè)置為單用戶模式。
umask 是 linux 的一個(gè)命令,作用是設(shè)置 linux 系統(tǒng)的 umask 值。umask值決定當(dāng)前用戶在創(chuàng)建文件時(shí)的默認(rèn)權(quán)限。
mount -a 是掛載所有的應(yīng)該被掛載的文件系統(tǒng),在 busybox中 mount -a 時(shí) busybox 會(huì)去查找一個(gè)文件 /etc/fstab 文件,這個(gè)文件按照一定的格式列出來所有應(yīng)該被掛載的文件系統(tǒng)(包括了虛擬文件系統(tǒng))
mdev 是 udev 的
嵌入式簡(jiǎn)化版本,udev/mdev 是用來配合 linux 驅(qū)動(dòng)工作的一個(gè)應(yīng)用層的軟件,udev/mdev 的工作就是配合 linux 驅(qū)動(dòng)生成相應(yīng)的 /dev 目錄下的設(shè)備文件。在 rcS 文件中沒有啟動(dòng) mdev 的時(shí)候,/dev 目錄下啟動(dòng)后是空的。在 rcS 文件中添加上 mdev 有關(guān)的 2 行配置項(xiàng)后,再次啟動(dòng)系統(tǒng)后發(fā)現(xiàn) /dev 目錄下生成了很多的設(shè)備驅(qū)動(dòng)文件。(4)/dev目錄下的設(shè)備驅(qū)動(dòng)文件就是mdev生成的,這就是mdev的效果和意義。
hostname 是 linux 中的一個(gè) shell 命令。命令(hostname xxx)執(zhí)行后可以用來設(shè)置當(dāng)前系統(tǒng)的主機(jī)名為 xxx,直接 hostname 不加參數(shù)可以顯示當(dāng)前系統(tǒng)的主機(jī)名。/bin/hostname -F /etc/sysconfig/HOSTNAME -F 來指定了一個(gè)主機(jī)名配置文件(這個(gè)文件一般文件名叫 hostname 或者 HOSTNAME)
有時(shí)候我們希望開機(jī)后進(jìn)入命令行時(shí)ip地址就是一個(gè)指定的 ip 地址(譬如192.168.1.30),這時(shí)候就可以在 rcS 文件中 ifconfig eth0 192.168.1.88
4.2 rcS 文件測(cè)試問題記錄