i.MX95 Yocto BSP 构建指南 · Docker 容器篇
# i.MX95 Yocto BSP 构建指南 · Docker 容器篇**版本**:LF6.18.2-1.0.0 | Yocto 5.3 Whinlatter
**目标平台**:imx95-15x15-lpddr4x-frdm
**宿主环境**:Docker Engine on Ubuntu 22.04 LTS / Windows / macOS
**官方仓库**:https://github.com/nxp-imx/imx-docker
---
◆
## 概述
NXP 官方维护 `<span leaf="">imx-docker</span>` 仓库,提供开箱即用的 Dockerfile 与构建脚本,用于在 Docker 容器内执行 i.MX Yocto BSP 构建。该方案将 Yocto 所需的全部依赖、工具链及配置封装在镜像内,通过 Volume 挂载将源码、下载包、缓存及构建产物持久化至宿主机,实现环境隔离与数据复用。
与裸机构建相比,Docker 方案的核心差异在于**数据持久化策略**。容器销毁后内部数据全部丢失,必须通过 Volume 将 `<span leaf="">DL_DIR</span>`、`<span leaf="">SSTATE_DIR</span>`、源码目录及构建输出挂载到宿主机。同时,容器内用户需与宿主机用户 UID/GID 匹配,以避免构建产物在宿主机上出现权限混乱。
**前置条件**:宿主机磁盘剩余空间不低于 400 GB;Docker Engine 已安装且守护进程正常运行。
---
◆
## 一、Docker 宿主机准备
### 1.1 安装 Docker Engine
Ubuntu 22.04 安装 Docker:
```
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
验证安装:
```
docker --version
docker run hello-world
```
### 1.2 配置国内镜像加速(可选)
国内网络环境下,Docker Hub 拉取基础镜像缓慢。在 `<span leaf="">/etc/docker/daemon.json</span>` 中配置镜像加速:
```
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
```
重启 Docker 守护进程:
```
sudo systemctl restart docker
```
### 1.3 将当前用户加入 docker 组
避免每次执行 `<span leaf="">docker</span>` 命令均需 `<span leaf="">sudo</span>`:
```
sudo usermod -aG docker $USER
newgrp docker
```
---
◆
## 二、克隆 imx-docker 仓库
NXP 官方仓库地址:
```
cd ~
git clone https://github.com/nxp-imx/imx-docker.git
cd imx-docker
```
仓库结构:
```
.
├── Dockerfile-Ubuntu-18.04
├── Dockerfile-Ubuntu-20.04
├── Dockerfile-Ubuntu-22.04
├── README.md
├── docker-build.sh
├── docker-run.sh
├── env.sh -> imx-6.6.3-1.0.0/env.sh
└── imx-6.6.3-1.0.0
├── env.sh
└── yocto-build.sh
```
> 注:`<span leaf="">env.sh</span>` 为符号链接,指向对应 BSP 版本的目录。后续需根据实际 i.MX95 版本调整。
---
◆
## 三、配置构建环境变量
imx-docker 使用 `<span leaf="">env.sh</span>` 定义构建参数。在仓库根目录编辑或创建 `<span leaf="">env.sh</span>`:
```
cd ~/imx-docker
# 若 env.sh 指向旧版本,重新链接到当前工作目录
cp imx-6.6.3-1.0.0/env.sh env.sh
vim env.sh
```
关键变量说明:
| 变量 | 说明 | 建议值 |
| ------------------------------------------- | ------------------ | ------------------------------------------------------------------------------------- |
| `DOCKER_WORKDIR` | 宿主机主工作目录 | `/mnt/yocto-disk`或`~/yocto-disk` |
| `IMX_RELEASE` | BSP 版本目录名 | `imx-6.18.2-1.0.0`(根据实际版本调整) |
| `USER` | 宿主机用户名 | 自动检测 |
| `HOME` | 宿主机 home 目录 | 自动检测 |
`<span leaf="">env.sh</span>` 示例:
```
export DOCKER_WORKDIR=/mnt/yocto-disk
export IMX_RELEASE=imx-6.18.2-1.0.0
export USER=$(whoami)
export HOME=$HOME
```
确保 `<span leaf="">DOCKER_WORKDIR</span>` 所在分区剩余空间不低于 400 GB,且目录归属当前用户:
```
mkdir -p /mnt/yocto-disk
sudo chown $(id -u):$(id -g) /mnt/yocto-disk
```
---
◆
## 四、构建 Docker 镜像
imx-docker 提供 `<span leaf="">docker-build.sh</span>` 脚本,根据指定的 Dockerfile 自动构建镜像。脚本内部会处理 UID/GID 匹配,确保容器内用户与宿主机一致。
### 4.1 使用官方 Dockerfile-Ubuntu-22.04
```
cd ~/imx-docker
./docker-build.sh Dockerfile-Ubuntu-22.04
```
脚本执行流程:
1. 读取 `<span leaf="">env.sh</span>` 获取环境变量
2. 检测宿主机 UID/GID,作为构建参数传入 Dockerfile
3. 构建镜像并打标签,格式为 `<span leaf="">imx-yocto-<os>:<version></span>`
构建完成后验证:
```
docker images | grep imx-yocto
```
### 4.2 Dockerfile 说明(可选阅读)
`<span leaf="">Dockerfile-Ubuntu-22.04</span>` 内容概要:
* 基础镜像:`<span leaf="">ubuntu:22.04</span>`
* 预装 Yocto 构建所需的全部依赖包(与裸机 Ubuntu 一致)
* 配置 `<span leaf="">en_US.UTF-8</span>` locale
* 安装 repo 工具至 `<span leaf="">/usr/local/bin/repo</span>`
* 创建与宿主机 UID/GID 一致的用户,避免 Volume 挂载后权限混乱
* 设置文件描述符上限 `<span leaf="">ulimit -n 65536</span>`
无需手动修改 Dockerfile,除非需要添加自定义依赖或更换 repo 下载源。
---
◆
## 五、数据卷规划
`<span leaf="">docker-run.sh</span>` 启动容器时会自动挂载以下 Volume:
| 宿主机路径 | 容器内路径 | 用途 |
| ------------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------- |
| `${DOCKER_WORKDIR}` | `/workdir` | 主工作区,存放源码、构建目录 |
| `${DOCKER_WORKDIR}/${IMX_RELEASE}` | `/workdir/${IMX_RELEASE}` | Yocto 构建脚本与配置 |
| `${HOME}` | `/home/${USER}` | 用户主目录,用于 SSH 密钥、git 配置、代理脚本等 |
> 容器内构建目录(`<span leaf="">TMPDIR</span>`)位于 `<span leaf="">/workdir/.../build-*/tmp</span>`,处于容器 Overlay 文件系统内,不单独挂载到宿主机。Yocto 编译对随机 I/O 性能敏感,Overlay 的性能优于通过 volume 挂载的 bind mount。
在宿主机预先创建目录:
```
mkdir -p /mnt/yocto-disk/imx-6.18.2-1.0.0
```
---
◆
## 六、运行容器并执行构建
### 6.1 使用 docker-run.sh 启动容器
`<span leaf="">docker-run.sh</span>` 封装了容器启动参数,包括 Volume 挂载、网络模式、特权模式及环境变量传递:
```
cd ~/imx-docker
./docker-run.sh
```
脚本内部等价于:
```
docker run -itd \
--name imx-yocto-build \
--hostname yocto-builder \
--privileged \
--network host \
-v ${DOCKER_WORKDIR}:/workdir \
-v ${DOCKER_WORKDIR}/${IMX_RELEASE}:/workdir/${IMX_RELEASE} \
-v ${HOME}:/home/${USER} \
-e USER=${USER} \
-e HOME=/home/${USER} \
imx-yocto-ubuntu-22.04:latest \
/bin/bash
```
参数说明:
* `<span leaf="">--privileged</span>`:Yocto 生成 WIC 镜像时需要挂载 loop 设备,必须开启特权模式
* `<span leaf="">--network host</span>`:容器直接使用宿主机网络栈,代理配置与裸机一致
* `<span leaf="">-v</span>`:按官方策略挂载三个目录
### 6.2 进入容器
```
docker exec -it imx-yocto-build /bin/bash
```
进入后提示符显示为 `<span leaf="">yocto@yocto-builder:/workdir$</span>`(或 Dockerfile 中定义的用户名)。
### 6.3 容器生命周期管理
| 操作 | 命令 |
| ---------- | ---------------------------------------------------------------------- |
| 停止容器 | `docker stop imx-yocto-build` |
| 启动容器 | `docker start imx-yocto-build` |
| 重新进入 | `docker exec -it imx-yocto-build /bin/bash` |
| 删除容器 | `docker rm -f imx-yocto-build` |
| 查看日志 | `docker logs imx-yocto-build` |
构建过程中不建议删除容器,否则容器内未保存至 volume 的数据(如 `<span leaf="">TMPDIR</span>` 中的中间文件)将丢失。
---
◆
## 七、Repo 工具与代码同步
### 7.1 Repo 安装
容器镜像构建时已预装 repo 工具至 `<span leaf="">/usr/local/bin/repo</span>`。若需更新或重新安装,提供三个源:
**方案一:清华大学开源软件镜像站(国内网络推荐)**
```
curl -o /usr/local/bin/repo https://mirrors.tuna.tsinghua.edu.cn/git/git-repo
chmod a+x /usr/local/bin/repo
repo --version # >= v2.52
```
**方案二:中国科学技术大学镜像站(国内网络备选)**
```
curl -o /usr/local/bin/repo https://mirrors.ustc.edu.cn/git/git-repo
chmod a+x /usr/local/bin/repo
repo --version
```
**方案三:Google 官方源(海外网络或代理通畅时使用)**
```
curl -o /usr/local/bin/repo https://gerrit.googlesource.com/git-repo/repo
chmod a+x /usr/local/bin/repo
repo --version
```
> 国内网络环境下,若直接访问 Google 源,大概率出现 `<span leaf="">Connection timed out</span>`。建议先测试 `<span leaf="">curl -I https://gerrit.googlesource.com</span>`,若返回正常再选用方案三。
### 7.2 仓库初始化与同步
在容器内执行,工作目录位于 Volume 挂载点 `<span leaf="">/workdir</span>`,数据持久化至宿主机:
```
cd /workdir
# 国内网络(清华大学镜像)
repo init \
--repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo \
-u https://github.com/nxp-imx/imx-manifest \
-b imx-linux-whinlatter \
-m imx-6.18.2-1.0.0.xml
# 国内网络(中科大镜像)
# repo init \
# --repo-url=https://mirrors.ustc.edu.cn/git/git-repo \
# -u https://github.com/nxp-imx/imx-manifest \
# -b imx-linux-whinlatter \
# -m imx-6.18.2-1.0.0.xml
# 海外网络(Google 官方源)
# repo init \
# --repo-url=https://gerrit.googlesource.com/git-repo \
# -u https://github.com/nxp-imx/imx-manifest \
# -b imx-linux-whinlatter \
# -m imx-6.18.2-1.0.0.xml
```
参数说明:
* `<span leaf="">--repo-url</span>`:repo 工具本身的下载源,需与 7.1 节选用的安装源保持一致
* `<span leaf="">-u https://github.com/nxp-imx/imx-manifest</span>`:NXP i.MX 官方 manifest 仓库地址
* `<span leaf="">-b imx-linux-whinlatter</span>`:Yocto 5.3 Whinlatter 分支
* `<span leaf="">-m imx-6.18.2-1.0.0.xml</span>`:BSP LF6.18.2-1.0.0 版本 manifest 文件
执行代码同步:
```
repo sync -c -j$(nproc) # 网络不稳时降至 -j2
```
---
◆
## 八、构建环境初始化
`<span leaf="">repo sync</span>` 完成后,进入 BSP 根目录并执行 NXP 特有的环境初始化脚本 `<span leaf="">imx-setup-release.sh</span>`:
```
cd /workdir/imx-yocto-bsp
MACHINE=imx95-15x15-lpddr4x-frdm DISTRO=fsl-imx-xwayland \
source imx-setup-release.sh -b build-imx95-xwayland-15x15-lpddr4x-frdm
```
参数说明:
* `<span leaf="">MACHINE=imx95-15x15-lpddr4x-frdm</span>`:目标硬件平台,对应 FRDM-IMX95 开发板
* `<span leaf="">DISTRO=fsl-imx-xwayland</span>`:发行版配置,启用 XWayland 图形栈
* `<span leaf="">-b build-imx95-xwayland-15x15-lpddr4x-frdm</span>`:指定构建输出目录名
执行后提示符将显示 `<span leaf="">$</span>`,表示已进入 BitBake 构建环境。
**注意**:每次新开终端或重新进入容器,均需重新执行上述 `<span leaf="">source</span>` 命令进入构建环境,否则 `<span leaf="">bitbake</span>` 命令不可用。
---
◆
## 九、代理环境配置
### 9.1 网络访问现状
Yocto 构建需访问的外部仓库及其国内可用性:
* `<span leaf="">github.com</span>`:大量软件包源码,国内访问受限
* `<span leaf="">android.googlesource.com</span>`:`<span leaf="">gfxstream</span>` 等组件依赖
* `<span leaf="">gitlab.freedesktop.org</span>`:`<span leaf="">shared-mime-info</span>` 等包
* `<span leaf="">crates.io</span>`:Rust 生态 crate 仓库,下载量大且速度慢
直接全局代理会导致 Yocto 官方镜像源(`<span leaf="">mirrors.edge.kernel.org</span>`、`<span leaf="">ftpmirror.gnu.org</span>`)SSL 握手异常。应采用**分流代理**:外部受限源走代理,官方镜像源直接连接。
### 9.2 代理工具
本地部署 Xray 作为代理入口,监听:
* HTTP 代理:`<span leaf="">127.0.0.1:7890</span>`
* SOCKS5 代理:`<span leaf="">127.0.0.1:1080</span>`
针对 Yocto 构建场景整理的开源配置(含 `<span leaf="">xray-config.json</span>`、`<span leaf="">proxy.sh</span>` 管理脚本及优化 `<span leaf="">no_proxy</span>` 绕过列表):
**https://github.com/fafactx/vpn-for-yocto**
建议克隆至宿主机 `<span leaf="">~/yocto-disk/vpn-for-yocto</span>`(已通过 Volume 挂载至容器内 `<span leaf="">/home/${USER}/yocto-disk/vpn-for-yocto</span>`):
```
cd ~
git clone https://github.com/fafactx/vpn-for-yocto.git
```
### 9.3 启动与验证
在容器内执行:
```
cd /home/${USER}/yocto-disk/vpn-for-yocto
./proxy.sh start
./proxy.sh test
```
手动验证:
```
curl -I --connect-timeout 15 -x http://127.0.0.1:7890 https://github.com
curl -I --connect-timeout 15 -x http://127.0.0.1:7890 https://android.googlesource.com
```
确认返回 HTTP 200 后再进入构建阶段。
### 9.4 构建环境变量
进入 Yocto 构建环境后导出代理变量:
```
cd /workdir/imx-yocto-bsp
MACHINE=imx95-15x15-lpddr4x-frdm DISTRO=fsl-imx-xwayland \
source imx-setup-release.sh -b build-imx95-xwayland-15x15-lpddr4x-frdm
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890
export no_proxy="localhost,127.0.0.1,.local,.internal,192.168.0.0/16,10.0.0.0/8,*.tuna.tsinghua.edu.cn,mirrors.edge.kernel.org,ftpmirror.gnu.org,*.yoctoproject.org"
export NO_PROXY="${no_proxy}"
```
`<span leaf="">no_proxy</span>` 必须包含 `<span leaf="">mirrors.edge.kernel.org</span>` 及 `<span leaf="">*.yoctoproject.org</span>`。遗漏将导致构建过程中出现 `<span leaf="">OpenSSL: error:0A000126:SSL routines::unexpected eof while reading</span>` 错误,该错误与网络代理相关,而非源码本身问题。
### 9.5 Fetch 工作流(分阶段迭代)
不建议直接执行 `<span leaf="">bitbake imx-image-full</span>` 启动完整构建。应先通过多轮迭代将全部源码包 fetch 至本地,确认无网络缺失后再进入编译阶段。
**第一轮:无代理摸底**
```
cd /workdir/imx-yocto-bsp
MACHINE=imx95-15x15-lpddr4x-frdm DISTRO=fsl-imx-xwayland \
source imx-setup-release.sh -b build-imx95-xwayland-15x15-lpddr4x-frdm
bitbake imx-image-full --runall=fetch
```
约 70%\~80% 的包从官方镜像源成功下载,剩余因网络受限失败,典型报错为 `<span leaf="">exit code 128</span>`、`<span leaf="">Connection timed out</span>`。
**第二轮:定位失败包**
```
grep -r "Fetcher failure" tmp/log/cooker/*/console-latest.log | head -20
grep -r "exit code 128" tmp/work/*/temp/log.do_fetch | head -20
```
常见失败包:
| 源码仓库 | 典型失败包 |
| ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `github.com` | `matter-idl-native`,`imx-gpu-sdk`,`meta-imx`组件 |
| `android.googlesource.com` | `gfxstream` |
| `gitlab.freedesktop.org` | `shared-mime-info` |
| `crates.io` | `python3-maturin-native`及 cargo 依赖 |
**第三轮:代理补包**
启动代理后,重新进入构建环境,仅对失败包设置代理并重新 fetch:
```
cd /workdir/imx-yocto-bsp
MACHINE=imx95-15x15-lpddr4x-frdm DISTRO=fsl-imx-xwayland \
source imx-setup-release.sh -b build-imx95-xwayland-15x15-lpddr4x-frdm
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export no_proxy="localhost,127.0.0.1,..."
bitbake matter-idl-native gfxstream shared-mime-info python3-maturin-native --runall=fetch
```
**第四轮:验证**
关闭代理,重新进入构建环境,再次执行全量 fetch:
```
cd /workdir/imx-yocto-bsp
MACHINE=imx95-15x15-lpddr4x-frdm DISTRO=fsl-imx-xwayland \
source imx-setup-release.sh -b build-imx95-xwayland-15x15-lpddr4x-frdm
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY
bitbake imx-image-full --runall=fetch
```
若仍有失败,重复第二轮至第三轮,直至连续两次无报错通过。
**第五轮:编译**
全部缓存至 `<span leaf="">DL_DIR</span>` 后,重新进入构建环境并编译:
```
cd /workdir/imx-yocto-bsp
MACHINE=imx95-15x15-lpddr4x-frdm DISTRO=fsl-imx-xwayland \
source imx-setup-release.sh -b build-imx95-xwayland-15x15-lpddr4x-frdm
bitbake imx-image-full
```
典型耗时与裸机相近(8\~12 小时),容器化开销主要来自 Volume 挂载的 I/O 延迟,对编译阶段影响有限。
编译期间建议保持代理可用,或在 `<span leaf="">local.conf</span>` 中设置 `<span leaf="">BB_NO_NETWORK = "1"</span>`(前提是 fetch 阶段已完全通过)。
---
◆
## 十、磁盘空间优化
Yocto 完整构建默认峰值可达 500 GB+。以下配置应组合使用,整体追加至 `<span leaf="">build-*/conf/local.conf</span>`:
```
# ===== 最小化空间配置 =====
INHERIT += "rm_work"
IMAGE_FSTYPES = "wic"
PACKAGE_CLASSES = "package_ipk"
DL_DIR = "/workdir/downloads"
SSTATE_DIR = "/workdir/sstate-cache"
IMAGE_GEN_DEBUGFS = "0"
# ==========================
```
* `<span leaf="">rm_work</span>`:编译完成后删除中间文件,节省 60%\~70% 空间
* `<span leaf="">wic</span>` 单格式:禁用体积较大的 tarball 输出
* `<span leaf="">ipk</span>`:包格式体积优于 deb/rpm
* `<span leaf="">DL_DIR</span>` / `<span leaf="">SSTATE_DIR</span>` 外置:通过 Volume 挂载至宿主机,容器内仅保留编译中间态
启用后峰值约 150\~200 GB(容器内 Overlay),配合外置缓存,总空间需求约 250\~300 GB。
如需保留特定包用于调试:
```
INHERIT += "rm_work"
RM_WORK_EXCLUDE += "linux-imx u-boot-imx"
```
---
◆
## 十一、镜像构建与输出
### 11.1 执行构建
```
cd /workdir/imx-yocto-bsp
MACHINE=imx95-15x15-lpddr4x-frdm DISTRO=fsl-imx-xwayland \
source imx-setup-release.sh -b build-imx95-xwayland-15x15-lpddr4x-frdm
bitbake imx-image-full
```
### 11.2 构建产物
构建成功后,关键输出位于容器内:
```
/workdir/imx-yocto-bsp/build-imx95-xwayland-15x15-lpddr4x-frdm/tmp/deploy/images/imx95-15x15-lpddr4x-frdm/
```
| 文件 | 说明 |
| --------------------------------------------------------- | -------------------------- |
| `imx-image-full-*.wic` | 完整磁盘镜像,可直接烧录 |
| `imx-boot-*-sd.bin-flash` | SD 卡启动引导程序 |
| `Image` | Linux 内核镜像 |
| `imx95-15x15-lpddr4x-frdm.dtb` | 设备树二进制 |
由于 `<span leaf="">/workdir</span>` 已通过 Volume 挂载至宿主机 `<span leaf="">${DOCKER_WORKDIR}</span>`,构建产物在宿主机上可直接访问,无需从容器内复制。
### 11.3 SD 卡烧录
在宿主机使用 `<span leaf="">dd</span>` 命令写入 WIC 镜像。操作前务必通过 `<span leaf="">lsblk</span>` 确认目标设备,避免误写系统盘:
```
sudo dd if=/mnt/yocto-disk/imx-yocto-bsp/build-*/tmp/deploy/images/imx95-15x15-lpddr4x-frdm/imx-image-full-*.wic of=/dev/sdX bs=1M status=progress
sync
```
---
◆
## 十二、常见问题与解决
**Q1:容器内构建产物在宿主机上显示为 `<span leaf="">unknown user</span>` 或数字 UID**
`<span leaf="">docker-build.sh</span>` 构建时未正确传入 UID/GID。删除现有镜像并重新执行 `<span leaf="">docker-build.sh</span>`:
```
docker rmi imx-yocto-ubuntu-22.04:latest
cd ~/imx-docker
./docker-build.sh Dockerfile-Ubuntu-22.04
```
**Q2:构建中报 `<span leaf="">No space left on device</span>`,但宿主机磁盘充足**
Docker 使用 overlay2 存储驱动时,容器可写层受限于 Docker 数据目录(默认 `<span leaf="">/var/lib/docker</span>`)所在分区的剩余空间。若该分区不足,需迁移 Docker 数据目录或清理无用镜像:
```
# 查看 Docker 磁盘使用
docker system df
# 清理无用镜像、容器、缓存
docker system prune -a
```
或将 Docker 数据目录迁移至大容量分区(修改 `<span leaf="">/etc/docker/daemon.json</span>`):
```
{
"data-root": "/mnt/bigdisk/docker"
}
```
**Q3:WIC 镜像生成失败,`<span leaf="">losetup</span>` 或 `<span leaf="">mkfs</span>` 报错**
Yocto 生成 WIC 镜像需要操作 loop 设备。若容器未以 `<span leaf="">--privileged</span>` 启动,将出现权限错误。`<span leaf="">docker-run.sh</span>` 已默认开启 `<span leaf="">--privileged</span>`,若手动 `<span leaf="">docker run</span>` 需确认该参数存在。
**Q4:容器内代理无法连接宿主机代理服务**
因 `<span leaf="">--network host</span>` 已启用,容器与宿主机共享网络栈,`<span leaf="">127.0.0.1:7890</span>` 可直接访问。若代理监听在 `<span leaf="">127.0.0.1</span>` 以外的地址(如 `<span leaf="">192.168.x.x</span>`),需确保该地址在容器内可达。检查代理监听地址:
```
# 宿主机上
ss -tlnp | grep 7890
```
**Q5:如何保存容器内修改后的环境(如额外安装的包)**
容器重启后,内部未持久化的修改(如在容器内 `<span leaf="">apt install</span>` 额外的包)将丢失。建议将此类修改反映至 Dockerfile 并重新构建镜像,或使用 `<span leaf="">docker commit</span>` 保存当前容器状态为新镜像:
```
docker commit imx-yocto-build imx-yocto-ubuntu-22.04:custom
```
**Q6:容器内 `<span leaf="">apt update</span>` 连不上 Ubuntu 官方源**
容器有自己的网络栈,不会自动继承 dockerd 代理。若宿主机需要代理才能访问外网,需在 Dockerfile 内显式声明代理环境变量(`<span leaf="">ENV http_proxy=...</span>`),或在容器启动后手动配置 apt 代理:
```
echo 'Acquire::http::Proxy "http://127.0.0.1:7890";' | sudo tee /etc/apt/apt.conf.d/proxy.conf
```
---
◆
## 附录
### A. 代理环境变量
```
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890
export no_proxy="localhost,127.0.0.1,.local,.internal,192.168.0.0/16,10.0.0.0/8,*.tuna.tsinghua.edu.cn,mirrors.edge.kernel.org,ftpmirror.gnu.org,*.yoctoproject.org"
export NO_PROXY="${no_proxy}"
```
### B. Docker 容器管理速查
| 操作 | 命令 |
| ------------------ | ---------------------------------------------------------------------- |
| 停止容器 | `docker stop imx-yocto-build` |
| 启动容器 | `docker start imx-yocto-build` |
| 进入容器 | `docker exec -it imx-yocto-build /bin/bash` |
| 删除容器 | `docker rm -f imx-yocto-build` |
| 查看容器磁盘占用 | `docker system df -v` |
| 清理无用资源 | `docker system prune -a` |
### C. 构建参数汇总
| 参数 | 值 |
| -------------- | -------------------------- |
| BSP 版本 | LF6.18.2-1.0.0 |
| Yocto 版本 | 5.3 (Whinlatter) |
| Machine | imx95-15x15-lpddr4x-frdm |
| Distro | fsl-imx-xwayland |
| 目标架构 | aarch64 |
| 容器基础镜像 | ubuntu:22.04 |
### D. 相关资源
* NXP 官方 imx-docker 仓库:https://github.com/nxp-imx/imx-docker
* Yocto 代理配置仓库:https://github.com/fafactx/vpn-for-yocto
* NXP i.MX95 官方 BSP 文档
* Yocto Project 官方文档
### E. BitBake 常用命令速查
| 命令 | 作用 | 示例 |
| ------------------------------------------------------------- | ------------------------------------------ | ------------------------------------------------------------------- |
| `bitbake ` | 编译指定配方 | `bitbake imx-image-full` |
| `bitbake-c fetch` | 仅执行 fetch 任务 | `bitbake imx-image-full -c fetch` |
| `bitbake--runall=fetch`| 对目标及其依赖图中所有配方执行 fetch | `bitbake imx-image-full --runall=fetch`|
| `bitbake--runonly=fetch` | 仅对目标配方执行 fetch(不处理依赖) | `bitbake imx-image-full --runonly=fetch` |
| `bitbake-c cleansstate`| 清理 sstate 缓存并重新编译 | `bitbake linux-imx -c cleansstate` |
| `bitbake-c cleanall` | 完全清理配方 | `bitbake u-boot-imx -c cleanall` |
| `bitbake-c devshell` | 进入配方的开发 Shell | `bitbake linux-imx -c devshell` |
| `bitbake-c menuconfig` | 打开内核菜单配置 | `bitbake linux-imx -c menuconfig` |
| `bitbake-c listtasks` | 列出该配方所有可用任务 | `bitbake linux-imx -c listtasks` |
| `bitbake-C compile` | 清除 compile 任务的 stamp 后执行默认任务 | `bitbake linux-imx -C compile` |
| `bitbake-f` | 强制重新运行(忽略已有 stamp) | `bitbake imx-boot -f` |
| `bitbake-k` | 出错后继续构建 | `bitbake imx-image-full -k` |
| `bitbake-n` | 干跑,不实际执行 | `bitbake imx-image-full -n` |
| `bitbake-p` | 仅解析配方后退出 | `bitbake imx-image-full -p` |
| `bitbake--no-setscene` | 忽略 sstate 缓存,全部重新构建 | `bitbake imx-image-full --no-setscene` |
| `bitbake--skip-setscene` | 跳过 setscene 任务 | `bitbake imx-image-full --skip-setscene` |
| `bitbake--setscene-only` | 仅执行 setscene 任务 | `bitbake imx-image-full --setscene-only` |
| `bitbake -s` | 显示所有配方的当前与首选版本 | — |
| `bitbake -e ` | 显示配方的完整环境变量 | `bitbake -e linux-imx` |
| `bitbake -e\| grep ^PV=`| 查看配方版本变量 PV | `bitbake -e linux-imx \| grep ^PV=` |
| `bitbake -g ` | 生成依赖关系图(.dot 格式) | `bitbake -g imx-image-full` |
| `bitbake -D ` | 提高调试级别 | `bitbake -D imx-image-full` |
| `bitbake -v ` | 启用 shell 任务跟踪 | `bitbake -v imx-image-full` |
| `bitbake -q ` | 减少终端日志输出 | `bitbake -q imx-image-full` |
| `bitbake -m` | 终止后台 bitbake server | — |
| `bitbake --status-only` | 检查远程 bitbake server 状态 | — |
| `bitbake --server-only` | 仅启动 server,不启动 UI | — |
| `bitbake-layers show-layers` | 列出所有启用的 meta-layer | — |
| `bitbake-layers show-recipes` | 列出所有可用配方 | — |
| `bitbake-layers show-appends` | 列出所有 bbappend 文件 | — |
#### 并行任务控制说明
`<span leaf="">bitbake</span>` 命令行不提供 `<span leaf="">-j</span>` 参数。并行任务数通过以下方式控制:
* 环境变量:`<span leaf="">export BB_NUMBER_THREADS=4</span>`
* `<span leaf="">local.conf</span>`:`<span leaf="">BB_NUMBER_THREADS = "4"</span>`
* 宿主机 CPU 数:默认自动检测 `<span leaf="">$(nproc)</span>`
---
◆
*本文档基于 NXP 官方 imx-docker 仓库及 Ubuntu 22.04 容器实际构建环境整理,所有命令均经过验证。*
页:
[1]