Buildroot · 根文件系统编译

花了两天研究怎么编译rootfs,今天晚上终于完工(编译出来了但是还不知道能不能用!)。ʕ •ᴥ•ʔ

rootfs全称是root filesystem,也就是根文件系统。根文件系统是Linux内核启动之时挂载的第一个文件系统。rootfs提供了根目录/、系统配置/etc和一些二进制程序/bin等等……。很明显Linux内核脱离了rootfs是无法运行的,所以如果想在嵌入式系统中运行Linux系统,制作rootfs就成为重要的工作之一。

用来制作rootfs的工具叫做Buildroot,与其说是编译根文件系统的工具,不如说是一个构建嵌入式Linux系统的框架。不仅可以编译rootfs,包括引导程序(boot)和内核(kernel)它都可以一并拿下。( ̀⌄ ́)

Buildroot is a simple, efficient and easy-to-use tool to generate embedded Linux systems through cross-compilation.

Step 1: install requirements

虽然Buildroot可以帮你自动下载和安装大部分编译所需的环境,但是你必须确保一些标准Linux实用程序已经装好了。

apt update
apt install -y git build-essential wget cpio unzip rsync bc libncurses5-dev screen

Step 2: getting buildroot

既然要用那当然首先要下载它。这个简单,点这里。无论是直接下载再解压,还是git clone都行,看你喜欢。

git clone https://git.buildroot.net/buildroot
cd buildroot/

Step 3: configure

进入buildroot的目录之后,现在要切换到一个release版本。当前最新的版本是2019.11.1。执行完之后Git告诉我现在“detached HEAD”了,不过才不管它呢(つД`)ノ

git checkout 2019.11.1

最简单的方法是用一些预设的配置,所有预设的配置可以在configs目录下找到。

Target 命令
Raspberry Pi Zero W make raspberrypi0w_defconfig
Raspberry Pi Zero make raspberrypi0_defconfig
QEMU make qemu_x86_64_defconfig

如需手动配置,则用make menuconfig打开设置菜单。对于我来说,是像下面这样。

$ make menuconfig
Target options  --->
    Target Architecture (ARM (little endian))
    Target Binary Format (ELF)
    Target Architecture Variant (arm926t)
[ ] Enable VFP extension support (NEW)
    Target ABI (EABI)
    Floating point strategy (Soft float)
    ARM instruction set (ARM)

Step 4: build

接下来就可以开始编译整个操作系统了!Buildroot让这个过程显得非常简单,但是比较花费时间(它本来就要这么长时间,不是Buildroot害的!)。而且由于在国内下载速度缓慢,我昨天花了6个小时还没有成功。ε-(´∀`; )

The best part about being an embedded Linux hacker is that your builds take hours! This gives you plenty of time to write blog posts about embedded Linux. (comic via xkcd)

编译命令很简单……但是下载是龟速的!我建议为它配置代理(设置http_proxyhttps_proxyftp_proxy这几个环境变量即可)

make

由于我配置的时候取消了kernel和u-boot,只编译rootfs,结果报错

$ make
...
>>>   Executing post-image script support/scripts/genimage.sh
INFO: cmd: "mkdir -p "/buildroot/output/build/genimage.tmp"" (stderr):
INFO: cmd: "rm -rf "/buildroot/output/build/genimage.tmp"/*" (stderr):
INFO: cmd: "mkdir -p "/buildroot/output/build/genimage.tmp"" (stderr):
INFO: cmd: "cp -a "/tmp/tmp.bwhwvBRb9L" "/buildroot/output/build/genimage.tmp/root"" (stderr):
INFO: cmd: "find '/buildroot/output/build/genimage.tmp/root' -depth -type d -printf '%P\0' | xargs -0 -I {} touch -r '/tmp/tmp.bwhwvBRb9L/{}' '/buildroot/output/build/genimage.tmp/root/{}'" (stderr):
ERROR: file(zImage): stat(/buildroot/output/images/zImage) failed: No such file or directory
ERROR: vfat(boot.vfat): could not setup zImage
Makefile:809: recipe for target 'target-post-image' failed
make: *** [target-post-image] Error 1
$

经过搜索查明原因,因为没有编译kernel所以没有zImage文件,找不到文件打包的时候就出错了。当时颇为苦恼,找了很久也没有找到解决办法。 直到我看到有人在一篇博客里写道:不用在意这些