1. TC2平台与OpenEuler Embedded概述
Arm Total Compute 2(TC2)平台是Arm推出的高性能计算参考设计平台,采用多核Cortex-A系列处理器架构。该平台广泛应用于嵌入式系统开发、芯片验证和软件生态构建。OpenEuler Embedded则是华为开源的嵌入式Linux发行版,基于Yocto构建系统,专为嵌入式场景优化。
在TC2平台上运行OpenEuler Embedded需要解决几个关键技术点:
- 内核配置适配:确保内核支持TC2平台的硬件特性
- 文件系统构建:通过Yocto工具链生成符合嵌入式场景的轻量级根文件系统
- 启动流程定制:调整U-Boot参数使系统能够正确加载和运行
2. 环境准备与工具链配置
2.1 硬件与软件需求
硬件环境:
- 开发主机:x86_64架构,建议16GB以上内存,100GB可用磁盘空间
- 目标平台:Arm TC2参考设计平台(或FVP仿真器)
软件依赖:
bash复制# Ubuntu/Debian系统安装基础工具链
sudo apt-get update
sudo apt-get install -y \
git make gcc g++ bison flex \
python3 python3-pip docker.io \
gawk wget diffstat texinfo \
gcc-multilib build-essential chrpath socat cpio
2.2 Docker环境配置
OpenEuler Embedded使用Docker容器隔离构建环境,需正确配置:
bash复制# 添加当前用户到docker组
sudo usermod -aG docker $(whoami)
sudo systemctl restart docker
# 验证Docker权限
docker run hello-world
# 设置Docker sock权限
sudo chmod a+rw /var/run/docker.sock
2.3 oebuild工具安装
oebuild是OpenEuler Embedded的专用构建工具:
bash复制pip install oebuild -i https://pypi.tuna.tsinghua.edu.cn/simple
# 验证安装
oebuild --version
3. 内核配置与编译
3.1 获取内核源码
OpenEuler内核仓库包含针对TC2平台的适配补丁:
bash复制git clone https://gitee.com/openeuler/kernel.git kernel-OLK-6.6
cd kernel-OLK-6.6
git checkout -b tc2_support origin/openEuler-6.6
3.2 关键内核配置
针对TC2平台需要特别注意以下配置项:
config复制# 文件系统支持
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT3_FS=y
CONFIG_EXT4_FS=m
CONFIG_VFAT_FS=y
CONFIG_TMPFS=y
# 平台特定驱动
CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
CONFIG_ARM_SMMU_V3=y
CONFIG_PCI=y
3.3 交叉编译内核
使用aarch64工具链进行编译:
bash复制export CROSS_COMPILE=aarch64-none-linux-gnu-
export ARCH=arm64
# 应用默认配置
make openeuler_defconfig
# 自定义配置
make menuconfig
# 并行编译
make -j$(nproc) Image
编译完成后,内核镜像位于arch/arm64/boot/Image。
4. 构建根文件系统
4.1 初始化构建环境
bash复制# 创建工作目录
mkdir -p ~/oe-tc2 && cd ~/oe-tc2
# 初始化oebuild环境
oebuild init tc2_build
cd tc2_build
# 更新元数据
oebuild update
4.2 配置构建参数
创建compile.yaml配置文件:
yaml复制product: openeuler
platform: qemu-aarch64
build_type: debug
sdk: enable
extra_packages:
- openssh
- systemd
- networkmanager
生成构建目录:
bash复制oebuild generate -p qemu-aarch64 -d build_arm64
4.3 执行构建
bash复制cd build/build_arm64
oebuild bitbake openeuler-image
构建过程可能需要2-4小时,取决于网络和主机性能。成功后会生成根文件系统:
code复制output/YYYYMMDDHHMMSS/openeuler-image-qemu-aarch64-YYYYMMDDHHMMSS.rootfs.cpio.gz
5. 适配TC2平台
5.1 文件系统转换
将QEMU格式的根文件系统转换为TC2可用的EXT3镜像:
bash复制# 解压根文件系统
mkdir -p ~/tc2-rootfs && cd ~/tc2-rootfs
gzip -dc ../openeuler-image-*.rootfs.cpio.gz | cpio -idm
# 创建1GB大小的EXT3镜像
dd if=/dev/zero of=openeuler_fs.img bs=1M count=1024
mkfs.ext3 openeuler_fs.img
# 挂载并复制文件
mkdir mnt
sudo mount -o loop openeuler_fs.img mnt
sudo cp -a ~/tc2-rootfs/* mnt/
sudo umount mnt
5.2 U-Boot参数调整
修改TC2平台的U-Boot启动参数:
diff复制--- a/files/u-boot/tc2/fvp.cfg
+++ b/files/u-boot/tc2/fvp.cfg
@@ -1,7 +1,7 @@
CONFIG_TARGET_TOTAL_COMPUTE_FVP=y
CONFIG_BOOTARGS="console=ttyAMA0 debug user_debug=31 earlycon=pl011,0x2A400000 loglevel=9 androidboot.hardware=total_compute androidboot.boot_devices=1c050000.mmci ip=dhcp androidboot.selinux=permissive allow_mismatched_32bit_el0 systemd.log_level=info"
-CONFIG_BOOTDELAY=1
-CONFIG_BOOTCOMMAND="virtio scan; ... root=/dev/mmcblk0p1 rw ..."
+CONFIG_BOOTDELAY=0
+CONFIG_BOOTCOMMAND="virtio scan; ... root=/dev/vda1 rw ..."
关键修改点:
- 将root设备从mmcblk0p1改为vda1(virtio块设备)
- 设置BOOTDELAY=0加速启动过程
5.3 运行脚本适配
修改TC2平台运行脚本以支持OpenEuler:
bash复制diff --git a/tc2/run_model.sh b/tc2/run_model.sh
index 1fe76b0..cd7a6b6 100755
--- a/tc2/run_model.sh
+++ b/tc2/run_model.sh
@@ -147,7 +147,8 @@ echo "Launching model: "`basename $MODEL`
$MODEL --version
DEPLOY_DIR=$RUN_SCRIPTS_DIR/../../output/${DISTRO}/deploy/tc2/
DEB_MMC_IMAGE_NAME=debian_fs.img
+OPENEULER_MMC_IMAGE_NAME=openeuler_fs.img
6. 系统启动与验证
6.1 准备启动镜像
将构建产物复制到TC2部署目录:
bash复制mkdir -p output/openeuler/deploy/tc2/
cp arch/arm64/boot/Image output/openeuler/deploy/tc2/
cp openeuler_fs.img output/openeuler/deploy/tc2/
6.2 启动FVP模拟器
使用Arm提供的Fixed Virtual Platform运行系统:
bash复制./run-scripts/tc2/run_model.sh \
-m /path/to/FVP_TC2 \
-d openeuler \
-b uefi
6.3 系统验证
成功启动后,通过串口登录系统并检查:
bash复制# 检查内核版本
uname -a
# 查看挂载点
df -h
# 验证系统服务
systemctl list-units
7. 常见问题与解决方案
7.1 内核启动失败
现象:内核panic或卡在启动早期阶段
排查步骤:
- 检查U-Boot传递给内核的参数是否正确
- 确认内核配置包含TC2必需的驱动
- 验证设备树是否正确加载
7.2 文件系统挂载失败
现象:内核报错"Unable to mount root fs"
解决方案:
- 确认根文件系统镜像格式为EXT3/EXT4
- 检查U-Boot中root=参数指定的设备名是否正确
- 验证文件系统是否包含必要的/dev节点
7.3 网络连接问题
现象:系统启动后无法连接网络
调试方法:
bash复制# 检查网络接口
ip link show
# 查看DHCP获取情况
journalctl -u NetworkManager
8. 性能优化建议
8.1 内核裁剪
通过menuconfig移除不需要的驱动和模块:
bash复制make menuconfig
推荐关闭的选项:
- 调试符号(CONFIG_DEBUG_INFO)
- 未使用的文件系统驱动
- 实验性功能(CONFIG_EXPERIMENTAL)
8.2 文件系统优化
- 使用squashfs替代EXT4减少镜像大小
- 在/etc/fstab中添加noatime选项
- 禁用不必要的系统服务
8.3 启动时间优化
- 设置CONFIG_BOOTDELAY=0
- 使用initramfs减少根文件系统挂载时间
- 并行启动服务(CONFIG_SYSTEMD_CONCURRENT_BOOT)
通过以上步骤,开发者可以在TC2平台上完整部署OpenEuler Embedded系统。这套方案也适用于其他Arm64架构的嵌入式平台,只需根据具体硬件调整内核配置和设备树即可。
