前言
根文件系统是Linux内核启动之后读取的一个文件系统,并从这个文件系统中加载第一个init应用程序并启动,就是Linux上俗称的root进程、根进程
制作它的方式有很多,例如busybox、yocto,但是这两个方式有缺点,第一个是busybox太精简了,不足以满足最新版Linux内核运行时所需的目录结构,而Yocto比较庞大,Buildroot是最合适的选择,它基于Busybox来构建根文件系统,Buildroot完善了busybox目录结构,并且支持创建用户,如果使用busybox需要我们自己来手动构建目录结构与文件体系
因为新版Linux内核启动时不单单只是需要文件系统里存在几个目录,还需要有system v的一些服务,目前4.x版本用的是systemD,如果你对内核没有足够的了解的情况下最好还是使用这些构建工具帮助我们来创建,否则你创建的根文件系统很可能无法引导Linux,就算引导起来了可能也会因为缺失某些文件而导致无法正常工作。
当然你也可以通过copy某些发行版的Linux文件结构到你的根文件系统下,不过最好还是使用一些构建工具来完成,例如你创建用户的话是需要使用Linux的加密程序与了解Linux用户存储结构才能创建用户。
制作根文件系统纯粹就是在通过文件形式来构造一个Linux系统,为内核提供用户态的体系
Buildroot与Yocto一样,它也是用来构建Linux嵌入式系统的,但与Yocto不同的是,它比较迷你、小巧,但缺点是移植包比较少,大多数情况下需要我们自己来移植包,用来构建一些小型Linux嵌入式系统比较方便,但如果真正想制作成类型Ubuntu那样的发行版还是需要使用Yocto和Debian
Buildroot是使用make来管理项目,通过make menuconfig来控制构建哪些项目,同时它也是需要从互联网下载所需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
最后在配置文件系统格式
-> 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关掉,只编译根文件系统
-> Kernel
-> [ ] Linux Kernel //不要选择编译 Linux Kernel 选项!
-> Bootloaders
-> [ ] U-Boot //不要选择编译 U-Boot 选项!
如果你想配置第三方库,可以选择Target packages
在这个里面你可以选择opencv、ffmpeg这些库,buildroot会自动编译到根文件系统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 = pkgconf
PKG_CONFIG_HOST_BINARY = $(HOST_DIR)/bin/pkg-config
将PKGCONF_SITE修改为你找到可用的地址就可用了,Buildroot会把PKGCONF_VERSION 、PKGCONF_SITE 、PKGCONF_SOURCE 组成一个完整的下载链接,注意仔细分割
如果你修改了名字,还需要修改pkgconf.hash里的名字
第二种方法就是在dl目录下创建一个包名字的目录,然后把包下载下来放进去就可以了,需要注意,包的版本名字压缩方式都需要与报错的名字一致
当下载完成之后几秒钟就完成了根文件系统的制作,根文件系统会输出到output目录下为rootfs.tar文件
同时如果你想修改busybox可以使用如下命令来设置
sudo make busybox-menuconfig