通过Buildroot自制根文件系统
前言
根文件系統(tǒng)是Linux內核啟動之后讀取的一個文件系統(tǒng),并從這個文件系統(tǒng)中加載第一個init應用程序并啟動,就是Linux上俗稱的root進程、根進程
制作它的方式有很多,例如busybox、yocto,但是這兩個方式有缺點,第一個是busybox太精簡了,不足以滿足最新版Linux內核運行時所需的目錄結構,而Yocto比較龐大,Buildroot是最合適的選擇,它基于Busybox來構建根文件系統(tǒng),Buildroot完善了busybox目錄結構,并且支持創(chuàng)建用戶,如果使用busybox需要我們自己來手動構建目錄結構與文件體系
因為新版Linux內核啟動時不單單只是需要文件系統(tǒng)里存在幾個目錄,還需要有system v的一些服務,目前4.x版本用的是systemD,如果你對內核沒有足夠的了解的情況下最好還是使用這些構建工具幫助我們來創(chuàng)建,否則你創(chuàng)建的根文件系統(tǒng)很可能無法引導Linux,就算引導起來了可能也會因為缺失某些文件而導致無法正常工作。
當然你也可以通過copy某些發(fā)行版的Linux文件結構到你的根文件系統(tǒng)下,不過最好還是使用一些構建工具來完成,例如你創(chuàng)建用戶的話是需要使用Linux的加密程序與了解Linux用戶存儲結構才能創(chuàng)建用戶。
制作根文件系統(tǒng)純粹就是在通過文件形式來構造一個Linux系統(tǒng),為內核提供用戶態(tài)的體系
Buildroot與Yocto一樣,它也是用來構建Linux嵌入式系統(tǒng)的,但與Yocto不同的是,它比較迷你、小巧,但缺點是移植包比較少,大多數情況下需要我們自己來移植包,用來構建一些小型Linux嵌入式系統(tǒng)比較方便,但如果真正想制作成類型Ubuntu那樣的發(fā)行版還是需要使用Yocto和Debian
Buildroot是使用make來管理項目,通過make menuconfig來控制構建哪些項目,同時它也是需要從互聯(lián)網下載所需tools的,但是不同的是它不會向Yocto那樣需要個七八十G的內存,所以Buildroot是比較小巧的項目,但可以通過基于Buildroot來定制化你自己的構建項目。
獲取源碼
官網下載地址:https://buildroot.org/
github下載地址:https://github.com/buildroot/buildroot
開始制作
將源代碼下載下來之后,Buildroot移植Linux內核上的menuconfig,使用與Linux一樣的配置命令:make menuconfig進入配置界面來對它進行配置
首先選擇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然后選擇Toolchian
Toolchain-> Toolchain type = External toolchain //使用用戶自己的編譯器-> Toolchain = Custom toolchain //使用自定義工具鏈-> Toolchain origin = Pre-installed toolchain //預裝的編譯器-> Toolchain path = /home/zhihao/arm/bin //編譯器絕對路徑-> Toolchain prefix = $(ARCH)-linux-gnueabihf //編譯器前綴-> External toolchain gcc version = 8.x //編譯器版本,需要與你編譯器版本對上-> External toolchain kernel headers series = 4.1.x //外部工具鏈內核標頭,你可以在編譯器arm-buildroot-linux-gnueabihf/sysroot/usr/include/linux/version.h目錄下找到它的值,是十六進制的,需要轉換-> External toolchain C library = glibc/eglibc //選擇嵌入式gcc庫-> [*] Toolchain has SSP support? (NEW) //選中-> [*] Toolchain has RPC support? (NEW) //選中-> [*] Toolchain has C++ support? //選中-> [*] Enable MMU support (NEW) //選中然后在選擇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最后在配置文件系統(tǒng)格式
-> 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最后在將內核、bootload關掉,只編譯根文件系統(tǒng)
-> Kernel-> [ ] Linux Kernel //不要選擇編譯 Linux Kernel 選項!-> Bootloaders-> [ ] U-Boot //不要選擇編譯 U-Boot 選項!如果你想配置第三方庫,可以選擇Target packages
在這個里面你可以選擇opencv、ffmpeg這些庫,buildroot會自動編譯到根文件系統(tǒng)lib目錄下
配置完成之后直接make即可開始編譯
make在make期間可能會出現下載404的問題
或者一直卡在下載處Time out的問題,這個原因是因為Buildroot里的鏈接可能失效了,又或者你無法科學上網的原因導致的
有兩種解決方案,你可以先跟著報錯包的名字到github上去找release版本或者去官網找,找到下載地址以后進入到package目錄下,然后進入到包名字的目錄,里面有一個包名字.mk的文件,打開它可以看到如下內容:
PKGCONF_VERSION = 1.6.3 PKGCONF_SITE = https://github.com/pkgconf/pkgconf/archive/refs/tags PKGCONF_SOURCE = pkgconf-$(PKGCONF_VERSION).tar.gz PKGCONF_LICENSE = pkgconf license PKGCONF_LICENSE_FILES = COPYING PKGCONF_CPE_ID_VENDOR = pkgconfPKG_CONFIG_HOST_BINARY = $(HOST_DIR)/bin/pkg-config將PKGCONF_SITE修改為你找到可用的地址就可用了,Buildroot會把PKGCONF_VERSION 、PKGCONF_SITE 、PKGCONF_SOURCE 組成一個完整的下載鏈接,注意仔細分割
如果你修改了名字,還需要修改pkgconf.hash里的名字
第二種方法就是在dl目錄下創(chuàng)建一個包名字的目錄,然后把包下載下來放進去就可以了,需要注意,包的版本名字壓縮方式都需要與報錯的名字一致
當下載完成之后幾秒鐘就完成了根文件系統(tǒng)的制作,根文件系統(tǒng)會輸出到output目錄下為rootfs.tar文件
同時如果你想修改busybox可以使用如下命令來設置
sudo make busybox-menuconfig總結
以上是生活随笔為你收集整理的通过Buildroot自制根文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: this指针的作用和用法
- 下一篇: 机器学习中关于偏差、方差和误差的理解