手把手教你用 buildroot 構建根文件系統
嵌入式系統三大部分:bootloader(uboot)、Linux內核、根文件系統。
制作根文件系統有三大神器:busybox、buildroot、yocto。
使用 busybox 構建文件系統,僅僅只是幫我們構建好了一些常用的命令和文件,像 lib 庫、/etc 目錄下的一些文件都需要自己手動創建,我們還要自己去移植一些第三方軟件和庫,比如 alsa、iperf、mplayer 等等。而且 busybox 構建的根文件系統默認沒有用戶名和密碼設置。
如果想要構建完整的根文件系統,大家一般都是使用buildroot,它不僅包含了 busybox 的功能,而且里面還集成了各種軟件,需要什么軟件就選擇什么軟件,不需要我們去移植。buildroot 極大的方便了我們嵌入式 Linux 開發人員構建實用的根文件系統。
至于 yocto 構建根文件系統,過于復雜,需要時間也很久,我們一般不會選擇這一種方式。
buildroot 下載
buildroot 源碼肯定是要從 buildroot 官網下載,官網地址為 https://buildroot.org/。
下載后解壓如圖:
buildroot 和 uboot、Linux kernel 一樣也支持圖形化配置,輸入如下命令即可打開圖形化配置界:
- make menuconfig

1、配置 Target options
- Target options
- -> Target Architecture = ARM (little endian)
- -> Target Binary Format = ELF
- -> Target Architecture Variant = cortex-A7
- -> Target ABI = EABIhf
- -> Floating point strategy = NEON/VFPv4
- -> ARM instruction set = ARM
2、配置 Toolchain
此配置項用于配置交叉編譯工具鏈,設置為我們自己所使用的交叉編譯器,必須是絕對路徑。
目前,在ARM Linux的開發中,人們趨向于使用Linaro( http://www.linaro.org/ )工具鏈團隊維護的ARM工具鏈,它以每月一次的 形式發布新的版本,編譯好的可執行文件可從網址 http://www.linaro.org/downloads/ 下載。Linaro是ARM Linux領域中最著名最具技術成就的開源組織,其會員包括ARM、Broadcom、Samsung、TI、Qualcomm等,國內的海思、中興、全志和中國臺灣的MediaTek 也是它的會員。
一個典型的ARM Linux工具鏈包含arm-linux-gnueabihf-gcc(后續工具省略前綴)、strip、gcc、objdump、ld、gprof、nm、readelf、 addr2line等。前綴中的“hf”顯 示該工具鏈是完全的硬浮點。
- Toolchain
- -> Toolchain type = External toolchain
- -> Toolchain = Custom toolchain //用戶自己的交叉編譯器
- -> Toolchain origin = Pre-installed toolchain //預裝的編譯器
- -> Toolchain path = //編譯器絕對路徑
- -> Toolchain prefix = $(ARCH)-linux-gnueabihf //前綴
- -> External toolchain gcc version = 4.9.x
- -> External toolchain kernel headers series = 4.1.x
- -> External toolchain C library = glibc/eglibc
- -> [*] Toolchain has SSP support? (NEW) //選中
- -> [*] Toolchain has RPC support? (NEW) //選中
- -> [*] Toolchain has C++ support? //選中
- -> [*] Enable MMU support (NEW) //選中
3、配置 System configuration
用于設置一些系統配置,比如開發板名字、歡迎語、用戶名、密碼等。
- System configuration
- -> System hostname = Jasonangel //平臺名字,自行設置
- -> System banner = Welcome to xxxxx //歡迎語
- -> Init system = BusyBox //使用 busybox
- -> /dev management = Dynamic using devtmpfs + mdev //使用 mdev
- -> [*] Enable root login with password (NEW) //使能登錄密碼
- -> Root password = 123456 //登錄密碼為 123456
4、配置 Filesystem images
此選項配置我們最終制作的根文件系統為什么格式的,配置如下:
- -> Filesystem images
- -> [*] ext2/3/4 root filesystem //如果是 EMMC 或 SD 卡的話就用 ext3/ext4
- -> ext2/3/4 variant = ext4 //選擇 ext4 格式
- -> [*] ubi image containing an ubifs root filesystem //如果使用 NAND 的話就用 ubifs
5、禁止編譯 Linux 內核和 uboot
buildroot 不僅僅能構建根文件系統,也可以編譯 linux 內核和 uboot。當配置 buildroot,使能 linux 內核和 uboot 以后 buildroot 就會自動下載最新的 linux 內核和 uboot 源碼并編譯。但是我們一般都不會使用 buildroot 下載的 linux 內核和 uboot,因為 buildroot 下載的 linux 和 uboot官方源碼,里面會缺少很多驅動文件,而且最新的 linux 內核和 uboot 會對編譯器版本號有要求,可能導致編譯失敗。因此我們需要配置 buildroot,關閉 linux 內核和 uboot 的編譯,只使用buildroot 來構建根文件系統,首先是禁止 Linux 內核的編譯,配置如下:
- -> Kernel
- -> [ ] Linux Kernel //不要選擇編譯 Linux Kernel 選項!
接著禁止編譯 Uboot,配置如下:
- -> Bootloaders
- -> [ ] U-Boot //不要選擇編譯 U-Boot 選項!
6、配置 Target packages
此選項用于配置要選擇的第三方庫或軟件、比如 alsa-utils、ffmpeg、iperf、ftp、ssh等工具,可以按需選擇。
配置完成以后就可以編譯 buildroot 了,編譯完成以后 buildroot 就會生成編譯出來的根文件系統壓縮包,我們可以直接使用。輸入如下命令開始編譯:
- sudo make //注意,一定要加 sudo,而且不能通過-jx 來指定多核編譯!!!
buildroot 編譯過程會很耗時,請耐心等待!編譯完成以后就會在 buildroot-2019.02.6/output/images 下生成根文件系統,即可使用。
編譯過程需要一定的額外內存,注意需要留好內存,否則會報錯如下:
- g++: internal compiler error: Killed (program cc1plus)
- Please submit a full bug report
buildroot 下的 busybox 配置
buildroot 在構建根文件系統的時候也是要用到 busybox 的,既然用到了 busybox 那么就涉及到 busybox 的配置。buildroot 會自動下載 busybox 壓縮包,buildroot 下載的源碼壓縮包都存放在/dl 目錄下,在 dl 目錄下就有一個叫做“busybox”的文件夾,此目錄下保存著 busybox 壓縮包。
在 buildroot下打開 busybox 的配置界面輸入如下命令:
- sudo make busybox-menuconfig
輸入以后就會打開 buildroot 下的 busybox 配置界面,需要什么功能,使能即可。可以在busybox中修改文件,使其對中文支持,這一點可以百度設置。
編譯完畢以后,會生成 rootfs.tar,拷貝出來以后,可以對其進行解壓然后使用nfs掛載到板子上,或者直接使用SD卡燒錄。編譯出來的文件系統即可使用,如果需要什么命令和工具,在 make menuconfig 中使能再次編譯即可。
本文轉載自微信公眾號「嵌入式Linux系統開發」,可以通過以下二維碼關注。轉載本文請聯系嵌入式Linux系統開發公眾號。