我在之前的uboot通過NFS掛載ubuntu根文件系統中也有實現過根文件系統的制作,那只是在ubuntu官網已經做好的根文件基礎上安裝一些自己所需的軟解而已。而使用busybox制作根文件系統可以自定義選項,加深自己對linux的系統理解,方便后期學習根文件系統的裁剪。
一、下載busybox制作制作工具
官網下載地址https://busybox.net/,進入“Download Source”下載連接
根據自己的需要下載相應的版本,我下載的是“busybox-1.33.1.tar.bz2 ”。
二、編譯鏈配置
將下載的文件放入linux開發環境中進行解壓,目錄如下圖所示
為了以后使用方便,修改交叉工具鏈,進入“Makefile”文件
sudo vim Makefile
進入文件后修改“ARCH”和“CROSS_COMPILE”變量,如下圖所示:
注意:交叉編譯鏈一定要是自己安裝的全路徑
三、busybox中文支持
1.修改“printable_string.c”文件
sudo vim libbb/printable_string.c
進入文件后修改內容如下圖所示:
2.修改“unicode.c”文件
sudo vim libbb/unicode.c
進入文件后修改內容如下圖所示:
四、配置busybox
1.設置配置項
defconfig:缺項配置,也就是默認配置選項。
allyesconfig:全選配置,也就是說選中busybox的所有功能。
allnoconfig:最小配置。
可以根據自己需要選擇配置命令,這里我選用的是最下配置命令如下
sudo make defconfig
配置完成后可通過查看是否有.config文件,如果存在則說明配置成功,如下圖所示:
2.進入圖形配置
sudo make menuconfig
進入圖形配置界面后,配置庫文件來源,配置路徑如下所示
-> Settings
-> Build static binary
使用靜態庫時,編譯出來的文件很大,然后編譯出來的DNS會出問題,所以我這里選用的是動態庫,配置如下圖所示:
勾選“vi-style line editing commands”,配置路徑如下
-> Settings
-> vi-style line editing commands
取消“Simplified modutils”的勾選,配置路徑如下
-> Linux Module Utilities
-> Simplified modutils
勾選“mdev”,配置路徑如下
-> Linux System Utilities
-> mdev
如下圖所示:
勾選“Support Unicode”及其子選項“Check $LC_ALL, $LC_CTYPE and $LANG environment variables”
-> Settings
-> Support Unicode
-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables
到此busybox的配置基本完成,如果需要其他配置項的內容可根據自己的需求選擇。
五、編譯busybox
編譯時指定生成的根文件系統的存放路徑
make install CONFIG_PREFIX=/home/nfs/rootfs
編譯完成后會出下圖中的結果說明編譯成功,如果所示:
此時,進入生成的根文件路徑下可以看到相應的目錄生成,如下圖所示:
此時看到的根文件系統是不完全的,因為我選擇的庫文件是動態庫,所以還需要將庫文件加入系統中。
六、添加動態庫文件
1.在生成的根文件目錄下創建lib
文件夾
mkdir lib
將交叉編譯鏈arm-linux-gnueabihe/libc/lib
下的所有so和.a文件拷貝到剛才創建的lib文件下
cp *so* *.a /home/nfs/rootfs/lib -d
將剛拷貝過來放在lib目錄下的ld-linux-armhf.so.3
的軟鏈接改為源文件,首先刪除文件
rm ld-linux-armhf.so.3
然后重新在交叉編譯鏈arm-linux-gnueabihe/libc/lib
下將文件拷貝過來
cp ld-linux-armhf.so.3 /home/nfs/rootfs/lib
將交叉編譯鏈arm-linux-gnueabihe/lib
下的所有so和.a文件拷貝到剛才創建的lib文件下
cp *so* *.a /home/nfs/rootfs/lib -d
2.在生成的根文件目錄下創建usr/lib
文件夾
cd ../
mkdir usr/lib
cd usr/lib
ls
將交叉編譯鏈arm-linux-gnueabihe/libc/usr/lib
下的所有so和.a文件拷貝到剛才創建的lib文件下
cp *so* *.a /home/nfs/rootfs/usr/lib -d
到此動態庫文件已經拷貝完成,可以通過du命令查看剛才拷貝文件的大小
cd ../../
du ./lib ./usr/lib
如下圖所示:
3.創建其他文件夾
mkdir dev proc mnt sys tmp root
目錄如下圖所示:
現在我們的根文件系統就基本制作完成了,接下來測試我們制作的根文件是否能用。
七、測試
測試方式推薦使用NFS的形式掛載根文件系統,由於之間我有寫過一篇文章,這里就不過多介紹了,具體流程見uboot通過NFS掛載ubuntu根文件系統
掛載根文件系統啟動后,見如下圖信息,則說明成功:
啟動后雖然能正常使用,但是會提示缺少'rcS'文件,需要在/etc/init.d/
路徑下創建rcS文件,如果路徑不存在,創建相應的文件即可
1.rcS文件
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/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
完成后更改權限並重啟開發版,
chmod 777 rcS
reboot
啟動后又會出現缺少fstab
文件,同樣的方式在/etc
路徑下創建fstab
文件
2.fstab文件
# <file system> <dir> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
完成后在此重啟,這次雖然沒錯誤提示,還需要在/etc
路徑下創建inittab
文件
3.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/swqpoff -a
到此簡單的根文件系統已經制作完成,可以進行系統的燒寫。
八、問題與處理
1.打開圖形配置界面時,可能出現的問題如下圖所示:
解決辦法,錯誤主要是沒有安裝ncurses導致的,只需要進行安裝即可
sudo apt-get install libncurses5-dev
九、參考連接
原子哥視頻教程https://www.bilibili.com/video/BV12E411h71h?p=44&spm_id_from=pageDriver