製作好的文件系統項目開源地址:https://github.com/Mculover666/rootfs-jz2440。
1. 編譯安裝busybox
系統環境:
- ubuntu 18.04 64bit
- arm-linux-gcc 4.4.3
1.1. 下載
官網下載挺快的:https://busybox.net/。
此處使用1.20.2
版本,在下載頁面的最下面。
下載完成之後解壓出來:
tar -jxf busybox-1.20.2.tar.bz2
經過編譯測試:
- 1.20.2版本編譯通過
- 1.27.2版本編譯失敗
- 1.30.1版本編譯失敗
1.2. 配置編譯
busybox編譯之前需要設置編譯工具鏈:
cd busybox-1.20.2/
make menuconfig
進入配置項 Busybox Settings:
進入 Build Options :
找到Cross compiler prefix (交叉編譯器前綴)並修改爲arm-linux-
:
退出並保存,配置完成。
1.3. 編譯
make
編譯成功之後,開始使用busybox製作根文件系統。
2. 製作根文件系統
2.1. 安裝busybox
首先新建一個安裝目錄 fs_mini_mdev_test 用於安裝busybox,然後使用 CONFIG_PREFIX
環境變量指定該目錄進行安裝:
make install CONFIG_PREFIX=/home/ubuntu/busybox/fs_mini_mdev_test
安裝完成之後,在安裝目錄中就有了基本命令的目錄,如圖:
2.2. 安裝庫
2.2.1. 尋找編譯器庫
首先找到交叉編輯器所在位置:
echo $PATH
然後進入到該目錄:
cd /usr/arm-linux-toolchains4.4.3/bin
cd ..
尋找交叉編譯器所使用的庫文件:
find -name lib
找到了這5個庫,接着來sys-root這兩個庫裏都有哪些文件:
./arm-none-linux-gnueabi/sys-root/usr/lib
./arm-none-linux-gnueabi/sys-root/lib
2.2.2. 複製庫文件
拷貝 sys-root/lib 庫文件:
cd ~
mkdir /home/ubuntu/busybox/fs_mini_mdev_test/lib
cp -d /usr/arm-linux-toolchains4.4.3/arm-none-linux-gnueabi/sys-root/lib/*so* /home/ubuntu/busybox/fs_mini_mdev_test/lib/
接着再拷貝sys-root/usr/lib 庫裏的文件:
cd ~
mkdir /home/ubuntu/busybox/fs_mini_mdev_test/usr/lib
cp -d /usr/arm-linux-toolchains4.4.3/arm-none-linux-gnueabi/sys-root/usr/lib/*so* /home/ubuntu/busybox/fs_mini_mdev_test/usr/lib/
2.3. 構建etc目錄
etc目錄下的內容取決於要運行的程序,本教程中只創建三個文件:
- etc/inittab
- etc/init.d/rcS
- etc/fsttab
其中,init進程將根據inittab文件來創建其它子進程,比如調用腳本文件配置ip地址、掛接其它文件系統等,最後啓動shell。
- ① 創建etc/inittab文件
仿照Busybox中example下的inittab文件內容,在fs_mini_mdev_test/目錄下,創建etc目錄,再進入目錄創建一個inittab文件,編輯以下內容:
# /etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
- ② 創建etc/init.d/rcS文件
在etc目錄下創建該文件,這是一個腳本文件,可以在裏面添加需要自動執行的命令,編輯以下內容:
#!/bin/sh
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
再加上可執行權限,否則啓動時會提示沒有權限:
sudo chmod +x init.d/rcS
暫時不支持網卡,不配置ip。
- ③ 創建etc/fstab文件
該文件中的內容表示執行mount -a 命令後要掛載的文件系統,內容如下:
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
2.4. 構建dev目錄
init 進程要用到兩個設備文件,建立:
cd fs_mini_mdev_test/
mkdir dev
cd dev
sudo mknod console c 5 1
sudo mknod null c 1 3
2.5. 創建其它目錄
其它目錄可以是空目錄,創建命令如下:
cd fs_mini_mdev_test/
mkdir proc mnt tmp sys root
3. 製作jffs2映像文件
接下來需要將製作好的根文件系統目錄 fs_mini_mdev_test 製作爲一個文件系統映像,因爲Linux內核目前還沒有配置支持yaffs2,所以使用jffs2來測試。
3.1. 安裝mtd-utils工具
sudo apt-get install mtd-utils
3.2. 製作jffs2文件系統
首先確保在文件目錄的上一級:
執行製作命令:
mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_test -o fs_mini_mdev_test.jffs2
這些參數的意思爲:
-n
:不要在每個擦除塊上都加上清除標誌;-s 2048
:指明一頁大小爲2048字節;-e 128KiB
:指明一個擦除扇區大小爲128KB;-d fs_mini_mdev_test
:指定要打包的根文件系統目錄;-o fs_mini_mdev_test.jffs2
:指明輸出的映像文件名稱;
製作完成:
3.3. 燒寫測試
參考教程:uboot研讀筆記 | 10 - 移植uboot 2012.04到JZ2440(燒寫Linux內核、燒寫yaffs2文件系統)。
將該文件系統映像下載到windows主機中,存放到TFTP服務器目錄,然後在開發板中使用uboot燒錄nand flash中:
tftp 30000000 fs_mini_mdev_test.jffs2
nand erase.part filesystem
nand write.jffs2 30000000 260000 678c24
然後設置環境變量:
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
saveenv
重啓開發板,測試是否可以掛載成功:
reset
3.4. 解決問題
這個問題是因爲編譯器編譯時使用了eabi接口(Embedded Application Binary Interface,嵌入式應用二進制接口),但是內核中沒有開啓配置,所以內核提示這是非法指令。
解決方案就是:在內核中配置支持該接口。
進入內核目錄:
make menuconfig
進入 Kernel Features :
選中圖中這一項即可:
然後退出,保存設置,重新編譯內核:
make uImage
編譯成功後,內核大小爲2361KB,超過劃分的2MB分區,所以不能燒寫到nand flash中,直接使用tftp下載到內存中運行,後續文章中裁剪內核<2MB之後才能燒寫到內核中!
重新燒寫內核,啓動進行測試:
tftp 30000000 uImage
bootm 30000000
啓動之後,可以看到Linux內核啓動成功,根文件系統掛載成功,成功進入Linux命令行:
接收更多精彩文章及資源推送,歡迎訂閱我的微信公衆號:『mculover666』。