Buildroot 扩展文件系统大小

在Ubuntu 16.04上使用Buildroot-2021.02构建根文件系统时,遇到因文件系统大小限制导致的编译错误。通过增大BR2_TARGET_ROOTFS_EXT2_SIZE配置选项至256M,成功解决了因加入OPENJDK导致的根文件系统超出指定镜像大小的问题。调整后,根文件系统创建完成,且镜像大小为256M。

平台

 Ubuntu 16.04 + Buildroot-2021.02

问题

mkdir -p /home/anson/codes/buildroot-2021.02/output/images
rm -rf /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2
mkdir -p /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2
rsync -auH --exclude=/THIS_IS_NOT_YOUR_ROOT_FILESYSTEM /home/anson/codes/buildroot-2021.02/output/target/ /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2/target
echo '#!/bin/sh' > /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2/fakeroot
echo "set -e" >> /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2/fakeroot
echo "chown -h -R 0:0 /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2/target" >> /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2/fakeroot
PATH="/home/anson/codes/buildroot-2021.02/output/host/bin:/home/anson/codes/buildroot-2021.02/output/host/sbin:/home/anson/bin:/home/anson/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin" /home/anson/codes/buildroot-2021.02/support/scripts/mkusers /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/full_users_table.txt /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2/target >> /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2/fakeroot
echo "/home/anson/codes/buildroot-2021.02/output/host/bin/makedevs -d /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/full_devices_table.txt /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2/target" >> /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2/fakeroot
printf '   \n' >> /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2/fakeroot
printf '   \n' >> /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2/fakeroot
printf '   	rm -f /home/anson/codes/buildroot-2021.02/output/images/rootfs.ext2\n	/home/anson/codes/buildroot-2021.02/output/host/sbin/mkfs.ext2 -d /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2/target -r 1 -N 0 -m 5 -L "rootfs" -O ^64bit /home/anson/codes/buildroot-2021.02/output/images/rootfs.ext2 "64M" || { ret=$?; echo "*** Maybe you need to increase the filesystem size (BR2_TARGET_ROOTFS_EXT2_SIZE)" 1>&2; exit $ret; }\n' >> /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2/fakeroot
chmod a+x /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2/fakeroot
PATH="/home/anson/codes/buildroot-2021.02/output/host/bin:/home/anson/codes/buildroot-2021.02/output/host/sbin:/home/anson/bin:/home/anson/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin" FAKEROOTDONTTRYCHOWN=1 /home/anson/codes/buildroot-2021.02/output/host/bin/fakeroot -- /home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2/fakeroot
rootdir=/home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/ext2/target
table='/home/anson/codes/buildroot-2021.02/output/build/buildroot-fs/full_devices_table.txt'
mke2fs 1.45.6 (20-Mar-2020)
Creating regular file /home/anson/codes/buildroot-2021.02/output/images/rootfs.ext2
Creating filesystem with 65536 1k blocks and 16384 inodes
Filesystem UUID: 7882b549-c37b-4741-9546-c893e7457164
Superblock backups stored on blocks: 
	8193, 24577, 40961, 57345

Allocating group tables: done                            
Writing inode tables: done                            
Copying files into the device: __populate_fs: Could not allocate block in ext2 filesystem while writing file "modules"
mkfs.ext2: Could not allocate block in ext2 filesystem while populating file system
*** Maybe you need to increase the filesystem size (BR2_TARGET_ROOTFS_EXT2_SIZE)
fs/ext2/ext2.mk:46: recipe for target '/home/anson/codes/buildroot-2021.02/output/images/rootfs.ext2' failed
make[1]: *** [/home/anson/codes/buildroot-2021.02/output/images/rootfs.ext2] Error 1
Makefile:84: recipe for target '_all' failed
make: *** [_all] Error 2

 前面的编译过程没有的报错, 所以基本判断可以从Maybe you need to increase the filesystem size (BR2_TARGET_ROOTFS_EXT2_SIZE)

解决

 查看当前配置(.config):

BR2_TARGET_ROOTFS_EXT2_SIZE="64M"

 改为:

BR2_TARGET_ROOTFS_EXT2_SIZE="256M"

 产生这个问题的原因是尝试加入了OPENJDK的环境导致系统文件增加(rootfs.ext2), 最终超出了指定的镜像文件大小.

 修改后:

