问题描述
简单地说chroot是一个修改当前进程及子进程运行目录的操作。通过创建一个目录并初始化,使该目录具有与操作系统相同的目录结构,应用程序将在该目录中运行,加载该目录中文件及库,与原始的操作系统目录进行隔离。
该笔记将记录:在 Linux 中,如何制作一个chroot环境,用于软件编译。
chroot ?
简单地说chroot是一个修改当前进程及子进程运行目录的操作。通过创建一个目录并初始化,使该目录具有与操作系统相同的目录结构,应用程序将在该目录中运行,加载该目录中文件及库,与原始的操作系统目录进行隔离。这一点与容器技术非常相似,但这不是容器技术。
通过chroot功能,可以进行:
重新构建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容器。有关这方面的内容可以参考如下两篇文章:
至于使用Docker还是chroot技术,看个人需要(获取我应该写一篇chroot与Docker对比的文章)。
参考文献
archlinux/chroot
How to build a Debian chroot environment