Buildroot
源代码
主要
http://git.buildroot.net/buildroot/
https://git.busybox.net/buildroot/
备用
https://github.com/buildroot/buildroot.git
说明
这是一个强大的嵌入式Linux系统构建工具,可一键构建嵌入式Linux。
buildroot可直接构建嵌入式Linux开发的各种工具,不用为编译环境的配置而烦恼。
常用编译命令参数如下:
项目 | 类型 | 说明 | 备注 |
---|---|---|---|
menuconfig | Makefile目标 | 使用菜单配置buildroot | 通常需要先导入某个默认配置再使用菜单配置。
注意若在编译完成后变更了配置(尤其是增加了配置),最好使用 |
busybox-menuconfig | Makefile目标 | 使用菜单配置busybox | |
linux-menuconfig | Makefile目标 | 使用菜单配置Linux | |
source | Makefile目标 | 下载构建所需源代码 | 一般用于网不好时预先下载源代码,使用此目标可较快获取缺失的源代码 |
V | 环境变量/Makefile变量 | 指定打印的级别,0 => quiet build, 1 => verbose build |
个人使用场景
- 为LicheePi-Zero(基于全志V3S芯片)构建内核。
Qemu测试
buildroot预置大量Qemu defconfig配置文件,使用这些配置可方便使用Qemu测试Linux内核、根文件系统、应用程序等。
在buildroot编译时可采用make defconfig配置文件
,截止编辑时具体支持的Qemu defconfig配置文件列表如下:
- qemu_aarch64_ebbr_defconfig
- qemu_aarch64_sbsa_defconfig
- qemu_aarch64_virt_defconfig
- qemu_arm_ebbr_defconfig
- qemu_arm_versatile_defconfig
- qemu_arm_vexpress_defconfig
- qemu_arm_vexpress_tz_defconfig
- qemu_m68k_mcf5208_defconfig
- qemu_m68k_q800_defconfig
- qemu_microblazebe_mmu_defconfig
- qemu_microblazeel_mmu_defconfig
- qemu_mips32r2el_malta_defconfig
- qemu_mips32r2_malta_defconfig
- qemu_mips32r6el_malta_defconfig
- qemu_mips32r6_malta_defconfig
- qemu_mips64el_malta_defconfig
- qemu_mips64_malta_defconfig
- qemu_mips64r6el_malta_defconfig
- qemu_mips64r6_malta_defconfig
- qemu_nios2_10m50_defconfig
- qemu_or1k_defconfig
- qemu_ppc64_e5500_defconfig
- qemu_ppc64le_powernv8_defconfig
- qemu_ppc64le_pseries_defconfig
- qemu_ppc64_pseries_defconfig
- qemu_ppc_bamboo_defconfig
- qemu_ppc_e500mc_defconfig
- qemu_ppc_g3beige_defconfig
- qemu_ppc_mac99_defconfig
- qemu_ppc_mpc8544ds_defconfig
- qemu_riscv32_virt_defconfig
- qemu_riscv64_nommu_virt_defconfig
- qemu_riscv64_virt_defconfig
- qemu_s390x_defconfig
- qemu_sh4eb_r2d_defconfig
- qemu_sh4_r2d_defconfig
- qemu_sparc64_sun4u_defconfig
- qemu_sparc_ss10_defconfig
- qemu_x86_64_defconfig
- qemu_x86_defconfig
- qemu_xtensa_lx60_defconfig
- qemu_xtensa_lx60_nommu_defconfig
buildroot编译完后镜像将在将在output/images/中目录,可使用start-qemu.sh启动Qemu。
对于绝大多数用户应用程序而言,跟特定硬件的关联并不高,因此Qemu测试的根文件系统其实可以直接应用于真机,只是需要注意清理与内核相关的目录,如/lib/modules。
使用9p文件系统作为根目录
使用9p文件系统+virtio可用作宿主机到客户机(虚拟机内部)的文件共享。
当使用9p文件系统作为根文件系统时就可把宿主机的目录用作虚拟机的根目录,这样就不用频繁生成镜像,直接修改目录即可。
要实现9p文件系统作为根文件系统,需要以下条件:
- Linux内核启用了9p文件系统+virtio支持。
- Qemu添加相应设备:在Qemu命令参数中添加
-fsdev local,security_model=passthrough,id=fsdev-fsRoot,path=`pwd`/root/ -device virtio-9p-pci,id=fsRoot,fsdev=fsdev-fsRoot,mount_tag=fsRoot
其中fsdev的path选项就是要共享的目录。 - Linux内核命令行中添加9p文件系统的root挂载:
root=fsRoot rw rootfstype=9p rootflags=trans=virtio,version=9p2000.L,msize=5000000,cache=mmap,posixacl
注意:虚拟机内部操作系统的权限同执行Qemu程序的宿主机用户权限相同,如需根文件系统可写,则需确保用户对共享的目录可写(或者粗暴地使用root用户执行qemu程序)。
参考资料
笔记
构建技巧
保存下载的文件
默认情况下,buidlroot编译过程中的文件保存在dl目录中,若使用软链接将此下载目录软链接到其它目录,则可实现下载文件的保留(make distclean
只会删除dl目录,当dl目录为软链接时,只会删除dl软链接)。
当构建一个新的buildroot时,可在make前将之前保存的目录软链接到dl,则可节省部分下载文件的时间。
使用ZRAM加速构建
对于Linux而言,zram是一个内存优化技术,通常配合swap优化内存性能。
但实际上,zram是一个块设备,同拥有与其它块设备(如磁盘)几乎相同的属性,也可当作根文件系统(第二阶段,可从initrd移交控制权到zram),它将压缩的磁盘数据存储在内存中,完全可作为内存磁盘使用(断电后数据消失)。
在buildroot的构建过程中,经常遇到重新构建的情况下,下载的文件可使用对dl目录进行软链接保存,但构建的过程不可省略。
对于基于Autotools框架的软件而言,make的过程可使用多线程加速,而configure的过程却只能使用单线程。
使用zram加速构建可在内存在32G及以上的机器上使用(内存太小不能使用内存盘),zram可通过提高磁盘io速率大大加快configure过程减小物理磁盘(特别是SSD)磨损。
zram需要格式化才能使用,格式化的过程如下:
- 获取zram设备,使用
sudo zramctl -f
寻找一个空闲设备,若未找到设备,可使用sudo modprobe zram
加载zram模块,若加载后仍然找不空闲设备,则zram已被占用或者不支持zram。 - 设置zram设备的大小,使用
sudo zramctl -s 大小 设备名
,大小可带单位如20G,设备名使用找到的空闲zram。 - 使用格式化工具格式化zram。同其它块设备的格式化类似,本人使用
sudo mkfs.ext4 设备名
,格式化设备为ext4文件系统。
格式化zram就可以当作普通块设备使用,使用mount命令将zram设备挂载设备到某个目录(注意目录权限问题),将buildroot的所有文件复制到该目录然后构建(可配合保存下载的文件使用)。
同SSD一样,当zram设备使用较长时间后,会产生部分垃圾,可使用sudo fstrim 目录
释放文件系统未使用的内存,其中目录为zram设备挂载的目录,也可使用sudo fstrim -a
回收所有挂载的设备的未使用块。
如果不想频繁复制文件,可使用OverlayFS将对构建目录的写入放在zram上。
Kconfig操作
buildroot可使用Kconfig配置相关功能,通常使用make menuconfig
命令使用菜单方式配置。
配置Locales
通常将Locales配置为中文简体(zh_CN)且启用翻译支持。
KConfig选项 | 操作 |
---|---|
BR2_ENABLE_LOCALE_WHITELIST | 添加zh_CN |
BR2_GENERATE_LOCALE | 设置为zh_CN |
BR2_SYSTEM_ENABLE_NLS | 启用此选项 |
配置timezone
通常将时区配置为Asia/Shanghai
KConfig选项 | 操作 |
---|---|
BR2_TARGET_TZ_INFO | 启用此选项 |
BR2_TARGET_LOCALTIME | 设置为Asia/Shanghai |