~/codes/buildroot-2021.02$ ls -lh output/images/
total 128M
-rw-r--r-- 1 anson anson 256M 7月  16 14:04 rootfs.ext2
-rwxr-xr-x 1 anson anson  477 7月  16 14:01 start-qemu.sh
-rwxr-xr-x 1 anson anson  14K 7月  16 12:03 vexpress-v2p-ca9.dtb
-rw-r--r-- 1 anson anson 4.7M 7月  16 12:03 zImage
<think>好的,我现在要帮助用户解决在Buildroot生成的最小根文件系统中集成systemd并启用systemctl功能的问题。首先,我需要回顾一下Buildroot的基本配置流程。用户提到他们使用的是最小根文件系统,可能基于BusyBox,但想切换到systemd。根据引用[1],Buildroot的基础配置应该尽可能简单,只包含必要的包,比如BusyBox。所以,用户需要调整配置来选择systemd而不是默认的init系统。 首先,我需要确定Buildroot是否支持systemd。是的,Buildroot确实支持systemd作为init系统,但可能需要额外的配置和依赖包。接下来,用户需要进入配置界面,找到Init system的选项,将默认的BusyBox改为systemd。这通常位于“System configuration”菜单下。 然后,启用systemd可能需要其他包的依赖。例如,systemd需要dbus和某些工具链的支持。用户需要确保这些依赖包也被选中。此外,可能需要调整内核配置,确保支持cgroups和其他systemd需要的特性。引用[2]提到了如何添加Linux扩展,虽然这里可能不直接相关,但了解如何添加自定义配置是有帮助的,比如可能需要修改内核配置或添加特定的包。 另外,用户可能需要处理文件系统的调整,因为systemd会安装更多的服务和文件。需要检查文件系统大小是否足够,并且必要的目录结构存在。引用[3]提到从外部媒体更新系统的情况,虽然不直接相关,但确保系统更新后systemd能正确启动也很重要。 还有可能遇到的问题是,某些Buildroot的默认配置可能和systemd冲突,比如BusyBox的一些工具可能与systemd的工具重复,需要排除BusyBox的相关组件。例如,禁用BusyBox的init和日志守护进程,让systemd接管。 最后,生成镜像后,测试systemctl是否正常工作,可能需要启动一些服务来验证。如果出现问题,检查日志和依赖项是否正确安装,或者是否有缺失的配置选项。</think>在Buildroot中集成systemd并启用systemctl功能需要完成以下关键步骤: ### 一、基础配置调整 1. 执行`make menuconfig`进入配置界面 2. 定位路径: ``` System configuration -> Init system (选择systemd) -> /dev management (选择Dynamic using systemd) ``` 3. 开启必要依赖: ``` Target packages -> System tools -> systemd (选中) -> dbus (自动依赖) -> udev (推荐选择systemd自带的实现) ``` ### 二、内核配置要求 需确保内核包含以下特性支持: $$ CONFIG_CGROUPS=y $$ $$ CONFIG_DEVTMPFS=y $$ $$ CONFIG_EPOLL=y $$ $$ CONFIG_SIGNALFD=y $$ $$ CONFIG_TIMERFD=y $$ 可通过`make linux-menuconfig`验证内核配置[^1] ### 三、文件系统定制 1. 禁用BusyBox相关组件: ``` System configuration -> BusyBox配置 -> Init utilities (取消选择init和halt等命令) -> Linux System Utilities (取消选择kill和mount等命令) ``` 2. 添加systemd服务单元: ```makefile # 在post-build脚本中添加 echo "Creating systemd service links..." ln -sf /usr/lib/systemd/system/getty@.service $(TARGET_DIR)/etc/systemd/system/getty.target.wants/getty@tty1.service ``` ### 四、常见问题处理 | 现象 | 解决方案 | |-------|---------| | 启动卡在"Welcome to Buildroot" | 检查内核是否启用cgroups支持[^2] | | systemctl命令不存在 | 确认systemd包已选中且编译通过 | | 服务启动失败 | 检查`/var/log/journal/`日志目录权限 | ### 五、验证流程 1. 编译完成后执行: ```bash file output/target/sbin/init # 应显示systemd的ELF信息 ``` 2. 在目标系统执行: ```bash systemctl --version # 应显示systemd版本信息 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值