树莓派4B实战:Ubuntu 20.04编译AGL车载系统的深度避坑手册
当我在2023年第一次尝试在树莓派4B上构建Automotive Grade Linux(AGL)时,官方文档推荐的Ubuntu 16.04已经停止维护。这个看似简单的版本差异,让我在后续的编译过程中遭遇了数十个隐蔽的"深坑"。本文将分享我在Ubuntu 20.04 LTS环境下完整构建AGL 12.0(Electric Eel)的实战经验,涵盖从系统准备到镜像烧录的全流程解决方案。
1. 环境准备阶段的隐性冲突
官方文档中"apt-get install"列出的软件包清单,在Ubuntu 20.04上直接运行会导致三个关键问题:
依赖关系断裂示例:
# 典型错误提示 Package 'python-pexpect' has no installation candidate Package 'gcc-multilib' conflicts with 'gcc-aarch64-linux-gnu'必须使用以下修正后的安装命令:
sudo apt-get install -y gawk wget git-core diffstat unzip texinfo \ build-essential chrpath socat cpio python3 python3-pip python3-pexpect \ xz-utils debianutils iputils-ping libsdl1.2-dev xterm \ gcc-aarch64-linux-gnu g++-aarch64-linux-gnu注意:Ubuntu 20.04已完全转向Python3,所有Python2相关的包都需要替换为Python3版本
存储空间的实际需求对比:
| 官方建议 | 实测需求 | 关键差异原因 |
|---|---|---|
| 50GB | 120GB | 构建缓存和多个版本镜像共存 |
建议使用以下命令检查并扩展存储:
df -h / # 检查根分区空间 sudo lvextend -L+80G /dev/ubuntu-vg/root # LVM扩容示例2. Repo工具与源码下载的现代适配
在配置Repo工具时,Google原始域名在国内访问不稳定,需要改用镜像源:
# 创建bin目录并配置PATH mkdir -p ~/bin && curl -s https://mirrors.bfsu.edu.cn/git/git-repo > ~/bin/repo chmod a+x ~/bin/repo # 设置清华镜像源 export REPO_URL='https://mirrors.bfsu.edu.cn/git/git-repo'源码同步时常见问题及解决方案:
Gerrit连接超时:
# 修改.repo/manifests.git/config [remote "origin"] url = https://mirrors.tuna.tsinghua.edu.cn/git/automotive/AGL/AGL-repo大文件下载失败:
repo sync -j4 --no-clone-bundle --optimized-fetch内存不足崩溃:
sudo sysctl vm.swappiness=10 # 降低swap使用倾向 free -h # 监控内存使用
3. aglsetup.sh脚本的兼容性改造
原版aglsetup.sh在Ubuntu 20.04上运行时会产生Python语法错误,需要手动修复:
关键修改点:
# 修改前(旧版Python语法) print "Error: %s" % message # 修改后 print(f"Error: {message}")完整修复步骤:
# 备份原始脚本 cp $AGL_TOP/meta-agl/scripts/aglsetup.sh $AGL_TOP/aglsetup.sh.bak # 使用sed批量替换 sed -i 's/print "\(.*\)"/print(f"\1")/g' $AGL_TOP/meta-agl/scripts/aglsetup.sh构建命令需要额外添加针对树莓派4B的优化参数:
source meta-agl/scripts/aglsetup.sh -m raspberrypi4 \ agl-demo agl-devel agl-appfw-smack \ --dl-dir=$AGL_TOP/downloads --build-dir=$AGL_TOP/build4. 构建过程中的典型错误排查
内存不足导致OOM Killer: 树莓派4B构建需要至少16GB内存,建议配置swapfile:
sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile常见编译错误及解决方案:
| 错误类型 | 解决方案 | 根本原因 |
|---|---|---|
ERROR: QA Issue | 在local.conf添加INSANE_SKIP:pn-<package> = "textrel" | 二进制文件文本重定位 |
No such file or directory: 'aarch64-poky-linux-gcc' | 执行source setup-environment | 环境变量未正确加载 |
Failed to fetch | 修改DL_DIR使用国内镜像源 | 网络连接问题 |
构建时间优化技巧:
# 在local.conf中添加 BB_NUMBER_THREADS = "8" PARALLEL_MAKE = "-j 8"5. 镜像烧录与硬件适配
使用lsblk识别SD卡时,新版本Ubuntu可能会遇到设备命名差异:
# 更可靠的设备识别方式 sudo parted -l | grep -A 10 'SD Card'烧录命令需要根据镜像类型调整:
# 对于wic.xz格式 xzcat agl-raspberrypi4-12.0.0.wic.xz | sudo dd of=/dev/sdX bs=4M conv=fsync # 对于sdcard.img格式 sudo dd if=agl-raspberrypi4-12.0.0.sdcard.img of=/dev/sdX bs=4M conv=fsync触摸屏旋转配置的现代语法:
# /etc/xdg/weston/weston.ini [output] name=DSI-1 transform=90 # 支持0/90/180/270度旋转在完成首次启动后,建议立即执行以下优化操作:
# 扩展根分区 sudo agl-extend-rootfs # 启用SSH访问 sudo systemctl enable --now sshd