【嵌入式Linux之QEMU模擬器】4、使用busybox制作根文件系統(tǒng)
文件系統(tǒng):對存儲設(shè)備上的數(shù)據(jù)進行組織的機制。

根文件系統(tǒng)【root_fs】
linux內(nèi)核啟動后第一個掛載的文件系統(tǒng)
主要由基本的shell命令、各種庫、字符設(shè)備、配置腳本組成
提供了根目錄/
根文件系統(tǒng)【簡稱RFS】可以放在:nor/nand flash、SD卡、磁盤、網(wǎng)絡(luò)空間上
busybox
一個集成100多個linux常用命令和工具的軟件
一個適合制作嵌入式文件系統(tǒng)的軟件工具
下載<鏈接>
一、創(chuàng)建shell命令
1、下載busybox
可以到上面的<官網(wǎng)>進行下載,當然也可以到<這里>提取碼:7j6b
2、修改Makefile
①、下載完畢后將其拖曳到ubuntu中,進行解壓tar xvf busybox-1.27.0.tar.bz2
②、解壓完畢后,進入該文件夾后,輸入vi Makefile進行修改Makefile。在vi的一般模式下輸入/ARCH,進行搜索。
下面所說多少行是以我的上述版本為例
164行 CROSS_COMPILE ?=arm-linux-gnueabi-
190行 ARCH ?= arm
3、配置
①、輸入make defconfig,進行配置
②、圖形化配置
輸入apt install libncurses5-dev安裝必須的庫
輸入make menuconfig
選中“Busybox Settings”,然后回車。
找到下圖所示選項,然后按空格,讓其前面出現(xiàn)*
退出
4、編譯
輸入make -j4
(漫長等待…)【貌似有好多警告???】
5、安裝
輸入make install
編譯后會在 ./_install的目錄下生成各種
命令
。分別放到了4個文件bin linuxrc sbin usr里。
bin目錄下,主要是一些常用的命令
sbin目錄下,也是一些命令
linuxrc目錄下,是linuxrc
usr目錄下,也是一些命令
前面說過,
根文件系統(tǒng)主要由基本的shell命令、各種庫、字符設(shè)備、配置腳本組成
幾個部分組成,現(xiàn)在已經(jīng)具備了shell命令了,接著制作!
二、創(chuàng)建各種庫
1、創(chuàng)建根文件系統(tǒng)總文件夾,這里我把/home/clay/QEMU目錄下的rootfs文件夾作為總文件夾!
2、拷貝剛剛_install文件中的全部命令到該文件中!
進入rootfs文件后,輸入cp -r ../busybox/busybox-1.27.0/_install/* .將剛剛生成的所有命令拷貝到要制作的根文件系統(tǒng)總文件夾中!【-r參數(shù)表示連帶子目錄也一同拷貝】
3、在rootfs文件夾中,新建lib文件夾。
①、進入rootfs文件目錄后,輸入mkdir lib創(chuàng)建文件夾!
②、將交叉編譯器的庫,拷到/rootfs/lib文件夾中
進入lib文件夾,輸入cp -p /usr/arm-linux-gnueabi/lib/* .【-p參數(shù)表示保留源文件或目錄的屬性】
三、創(chuàng)建字符設(shè)備
設(shè)備文件,跟用戶、底層進行交互的接口,這些接口以文件節(jié)點的形式存在!讀寫文件,直接讀寫對應(yīng)的結(jié)點即可!
1、在rootfs目錄下,創(chuàng)建./dev文件夾,用以存放各種目錄結(jié)點!
進入rootfs目錄,輸入mkdir dev新建文件夾
2、依次輸入下面命令,創(chuàng)建4個串口結(jié)點
mknod -m 666 tty1 c 4 1 mknod -m 666 tty2 c 4 2 mknod -m 666 tty3 c 4 3 mknod -m 666 tty4 c 4 4
1
2
3
4
mknod -m 666 tty1 c 4 1命令中
mknod表示創(chuàng)建結(jié)點
-m設(shè)置權(quán)限為666
tty表示串口
c表示字符設(shè)備
4表示主設(shè)備號,1表示次設(shè)備號
3、創(chuàng)建工作臺結(jié)點,mknod -m 666 console c 5 1
4、創(chuàng)建null結(jié)點,mknod -m 666 null c 1 3
四、制作SD卡文件系統(tǒng)鏡像
根文件系統(tǒng)放到SD卡里,內(nèi)核啟動后,從SD卡掛載根文件系統(tǒng)
1、退回./QEMU目錄,輸入dd if=/dev/zero of=rootfs.ext3 bs=1M count=32,生成根文件系統(tǒng)鏡像rootfs.ext3。
命令中的bs表示緩沖區(qū)大小,count表示塊大小
直接把rootfs.ext3看成一個SD卡即可
2、格式化rootfs.ext3,輸入mkfs.ext3 rootfs.ext3
3、將各種文件拷貝到文件系統(tǒng)鏡像中
需要注意的是,塊設(shè)備不能直接讀寫,需要掛載到目錄,然后對目錄進行一些相應(yīng)的操作!
①、輸入mount -t ext3 rootfs.ext3 /mnt/ -o loop
mount [-fnrsvw] [-t vfstype] [-o options] device dir
-t ext3,表示文件系統(tǒng)是ext3格式
其中-o loop=:使用 loop 模式用來將一個檔案當成硬盤分割掛上系統(tǒng)。
②、掛載完畢,然后輸入ls /mnt查看SD卡內(nèi)容,里面自然是空的!
③、拷貝文件到SD卡中
輸入cp -r rootfs/* /mnt/
④、卸載SD卡
輸入umount /mnt
五、啟動內(nèi)核,掛載rootfs
輸入qemu-system-arm -M vexpress-a9 -m 512M -dtb ./test/vexpress-v2p-ca9.dtb -kernel ./test/zImage -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfs.ext3
上述命令過長,也可采用上節(jié)最后介紹的技巧2,修改./QEMU目錄下的boot.sh文件為:
qemu-system-arm\ -M vexpress-a9\ -m 512M\ -dtb ./test/vexpress-v2p-ca9.dtb\ -kernel ./test/zImage\ -nographic\ -append "root=/dev/mmcblk0 rw console=ttyAMA0"\ -sd rootfs.ext3
1
2
3
4
5
6
7
8
然后再控制臺輸入./boot.sh即可運行!
注意:
啟動后,也許會發(fā)現(xiàn)有一個錯誤。
這個是因為,目前做的文件系統(tǒng)是最簡陋的文件系統(tǒng),還缺少很多東西。所以暫時忽略,關(guān)鍵是當輸入ls時,是否會出現(xiàn)相應(yīng)內(nèi)容呢?如下圖所示。
若可以,則沒有問題!
如何消除這個警報呢?下面提供兩種方法,一種在簡陋的根文件系統(tǒng)內(nèi)部修改,一種從簡陋的根文件系統(tǒng)外部修改!
方法一:在簡陋的根文件系統(tǒng)內(nèi)部修改
①、mkdir創(chuàng)建etc文件夾
②、進入etc,mkdir創(chuàng)建init.d文件夾
③、進入init.d,touch創(chuàng)建rcS文件
④、輸入chmod a+x rcS,添加可運行權(quán)限
⑤、輸入vi rcS,編輯腳本文件
echo "-----------------------------------------"I echo "Welcome to A9 vexpress board" echo "------------------------------------------"
1
2
3
4
5
6
7
8
⑥、從/etc/init.d目錄,退回到根目錄。
輸入兩次cd ..
⑦、開啟另一個終端,輸入ps -a,查看qemu-system-arm對應(yīng)的進程PID號,然后輸入kill ×××
⑧、回到原終端,輸入啟動命令qemu-system-arm -M vexpress-a9 -m 512M -dtb ./test/vexpress-v2p-ca9.dtb -kernel ./test/zImage -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfs.ext3
或者輸入./boot.sh
重新啟動查看rcS顯示效果
方法二:從簡陋的根文件系統(tǒng)外部修改
①、進入rootfs,在rootfs下創(chuàng)建etc文件夾,mkdir etc
②、進入etc,在etc下創(chuàng)建init.d文件夾,mkdir init.d
③、進入init.d,在init.d下創(chuàng)建rcS文件,touch rcS。同時加上可運行權(quán)限,chmod a+x rcS
④、編輯rcS如下內(nèi)容,vi rcS
echo "-----------------------------------------"I echo " Hello world! " echo "-----------------------------------------"
1
2
3
4
5
6
7
8
⑤、重新將內(nèi)容拷貝到SD卡!
掛載SD卡
退回QEMU所在目錄,輸入mount -t ext3 rootfs.ext3 /mnt/ -o loop
拷貝所有文件到掛載目錄
輸入cp -r rootfs/* /mnt
卸載SD卡
輸入umount /mnt
⑥、重新啟動,輸入qemu-system-arm -M vexpress-a9 -m 512M -dtb ./test/vexpress-v2p-ca9.dtb -kernel ./test/zImage -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfs.ext3
或者輸入./boot.sh
可以看到內(nèi)容已經(jīng)變更!
目前的情況來看,完善我們的文件系統(tǒng)還是蠻不方便的,后期當我們掛載到NFS上,可直接在主機進行修改,到那時便會方便許多,繼續(xù)往下看咯!
注:上面都是命令行啟動內(nèi)核,若想圖形化啟動【LCD】可執(zhí)行下面代碼進行啟動!
qemu-system-arm -M vexpress-a9 -m 512M -dtb ./test/vexpress-v2p-ca9.dtb -kernel ./test/zImage -append "root=/dev/mmcblk0 rw console=tty0" -sd rootfs.ext3
1
【上述代碼是一行完成!】
或者再新建腳本boot_with_lcd.sh為以下內(nèi)容【制作方法可參考上節(jié)最后的技巧2】
qemu-system-arm \ -M vexpress-a9 \ -m 512M\ -dtb ./test/vexpress-v2p-ca9.dtb\ -kernel ./test/zImage\ -append "root=/dev/mmcblk0 rw console=tty0"\ -sd rootfs.ext3\
1
2
3
4
5
6
7
8
LCD啟動后,關(guān)閉LCD可直接關(guān)閉對應(yīng)進程!
ARM Linux 嵌入式
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(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)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。