Docker コンテナ内の Yocto ビルドで多い問題は、権限、locale、volume mount、TUN デバイスです。
git clone に sudo が必要
症状
git clone https://git.yoctoproject.org/poky
が失敗し、sudo git clone なら成功する。
原因
/work またはホスト側の workspace/ が root 所有になっています。
確認
コンテナ内で確認します。
whoami
id
ls -ld /work
ls -ld /work/*
ホスト側で確認します。
cd yocto-docker-env
ls -ld docker workspace cache artifacts
ls -l docker/Dockerfile.yocto-build
対処
ホスト側で所有者を戻します。
cd yocto-docker-env
sudo chown -R $(id -u):$(id -g) docker workspace cache artifacts
プロジェクト全体を戻す場合です。
sudo chown -R $(id -u):$(id -g) .
禁止事項
sudo git clone ...
sudo bitbake ...
sudo chmod -R 777 workspace
特に sudo bitbake は避けます。tmp/、downloads/、sstate-cache/ が root 所有になり、後でさらに壊れます。
Dockerfile.yocto-build が root 所有で編集できない
確認
ls -l docker/Dockerfile.yocto-build
例です。
-rw-r--r-- 1 root root ... docker/Dockerfile.yocto-build
対処
sudo chown $(id -u):$(id -g) docker/Dockerfile.yocto-build
まとめて直す場合です。
sudo chown -R $(id -u):$(id -g) docker workspace cache artifacts
en_US.UTF-8 locale がない
症状
Please make sure locale 'en_US.UTF-8' is available on your system
一時対処
コンテナ内で実行します。
sudo apt-get update
sudo apt-get install -y locales
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
その後、コンテナを入り直します。
exit
cd docker
UID=$(id -u) GID=$(id -g) docker compose run --rm yocto-build
確認します。
locale
locale -a | grep en_US
恒久対処
Dockerfile に以下を入れます。
RUN apt-get update && apt-get install -y --no-install-recommends locales \
&& sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen \
&& locale-gen en_US.UTF-8 \
&& update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US:en
ENV LC_ALL=en_US.UTF-8
その後、再ビルドします。
cd docker
UID=$(id -u) GID=$(id -g) docker compose build --no-cache
UID/GID が合っていない
症状
コンテナ内で作ったファイルがホスト側で編集できない、または逆にコンテナ内で /work に書けない。
対処
ビルド・起動時に UID/GID を渡します。
UID=$(id -u) GID=$(id -g) docker compose build
UID=$(id -u) GID=$(id -g) docker compose run --rm yocto-build
docker-compose.yml 側は以下にします。
args:
USER_UID: ${UID:-1000}
USER_GID: ${GID:-1000}
Docker 内で QEMU の TUN が使えない
症状
runqemu - ERROR - TUN control device /dev/net/tun is unavailable
推奨対処
QEMU のユーザーモードネットワーク slirp を使います。
runqemu nographic slirp \
tmp/deploy/images/qemux86-64/core-image-minimal-qemux86-64.rootfs.qemuboot.conf
TUN を使う場合
ホスト側で確認します。
ls -l /dev/net/tun
sudo modprobe tun
docker-compose.yml に追加します。
devices:
- /dev/net/tun:/dev/net/tun
cap_add:
- NET_ADMIN
Windows / WSL2 で遅い
Yocto は小ファイル I/O が多いため、Windows の /mnt/c/... 上でビルドすると遅くなりやすいです。
推奨です。
WSL2 の ext4 領域: ~/yocto-docker-env
避けます。
/mnt/c/Users/.../yocto-docker-env