QEMU 跨架构交叉编译配置

跨架构交叉编译配置

前置需求

OS: Linux

Deps: 对应架构的QEMU、目标系统的镜像文件、rsync

步骤

解压镜像

1
xz -d raspi.img.xz

镜像会解压到 raspi.img

加载镜像为回环设备

1
sudo losetup -Pf --show raspi.img

会回显对应的回环设备名,如 /dev/loop0

挂载设备

1
2
3
sudo mount /dev/loop0p2 /mnt
# 可选挂载 boot, 如果后续开发设计到此处定制,就需要挂载。否则可以不挂载
sudo mount /dev/loop0p1 /mnt/boot # 或者挂载到 /mnt/boot/config,根据实际情况判断

复制镜像

由于镜像文件的大小固定,直接挂载的设备空间受限,因此把镜像文件直接复制出来,这样不会受镜像大小的限制,只受系统硬盘大小的限制了。

1
2
3
4
cd 
mkdir -pv workspace/qemu/raspi/fsroot
cd workspace/qemu/raspi/
sudo rsync -avzP /mnt/ fsroot/

注意:执行 rsync 命令时,一定要注意路径后 / 的书写,否则可能会把镜像文件复制到 fsroot/mnt 而不是 fsroot

具体参数的意义可以使用 rsync -h 查看

复制完成后可以卸载所有设备

1
2
sudo umount -R /mnt
sudo losetup -d /dev/loop0

进入 fsroot

  • 对于常规 Linux 发行版,需要挂载虚拟文件系统后使用chroot (退出后别忘记 umount

    1
    2
    3
    4
    sudo mount --bind /dev ./rootfs/dev
    sudo mount --bind /proc ./rootfs/proc
    sudo mount --bind /sys ./rootfs/sys
    sudo mount --bind /dev/pts ./rootfs/dev/pts

    挂载后 chroot 进入系统

    1
    2
    3
    4
    5
    6
    7
    8
    sudo chroot ./fsroot /usr/bin/env -i   \
    HOME=/root \
    TERM="$TERM" \
    PS1='(root chroot) \u:\w\$ ' \
    PATH=/usr/bin:/usr/sbin:/usr/local/bin \
    MAKEFLAGS="-j$(nproc)" \
    TESTSUITEFLAGS="-j$(nproc)" \
    /bin/bash
  • 对于 Arch Linux,可以安装 archinstall 脚本后,直接使用 arch-chroot 进入系统

    1
    2
    sudo pacman -S arch-install-scripts
    sudo arch-chroot fsroot

配置系统

进入系统后更新软件包缓存,安装所需依赖项

1
2
sudo apt update
sudo apt install libopencv-dev libopencv-contrib-dev

在主机中把代码同步,或者直接使用 git 同步

1
2
3
4
5
sudo apt install git
cd
mkdir -pv dev_ws/
git clone https://github.com/someone/somerepo.git dev_ws/somerepo
cd dev_ws/somerepo

重新打包部署

当代码在交叉编译环境中配置完成,并上板测试无异常,即可将其重新打包为 ISO 镜像,便于备份恢复,多板批量部署等。

具体内容参考 为嵌入式 Linux 开发板定制产品镜像,本文只做简单命令介绍和有差别的部分

  1. 测算系统当前所需大小

    1
    sudo du -h --max-depth=0 fsroot
    1
    2.9G	fsroot

    那么应该为镜像文件至少分配 2.9G 空间,算上1G的boot分区、本机文件系统压缩和留有的余量,此处直接分配 5G

    1
    dd if=/dev/zero bs=1M count=5120 >> prod.img

    然后打开回环设备

    1
    sudo losetup -Pf --show prod.img

    此时镜像中没有分区表,可以使用 gpart/fdisk/cfdisk等工具添加分区。

    分区配置完成后格式化,boot分区格式化为 FAT32, 根分区为 ext4(当然如果想尝试其他文件系统如btrfs也可以)

    1
    2
    3
    4
    5
    sudo mkfs.vfat -F 32 /dev/loop0p1
    sudo mkfs.ext4 /dev/loop0p2
    sudo mount /dev/loop0p2 /mnt
    sudo mkdir /mnt/boot
    sudo mount /dev/loop0p1 /mnt/boot

    复制镜像文件

    1
    sudo rsync -avzP fsroot/ /mnt

    卸载设备

    1
    2
    sudo umount -R /mnt
    sudo losetup -d /dev/loop0

    之后的压缩、烧录等可以参考链接