root运行Buildroot设FORCE_UNSAFE_CONFIGURE仍报错及fakeroot编译问题
1. root环境配置变量后仍触发校验的原因
Buildroot为了保证构建环境一致性、实现可复现构建,默认会隔离宿主系统的自定义环境变量。你在终端直接执行export FORCE_UNSAFE_CONFIGURE=1设置的变量不会传递到各个软件包的configure执行环境中,因此host-tar的configure进程读取不到该配置,就会触发root运行校验,config.log里自然也不会有相关变量的记录。
2. 允许root运行Buildroot的修改方法
官方不推荐用root运行Buildroot,操作失误可能误修改宿主系统文件,导致系统故障。如果一定要用root运行,不需要修改Python源码,只需要在Buildroot源码根目录下新建local.mk文件,加入以下内容即可:
export FORCE_UNSAFE_CONFIGURE = 1
该变量会被Buildroot全局传递到所有子构建进程中,就能绕过所有软件包的root运行校验。
3. fakeroot相关说明
fakeroot是权限模拟工具,作用是让普通用户在没有真实root权限的情况下,模拟执行修改文件属主、创建设备节点、修改特殊权限等需要root权限的操作,主要用于构建根文件系统时生成符合权限要求的镜像文件。
fakeroot是Buildroot自带的依赖组件,默认会自动下载源码编译,不需要提前在Ubuntu系统中安装。
4. 非root下fakeroot编译报错的解决方案
你遇到的struct stat64 *和struct stat *类型不兼容报错,是因为你使用的2020.02.3版本Buildroot自带的fakeroot 1.20.2,和你当前运行的较新版本Ubuntu(22.04及以上)的glibc库不兼容,新版本glibc已经移除了过时的stat64相关结构体定义。
可按以下优先级选择解决方案:
- 优先升级Buildroot到2023.02及以上版本,新版本已经更新了fakeroot版本,修复了和新glibc的兼容性问题
- 如果必须使用当前2020.02.3版本,可以给host-fakeroot包添加兼容性补丁:修改fakeroot源码中所有
stat64相关的结构体和函数调用,替换为对应不带64后缀的版本(新版glibc中默认stat就是64位的),或者在fakeroot的编译参数中添加-D_FILE_OFFSET_BITS=64宏定义 - 临时测试可先在Ubuntu中执行
sudo apt install fakeroot安装系统版本的fakeroot,再进入Buildroot的menuconfig配置,找到Host utilities下的fakeroot选项,勾选使用系统提供的fakeroot,跳过源码编译步骤,该方法可能存在其他兼容性风险,仅推荐临时验证使用。
内容的提问来源于stack exchange,提问作者user786

