Node.js:開(kāi)發(fā)資源和技術(shù)棧整理">Node.js:開(kāi)發(fā)資源和技術(shù)棧整理
795
2025-04-01
上篇文章,使用BusyBox構(gòu)建了基礎(chǔ)的嵌入式Linux系統(tǒng)的根文件系統(tǒng),基本的功能可以正常運(yùn)行,但在個(gè)基礎(chǔ)功能上,還要許多地方需要完善。
1 完善根文件系統(tǒng)
上篇說(shuō)道,Linux系統(tǒng)運(yùn)行起來(lái)后,可以正常的執(zhí)行"ls"等基礎(chǔ)命令,但仔細(xì)觀察系統(tǒng)運(yùn)行后的打印信息,有一條提示:
can't run '/etc/init.d/rcS': No such file pngor directory
說(shuō)是無(wú)法運(yùn)行“/etc/init.d/rcS”這個(gè)文件,因?yàn)楦募到y(tǒng)(rootfs)里沒(méi)有這個(gè)文件。這個(gè)rcS是什么呢?它其實(shí)是一個(gè)shell腳本, 在Linux內(nèi)核啟動(dòng)以后,需要啟動(dòng)一些服務(wù), 而rcS就是規(guī)定啟動(dòng)哪些文件的腳本文件。
1.1 創(chuàng)建/etc/init.d/rcS文件
在rootfs中創(chuàng)建/etc/init.d/rcS文件(前兩級(jí)目錄不存在,要先創(chuàng)建文件夾,再創(chuàng)建文件),然后在rcS中輸入如下所示內(nèi)容:
#!/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環(huán)境變量:保存著可執(zhí)行文件可能存在的目錄,這樣我們?cè)趫?zhí)行一些命令或者可執(zhí)行文件的時(shí)候就不會(huì)提示找不到文件這樣的錯(cuò)誤。
LD_LIBRARY_PATH環(huán)境變量:保存著庫(kù)文件所在的目錄。
export命令:用來(lái)導(dǎo)出上面這些環(huán)境變量,相當(dāng)于聲明一些“全局變量” 。
mount命令:用來(lái)掛載所有的文件系統(tǒng),這些文件系統(tǒng)由文件/etc/fstab來(lái)指定,所以后續(xù)還要?jiǎng)?chuàng)建/etc/fstab文件。
mkdir命令:創(chuàng)建目錄/dev/pts,然后將devpts掛載到/dev/pts目錄中。
最后兩行:使用mdev來(lái)管理熱插拔設(shè)備,通過(guò)這兩行,Linux內(nèi)核就可以在/dev目錄下自動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)。
創(chuàng)建好/etc/init.d/rcS后還定要給其可執(zhí)行權(quán)限(chmod 777)。
1.2 創(chuàng)建/etc/fstab文件
上面說(shuō)道,rcS在掛載所用的文件系統(tǒng)時(shí),這些文件系統(tǒng)由文件/etc/fstab 來(lái)指定,所以還要?jiǎng)?chuàng)建/etc/fstab文件。
在rootfs中創(chuàng)建 /etc/fstab文件, fstab在Linux開(kāi)機(jī)以后自動(dòng)配置哪些需要自動(dòng)掛載的分區(qū),格式如下:
按照上述格式,在fstab文件中輸入如下內(nèi)容(第1行是注釋):
#
fstab文件創(chuàng)建完成以后,啟動(dòng)開(kāi)發(fā)板,可以看出,啟動(dòng)成功,且沒(méi)有提示rcS:
注:以上兩個(gè)文件,可以直接在ubuntu的nfs文件中添加,也可以先通過(guò)板子的串口連接到nfs后,在串口窗口操作。我是在ubuntu中操作,然后再連接板子啟動(dòng)。
1.3 創(chuàng)建/etc/inittab文件
系統(tǒng)啟動(dòng)已經(jīng)沒(méi)有錯(cuò)誤提示了,但我們要仍要?jiǎng)?chuàng)建另一個(gè)文件/etc/inittab ,這個(gè)文件用于busyboxd的初始化,init 程序會(huì)讀取/etc/inittab這個(gè)文件。
inittab由若干條指令組成,每條指令的結(jié)構(gòu)都是以“:”分隔的4個(gè)段組成,格式如下:
參考busyboxd的examples/inittab文件,來(lái)創(chuàng)建一個(gè)/etc/inittab,輸入如下內(nèi)容:
#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 行:系統(tǒng)啟動(dòng)以后運(yùn)行 /etc/init.d/rcS這個(gè)腳本文件。
第 3 行:將console作為控制臺(tái)終端,也就是ttymxc0。
第 4 行:重啟將運(yùn)行 /sbin/init。
第 5 行:按下ctrl+alt+del組合鍵的將運(yùn)行 /sbin/reboot(注:windows系統(tǒng)的串口軟件連接開(kāi)發(fā)板,這個(gè)命令無(wú)效,因?yàn)樵摻M合鍵會(huì)被windows系統(tǒng)攔截而執(zhí)行windows系統(tǒng)的ctrl+alt+del組合鍵命令)。
第 6 行:關(guān)機(jī)的時(shí)候執(zhí)行 /bin/umount,也就是卸載各個(gè)文件系統(tǒng)。
第 7 行:關(guān)機(jī)的時(shí)候執(zhí)行 /sbin/swapoff,也就是關(guān)閉交換分區(qū)。
注:我在ubuntu上編輯測(cè)文件時(shí),console行出現(xiàn)了紅色背景塊,但似乎也沒(méi)什么影響
/etc/inittab文件創(chuàng)建好以后就可以重啟開(kāi)發(fā)板即可, 至此,根文件系統(tǒng)要?jiǎng)?chuàng)建的文件就已經(jīng)全部完成了。
總結(jié)一下剛才創(chuàng)建的目錄和文件,如下圖
2 根文件系統(tǒng)其他功能測(cè)試
根文件系統(tǒng)已經(jīng)完善了,接下來(lái)就來(lái)繼續(xù)測(cè)試根文件系統(tǒng)是否好用。
2.1 軟件運(yùn)行測(cè)試
先來(lái)編寫一個(gè)簡(jiǎn)單的c語(yǔ)言程序運(yùn)行一下,驗(yàn)證庫(kù)文件是否能用。
先在ubuntu的rootfs中(可以先創(chuàng)建一個(gè)單獨(dú)的test文件夾用來(lái)測(cè)試)創(chuàng)建一個(gè)hello.c:
#include
然后使用交叉編譯鏈來(lái)編譯程序:
arm-linux-gnueabihf-gcc hello.c -o hello
編譯后會(huì)生成名為hello的可執(zhí)行文件,可以使用“file”命令查看文件類型以及編碼格式:
hello是個(gè)32位的LSB可執(zhí)行文件,ARM架構(gòu)的,并且是動(dòng)態(tài)鏈接的。
在ubunt中編譯完后,重啟開(kāi)發(fā)板,在開(kāi)發(fā)板的串口中(串口軟件),運(yùn)行hello文件:
程序每隔2秒打印一次,運(yùn)行正常,說(shuō)明我根文件系統(tǒng)中的動(dòng)態(tài)庫(kù)沒(méi)有問(wèn)題。按下“ctrl+c”組合鍵即可中止該程序。
該程序運(yùn)行起來(lái),會(huì)占用交互窗口,可以讓hello進(jìn)入后臺(tái)運(yùn)行,方法是在運(yùn)行軟件的時(shí)候加上“&”,即:./hello &。
注意:程序在后臺(tái)運(yùn)行時(shí),交互串口仍是有打印的,只是這時(shí)我們可以敲回車鍵來(lái)輸入命令了,與程序的輸出互不影響,唯一的影響是程序的輸出會(huì)打斷我們的輸入,但可以不理會(huì)打斷,繼續(xù)輸入命令仍是可以執(zhí)行命令的。
在后臺(tái)運(yùn)行的程序,可以使用ps命令來(lái)查看各個(gè)進(jìn)程的id,然后使用kill -9 pid(進(jìn)程 ID)命令來(lái)關(guān)閉掉當(dāng)前運(yùn)行的程序。
如下圖,輸入ps命令,可以看到hello程序的進(jìn)程為101,此時(shí)先敲回車鍵,彈出井號(hào)提示符,然后輸入kill -9 101,再回車,就可以看到hello進(jìn)程被殺掉了。
2.2 開(kāi)機(jī)自啟動(dòng)測(cè)試
玩過(guò)單片機(jī)的都知道,單片機(jī)的程序燒錄進(jìn)去后,上電就自動(dòng)開(kāi)始運(yùn)行了。那linux系統(tǒng),寫了一個(gè)程序,可以像單片機(jī)那樣開(kāi)機(jī)就運(yùn)行嗎,當(dāng)然是可以的!
實(shí)現(xiàn)開(kāi)機(jī)自啟動(dòng)的原理也很簡(jiǎn)單,linux在啟動(dòng)時(shí),有一個(gè)默認(rèn)的開(kāi)機(jī)啟動(dòng)腳本(/etc/init.d/rcS這個(gè)shell文件),因此修改這個(gè)腳本,添加自啟動(dòng)相關(guān)內(nèi)容即可:
自啟動(dòng)代碼添加完成以后,重啟開(kāi)發(fā)板,可以看到hello這個(gè)軟件已經(jīng)開(kāi)機(jī)時(shí)自動(dòng)運(yùn)行了:
2.3 外網(wǎng)連接測(cè)試
這里的外網(wǎng)是相對(duì)于局域網(wǎng)這個(gè)內(nèi)外而言的,即測(cè)試板子是否能訪問(wèn)百度、QQ這樣的網(wǎng)站,先使用ping指令來(lái)測(cè)試一下:
/ # ping qq.com ping: bad address 'qq.com' / #
在網(wǎng)絡(luò)連接正常的情況下,無(wú)法ping通這些網(wǎng)址,是因?yàn)槿鄙儆蛎馕龇?wù),需要配置域名解析服務(wù)器的IP地址。
一般域名可以設(shè)置為所處網(wǎng)絡(luò)的網(wǎng)關(guān)地址,比如我的局域網(wǎng)的網(wǎng)關(guān)是192.168.5.1。
也可以設(shè)置為運(yùn)營(yíng)商的域名解析服務(wù)器地址:114.114.114.114。
在rootfs中新建文件/etc/resolv.conf,然后在里面輸入如下內(nèi)容:
nameserver 114.114.114.114 nameserver 192.168.5.1
修改保存退出,再次ping一下QQ網(wǎng)站,可以看出ping QQ成功了!
3 結(jié)語(yǔ)
至此!根文件系統(tǒng)的完善工作也完成了。
再來(lái)看一下本篇對(duì)文件都有哪些修改:
linux移植三巨頭:uboot、kernel、rootfs已移植完畢,接下來(lái)可以將這三部分整體打包一下,方便系統(tǒng)的通用燒寫,下篇見(jiàn)~
Linux 嵌入式
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。