问题描述
最近准备编译picam库,发现有很多依赖,本来想直接在raspberry Pi 4B上编译,但是担心编译时间太长,就想着使用交叉环境下编译。但是交叉环境下的依赖库怎么弄呢?
于是想到了QEMU,使用QEMU模拟arm64,然后基于chroot切换根文件系统,然后可以安装任意想安装的包或执行相应的脚本。
第一步
设置语言环境,这样 Qemu Chroot 可以访问它们,这样不需要单独配置每个 Chroot 的语言环境。
# From the host
sudo dpkg-reconfigure locales
第二步
安装QEMU安装包
sudo apt-get install qemu qemu-user-static binfmt-support debootstrap
第三步
使用debootstrap创建chroot 环境
# sudo debootstrap --arch [平台] [发行版本代号] [构建目录] [镜像地址]
sudo qemu-debootstrap --arch arm64 --variant=buildd bullseye /install/path/rootfs http://mirrors.aliyun.com/debian
参数解释:
qemu-debootstrap:QEMU debootstrap wrapper
–arch:指定arch,通常有armhf指32bit,arm64指64bit
–variant:minbase,buildd,fakechroot,代表安装的rootfs的是最小包还是包含最小编译环境
bullseye:debian的发行代号,参考debian 各个版本的代号,当前版本支持的发行版本可以在/usr/share/debootstrap/scripts
中查看。
rootfs:安装在host上的路径名
http://mirrors.aliyun.com/debian:可选,mirror URL。
I: Running command: debootstrap --arch arm64 --foreign --variant=buildd bullseye /root/projects/raspi/cross-compile/rootfs http://mirrors.aliyun.com/debian
W: Cannot check Release signature; keyring file not available /usr/share/keyrings/debian-archive-keyring.gpg
I: Retrieving InRelease
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
...
...
I: Extracting libmount1...
I: Extracting libsmartcols1...
I: Extracting libuuid1...
I: Extracting mount...
I: Extracting util-linux...
I: Extracting libxxhash0...
I: Extracting liblzma5...
I: Extracting zlib1g...
I: Running command: chroot /root/projects/raspi/cross-compile/rootfs /debootstrap/debootstrap --second-stage
chroot: failed to run command ‘/debootstrap/debootstrap’: Exec format error
此处报错找不到命令/debootstrap/debootstrap
,是因为wsl没有systemd,导致没有启动服务binfmt-support,此处手动打开:
/usr/sbin/update-binfmts --enable
重新运行,利用–second-stage进行arm64下的软件安装配置:
chroot /root/projects/raspi/cross-compile/rootfs /debootstrap/debootstrap --second-stage
运行成功后:
I: Installing core packages...
I: Unpacking required packages...
I: Unpacking libacl1:arm64...
I: Unpacking adduser...
I: Unpacking apt...
I: Unpacking libapt-pkg6.0:arm64...
I: Unpacking libattr1:arm64...
I: Unpacking libaudit-common...
I: Unpacking libaudit1:arm64...
I: Unpacking base-files...
I: Unpacking base-passwd...
I: Unpacking bash...
I: Unpacking libbz2-1.0:arm64...
......
......
I: Configuring libdpkg-perl...
I: Configuring g++...
I: Configuring dpkg-dev...
I: Configuring build-essential...
I: Configuring libc-bin...
I: Base system installed successfully.
第四步
chroot /install/path/rootfs/
参考文档:
CrossCompiling
使用 Qemu 和 Chroot 替换你的交叉编译工具链
vscode-wiki
How to install dependencies for a project that is being cross-compiled on an x86 host for an arm target