跨架构交叉编译配置
前置需求
OS: Linux
Deps: 对应架构的QEMU、目标系统的镜像文件、rsync
步骤
解压镜像
1 | xz -d raspi.img.xz |
镜像会解压到 raspi.img
加载镜像为回环设备
1 | sudo losetup -Pf --show raspi.img |
会回显对应的回环设备名,如 /dev/loop0
挂载设备
1 | sudo mount /dev/loop0p2 /mnt |
复制镜像
由于镜像文件的大小固定,直接挂载的设备空间受限,因此把镜像文件直接复制出来,这样不会受镜像大小的限制,只受系统硬盘大小的限制了。
1 | cd |
注意:执行 rsync 命令时,一定要注意路径后 / 的书写,否则可能会把镜像文件复制到 fsroot/mnt 而不是 fsroot
具体参数的意义可以使用 rsync -h 查看
复制完成后可以卸载所有设备
1 | sudo umount -R /mnt |
进入 fsroot
对于常规 Linux 发行版,需要挂载虚拟文件系统后使用
chroot(退出后别忘记umount)1
2
3
4sudo 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
8sudo 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
2sudo pacman -S arch-install-scripts
sudo arch-chroot fsroot
配置系统
进入系统后更新软件包缓存,安装所需依赖项
1 | sudo apt update |
在主机中把代码同步,或者直接使用 git 同步
1 | sudo apt install git |
重新打包部署
当代码在交叉编译环境中配置完成,并上板测试无异常,即可将其重新打包为 ISO 镜像,便于备份恢复,多板批量部署等。
具体内容参考 为嵌入式 Linux 开发板定制产品镜像,本文只做简单命令介绍和有差别的部分
测算系统当前所需大小
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
5sudo 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
2sudo umount -R /mnt
sudo losetup -d /dev/loop0之后的压缩、烧录等可以参考链接