通過busybox制作根文件系統詳細過程


我在之前的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM