上篇文章,使用BusyBox構建了基礎的嵌入式Linux系統的根文件系統,基本的功能可以正常運行,但在個基礎功能上,還要許多地方需要完善。
1 完善根文件系統
上篇說道,Linux系統運行起來后,可以正常的執行"ls"等基礎命令,但仔細觀察系統運行后的打印信息,有一條提示:
can't run '/etc/init.d/rcS': No such file pngor directory
![pYYBAGIuBM6AJJ7_AADgfz1s3aY959.png](http://file.elecfans.com/web2/M00/35/C2/pYYBAGIuBM6AJJ7_AADgfz1s3aY959.png)
說是無法運行“/etc/init.d/rcS”這個文件,因為根文件系統(rootfs)里沒有這個文件。這個rcS是什么呢?它其實是一個shell腳本, 在Linux內核啟動以后,需要啟動一些服務, 而rcS就是規定啟動哪些文件的腳本文件。
1.1 創建/etc/init.d/rcS文件
在rootfs中創建/etc/init.d/rcS文件(前兩級目錄不存在,要先創建文件夾,再創建文件),然后在rcS中輸入如下所示內容:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
各行含義如下:
PATH環境變量
:保存著可執行文件可能存在的目錄,這樣我們在執行一些命令或者可執行文件的時候就不會提示找不到文件這樣的錯誤。
LD_LIBRARY_PATH環境變量
:保存著庫文件所在的目錄。
export命令
:用來導出上面這些環境變量,相當于聲明一些“全局變量” 。
mount命令
:用來掛載所有的文件系統,這些文件系統由文件/etc/fstab來指定,所以后續還要創建/etc/fstab文件。
mkdir命令
:創建目錄/dev/pts,然后將devpts掛載到/dev/pts目錄中。
最后兩行
:使用mdev來管理熱插拔設備,通過這兩行,Linux內核就可以在/dev目錄下自動創建設備節點。
創建好/etc/init.d/rcS后還定要給其可執行權限(chmod 777)。
1.2 創建/etc/fstab文件
上面說道,rcS在掛載所用的文件系統時,這些文件系統由文件/etc/fstab 來指定,所以還要創建/etc/fstab文件。
在rootfs中創建 /etc/fstab文件, fstab在Linux開機以后自動配置哪些需要自動掛載的分區,格式如下:
:要掛載的特殊設備,也可以是塊設備,比如/dev/sda等
:掛載點
:文件系統類型,如ext2、ext3、proc、romfs、tmpfs等
:掛載選項,一般使用默認的defaults(包含了 rw、suid、dev、exec、auto、nouser和async)
:為1表示允許備份,為0不備份,一般不備份
:磁盤檢查設置,為0表示不檢查。根目錄‘/’設置為 1,其他的分區從2開始。一般不在fstab中掛載根目錄,一般設置為0
按照上述格式,在fstab文件中輸入如下內容(第1行是注釋):
#
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
fstab文件創建完成以后,啟動開發板,可以看出,啟動成功,且沒有提示rcS:
![poYBAGIuBNmAWDDFAACkEnGOU-o203.png](http://file.elecfans.com/web2/M00/35/BC/poYBAGIuBNmAWDDFAACkEnGOU-o203.png)
注:以上兩個文件,可以直接在ubuntu的nfs文件中添加,也可以先通過板子的串口連接到nfs后,在串口窗口操作。我是在ubuntu中操作,然后再連接板子啟動。
1.3 創建/etc/inittab文件
系統啟動已經沒有錯誤提示了,但我們要仍要創建另一個文件/etc/inittab ,這個文件用于busyboxd的初始化,init 程序會讀取/etc/inittab這個文件。
inittab由若干條指令組成,每條指令的結構都是以“:”分隔的4個段組成,格式如下:
:::
:每個指令的標識符,不能重復。但是對于busybox的init 來說,
有著特殊意義。對于busybox而言
用來指定啟動進程的控制 tty,一般我們將串口或者 LCD 屏幕設置為控 制 tty。
:對busybox來說此項完全沒用,所以空著。
:動作,用于指定
可能用到的動作。
:具體的動作,比如程序、腳本或命令等。
參考busyboxd的examples/inittab文件,來創建一個/etc/inittab,輸入如下內容:
#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
第 2 行:系統啟動以后運行 /etc/init.d/rcS這個腳本文件。
第 3 行:將console作為控制臺終端,也就是ttymxc0。
第 4 行:重啟將運行 /sbin/init。
第 5 行:按下ctrl+alt+del組合鍵的將運行 /sbin/reboot(注:windows系統的串口軟件連接開發板,這個命令無效,因為該組合鍵會被windows系統攔截而執行windows系統的ctrl+alt+del組合鍵命令)。
第 6 行:關機的時候執行 /bin/umount,也就是卸載各個文件系統。
第 7 行:關機的時候執行 /sbin/swapoff,也就是關閉交換分區。
注:我在ubuntu上編輯測文件時,console行出現了紅色背景塊,但似乎也沒什么影響
/etc/inittab文件創建好以后就可以重啟開發板即可, 至此,根文件系統要創建的文件就已經全部完成了。
總結一下剛才創建的目錄和文件,如下圖
![pYYBAGIuBPaAdNuoAAAlG0fqAqk350.png](http://file.elecfans.com/web2/M00/35/C2/pYYBAGIuBPaAdNuoAAAlG0fqAqk350.png)
2 根文件系統其他功能測試
根文件系統已經完善了,接下來就來繼續測試根文件系統是否好用。
2.1 軟件運行測試
先來編寫一個簡單的c語言程序運行一下,驗證庫文件是否能用。
先在ubuntu的rootfs中(可以先創建一個單獨的test文件夾用來測試)創建一個hello.c:
#include
int main(void)
{
while(1)
{
printf("hello world!\r\n"); //打印
sleep(2); //休眠2秒
}
}
然后使用交叉編譯鏈來編譯程序:
arm-linux-gnueabihf-gcc hello.c -o hello
編譯后會生成名為hello的可執行文件,可以使用“file”命令查看文件類型以及編碼格式:
![pYYBAGIuBP2ARoFgAAF5JrQ8fIk289.png](http://file.elecfans.com/web2/M00/35/C2/pYYBAGIuBP2ARoFgAAF5JrQ8fIk289.png)
hello是個32位的LSB可執行文件,ARM架構的,并且是動態鏈接的。
在ubunt中編譯完后,重啟開發板,在開發板的串口中(串口軟件),運行hello文件:
![poYBAGIuBQOAEscYAABXTk8bUCI256.png](http://file.elecfans.com/web2/M00/35/BC/poYBAGIuBQOAEscYAABXTk8bUCI256.png)
程序每隔2秒打印一次,運行正常,說明我根文件系統中的動態庫沒有問題。按下“ctrl+c”組合鍵即可中止該程序。
該程序運行起來,會占用交互窗口,可以讓hello進入后臺運行,方法是在運行軟件的時候加上“&”,即:
./hello &
。注意:程序在后臺運行時,交互串口仍是有打印的,只是這時我們可以敲回車鍵來輸入命令了,與程序的輸出互不影響,唯一的影響是程序的輸出會打斷我們的輸入,但可以不理會打斷,繼續輸入命令仍是可以執行命令的。
在后臺運行的程序,可以使用
ps
命令來查看各個進程的id,然后使用kill -9 pid(進程 ID)
命令來關閉掉當前運行的程序。如下圖,輸入ps命令,可以看到hello程序的進程為101,此時先敲回車鍵,彈出井號提示符,然后輸入
kill -9 101
,再回車,就可以看到hello進程被殺掉了。
2.2 開機自啟動測試
玩過單片機的都知道,單片機的程序燒錄進去后,上電就自動開始運行了。那linux系統,寫了一個程序,可以像單片機那樣開機就運行嗎,當然是可以的!
實現開機自啟動的原理也很簡單,linux在啟動時,有一個默認的開機啟動腳本(/etc/init.d/rcS這個shell文件),因此修改這個腳本,添加自啟動相關內容即可:
![poYBAGIuBRGABj4QAAC1LZbGuow591.png](http://file.elecfans.com/web2/M00/35/BC/poYBAGIuBRGABj4QAAC1LZbGuow591.png)
自啟動代碼添加完成以后,重啟開發板,可以看到hello這個軟件已經開機時自動運行了:
![pYYBAGIuBRaAVcpbAACcYb3KAio360.png](http://file.elecfans.com/web2/M00/35/C2/pYYBAGIuBRaAVcpbAACcYb3KAio360.png)
2.3 外網連接測試
這里的外網是相對于局域網這個內外而言的,即測試板子是否能訪問百度、QQ這樣的網站,先使用ping指令來測試一下:
/ # ping qq.com
ping: bad address 'qq.com'
/ #
在網絡連接正常的情況下,無法ping通這些網址,是因為缺少域名解析服務,需要配置域名解析服務器的IP地址。
一般域名可以設置為所處網絡的網關地址,比如我的局域網的網關是192.168.5.1。
也可以設置為運營商的域名解析服務器地址:114.114.114.114。
在rootfs中新建文件/etc/resolv.conf,然后在里面輸入如下內容:
nameserver 114.114.114.114
nameserver 192.168.5.1
修改保存退出,再次ping一下QQ網站,可以看出ping QQ成功了!
![poYBAGIuBRyAeInyAACcL2BlP8Y373.png](http://file.elecfans.com/web2/M00/35/BC/poYBAGIuBRyAeInyAACcL2BlP8Y373.png)
3 結語
至此!根文件系統的完善工作也完成了。
再來看一下本篇對文件都有哪些修改:
![pYYBAGIuBSSADjXuAAB_QPT-_3A361.png](http://file.elecfans.com/web2/M00/35/C2/pYYBAGIuBSSADjXuAAB_QPT-_3A361.png)
linux移植三巨頭:uboot、kernel、rootfs已移植完畢,接下來可以將這三部分整體打包一下,方便系統的通用燒寫,下篇見~
審核編輯:湯梓紅
-
Linux
+關注
關注
87文章
11351瀏覽量
210505 -
文件
+關注
關注
1文章
571瀏覽量
24834 -
嵌入式L
+關注
關注
0文章
5瀏覽量
6684
發布評論請先 登錄
相關推薦
防止根文件系統破壞,OverlayRootfs 讓你的設備更安全
![防止<b class='flag-5'>根</b><b class='flag-5'>文件系統</b>破壞,OverlayRootfs 讓你的設備更安全](https://file.elecfans.com/web2/M00/10/E9/pYYBAGEfInyAb9dQAABH4pzjonI981.jpg)
【新品】i.MX6ULL工業嵌入式核心板!NXP低功耗MPU,LCD顯示
![【新品】<b class='flag-5'>i.MX6ULL</b>工業<b class='flag-5'>嵌入式</b>核心板!NXP低功耗MPU,LCD顯示](https://file.elecfans.com/web2/M00/3E/6A/pYYBAGJhBGGAGyDYAACBPQuBZQI711.png)
專家力薦|《嵌入式系統原理與開發——基于RISC-V和Linux系統》新書發售
![專家力薦|《<b class='flag-5'>嵌入式</b><b class='flag-5'>系統</b>原理與<b class='flag-5'>開發</b>——基于RISC-V和<b class='flag-5'>Linux</b><b class='flag-5'>系統</b>》新書發售](https://file.elecfans.com/web2/M00/1A/02/poYBAGF47iiANcvqAABSphpOXQU436.jpg)
淺析在NXP I.MX6ULL+Linux平臺下進行WM8960音頻芯片移植的過程
![淺析在NXP <b class='flag-5'>I.MX6ULL+Linux</b>平臺下進行WM8960音頻芯片移植的過程](https://file1.elecfans.com/web2/M00/E6/5C/wKgZomZG0FmAK_z5AABMnaWIF4A400.png)
【嵌入式SD NAND】基于FATFS/Littlefs文件系統的日志框架實現
![【<b class='flag-5'>嵌入式</b>SD NAND】基于FATFS/Littlefs<b class='flag-5'>文件系統</b>的日志框架實現](https://file1.elecfans.com/web2/M00/C5/4F/wKgaomXyzQWAOuZPAADeOXPjtqE725.png)
評論