「Linux」- 制作chroot环境(用于构建)

  CREATED BY JENKINSBOT

内容简介

简单地说chroot是一个修改当前进程及子进程运行目录的操作。通过创建一个目录并初始化,使该目录具有与操作系统相同的目录结构,应用程序将在该目录中运行,加载该目录中文件及库,与原始的操作系统目录进行隔离。

本文将介绍如何制作一个chroot环境,用于软件编译。

chroot ?

简单地说chroot是一个修改当前进程及子进程运行目录的操作。通过创建一个目录并初始化,使该目录具有与操作系统相同的目录结构,应用程序将在该目录中运行,加载该目录中文件及库,与原始的操作系统目录进行隔离。这一点与容器技术非常相似,但这不是容器技术。

通过chroot功能,可以进行:

	重新安装bootloader以修复引导;
	重新构建initramfs镜像;
	修改操作系统的密码;
	构建软件运行或编译环境;(这也是我创建chroot环境的目的)

还可以做很多其他的事情。

制作chroot环境的方法?

# 制作方法

编译openjdk7u6需要在ubuntu 10.10 amd64系统环境下进行。这里有两个办法:

	* 使用虚拟机(比如VirtualBox等等)。
	* 创建chroot环境(使用ubuntu 10.10 amd64的chroot环境);

在使用虚拟机时,物理机与本机的文件传输并不是十分方便,而且虚拟机的安装也会比较繁琐。

# 为什么非要使用ubuntu 10.10 amd64来编译openjdk7u6呢?

最主要的原因是:“本机的库版本及编译器版本”“官方编译测试环境中的”不同,经常导致编译不通过。本质上来讲,只要你的”编译器和库的版本与官方相同“,按照文档就可以编译成功。
在编译的Android系统时候,官方文档强调了:各个版本的android系统编译时所使用的Ubuntu版本。在编译chromium浏览器时,官方文档中有一句话:“Once you have checked out the code, and assuming you’re using Ubuntu, run build/install-build-deps.sh”。所以一些相对较大的项目,文档或者手册里多半都会指明编译环境系统信息

本文主要介绍chroot环境的制作,而这个过程中一个主要的问题就是如何使用「系统的ISO文件」生成「已安装好的系统目录结构」

方法一、使用虚拟机提取操作系统(过时、不推荐)

思路:使用虚拟机,将操作系统安装到「虚拟硬盘文件」中,再“解压”出「虚拟硬盘文件」中的文件系统。

第一步,在虚拟机里安装系统
这个就很简单了,不再赘述;

注意:硬盘文件类型选择VMDK格式。因为下一步要挂载,然后将VMDK文件的内容复制出来。(其他格式也是可以的,只要能挂载上就可以,这里已VMDK为例);

第二步,挂载VMDK文件
本地挂载VMDK文件,参考:「在Linux下,挂载VMDK文件」

第三步,复制挂载目录下的内容
将文件复制出来,此时chroot的环境就有了;

注意: 复制时使用cp -a命令,因为权限连接等相关属性、内容要一并复制过来。

第四步,执行chroot命令

#!/bin/bash

LFS=/mnt/chos/ubuntu-10.10

# 先挂载「虚拟文件系统」
mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620

mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run

# 使用chroot加载环境
chroot $LFS \
	/bin/bash --login +h

方法二、直接使用工具(推荐)

以Debian为例,可以使用debootstrap命令,直接创建一个基本系统。详细参考「How to build a Debian chroot environment」一文。

注意事项

这些事情也可以用Docker完成。即使是运行图形化程序,也可以使用Docker容器。有关这方面的内容可以参考如下两篇文章:

	[[http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/|Running GUI apps with Docker]]
	[[https://medium.com/@SaravSun/running-gui-applications-inside-docker-containers-83d65c0db110|Running GUI Applications inside Docker Containers]]

至于使用Docker还是chroot技术,看个人需要(获取我应该写一篇chroot与Docker对比的文章)。

参考文献

archlinux/chroot
How to build a Debian chroot environment