这里的使用场景是在ubuntu x64上编译arm程序,需要一个开发环境,而最省心的方式就是自己做一个arm环境的chroot镜像,然后自由用apt-get安装依赖,然后编译程序。所以这里就以制作arm镜像为例。
在我们开始之前,我们需要了解一下ARM的几种架构:
armel(abi):这个是老架构,之前的arm硬件没有浮点处理单元,所以采用软件模拟的方式进行浮点计算,兼容新架构
armhf:这个是新架构,有了独立的硬件浮点处理单元,这个不兼容老架构
arm64:这个就直接用了新架构,没有el和hf之分了
kernel、rootfs和app编译的时候,指定的必须保持一致才行
1、首先我们需要安装相关程序来支持chroot环境
sudo apt-get install qemu-user-static
如果你有现成的镜像,那么只需要安装这个就行了,然后你就可以chroot进去了
2、接着我们需要安装制作镜像所需要的工具环境
sudo apt-get install binfmt-support debootstrap qemu
这里最主要是这个debootstrap,另外两个看着办
3、然后我们利用debootstrap来制作镜像
首先我们建立一个文件夹
sudo mkdir /opt/ubuntu-arm-64
然后我们运行debootstrap来联网下载对应的ubuntu版本基础镜像来制作我们的镜像
debootstrap --arch=arm64 --foreign trusty /opt/ubuntu-arm-64 http://ports.ubuntu.com/
这里的trusty是ubuntu 14.04的版本代号,关于debootstrap支持的版本代号,可以在debootstrap的脚本目录下查看,路径为 /usr/share/debootstrap/scripts/
这下面有很多以ubuntu代号命名的文件
4、接着我们就等待3的操作完成,然后拷贝qemu-aarch64-static 到我们镜像的bin目录
cp /usr/bin/qemu-aarch64-static /opt/ubuntu-arm-64/usr/bin/
这里要注意了,是aarch64,如果你是armhf环境,那么请使用【qemu-arm-static】接着我们chroot进去
sudo chroot /opt/ubuntu-arm-64
这一步的时候,你可能会遇到 "i have no name" 的情况,不要急,我们来利用debootstrap对我们的镜像进行初始化操作
debootstrap/debootstrap --second-stage
如果没找到debootstrap脚本,那么请检查步骤3中遇到的错误,可能是mount proc失败。
然后等待初始化完成,你就会发现一切ok了。
5、接着我们来编辑apt的源,方便我们安装其他依赖
deb http://ports.ubuntu.com/ trusty main restricted universe multiverse
deb-src http://ports.ubuntu.com/ trusty main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty main universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty main universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty-updates main universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty-updates main universe
这里的trusty根据你版本的不同,可以换
6、接着就是关于chroot挂载真实系统设备到我们的虚拟系统,这个需要在chroot之前调用挂载,作用是比如你想多线程编译 make -j4
那么你就需要运行下面的脚本,挂载设备
#!/bin/bash
mount -t proc proc proc/
mount -t sysfs sys sys/
mount -o bind /dev dev/
mount -t devpts pts dev/pts/
参考:
http://www.360doc.com/showweb/0/0/804170657.aspx
https://wiki.debian.org/EmDebian/CrossDebootstrap
https://linux.cn/article-4936-1.html