ubuntu制作chroot系统镜像

  • ubuntu制作chroot系统镜像已关闭评论
  • 107 次浏览
  • A+
所属分类:linux技术
摘要

这里的使用场景是在ubuntu x64上编译arm程序,需要一个开发环境,而最省心的方式就是自己做一个arm环境的chroot镜像,然后自由用apt-get安装依赖,然后编译程序。所以这里就以制作arm镜像为例。

这里的使用场景是在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