chroot 使用笔记

归档: 其它 | 标签:

看了下最近很火很高大上的 Docker,比较好奇底层的实现机制,发现主要依赖 Linux Container(LXC) 和 cgroup,于是又了解了下 LXC,在看的过程中看到和 chroot 的比较,突然一些零散的片段在我脑海里迅速串起来……

一直在用 Debian 6,由于不爽 GNOME 3 所以没有升级,不过内核和 GCC 倒是在追新。传说 Debian 8 要使用 XFCE 作为默认桌面,小小期待一下。虽然不是什么狂热的追新族,但是在夜深人静的时候也会悄悄把源切到 unstable 然后 upgrade 看看有哪些自己喜欢的工具升级了。不过 unstable 的依赖关系经常处于不完整状态,有时安装一个包 apt-get 解析出来的关系能把整个系统都删掉,所以也有过几次搞坏系统的经历;而且重装了之后一些特定版本的软件又找不回来了,所以在有升级冲动的时候都会先对根分区备份一下(我的系统只有根目录和家目录)放到家目录里,万一搞坏了可以迅速恢复,而且备份之后的系统还可以作为镜像复制到其它机器上(中间就有过一次换电脑的经历,把旧的系统完整复制过来了)。

好吧,顺便记录一下系统备份和恢复的过程。首先用 U 盘或光盘装个 Live 系统(我用的是 SystemRescueCd ),备份的时候用启动盘启动,把硬盘上的根分区挂载到一个目录上然后在该目录下执行 tar(tar 在解压的时候会还原打包时的相对路径);恢复是同样的步骤,只是把打包变成解压。恢复的时候很多情况下 GRUB 的版本并不匹配(因为升级搞坏了…)或者新机器上根本就没装 GRUB,又因为解压后的目录已经包含了完整的执行环境,所以这时可以 chroot 到刚解压的目录下重新 grub-install 和 update-grub,然后重启就行了。

由于想尝鲜但是又怕搞坏系统,所以就用 KVM 装了个虚拟机,尝鲜的时候先在虚拟机里试一把,没问题了再在真实环境中操作。然后今天在看 LXC 的时候,突然想起来,能不能把备份的系统镜像解压到一个目录下然后 chroot,这样不就和虚拟机的效果一样了么?马上试了下,果然可以…

首先把一些动态生成的目录挂载到虚拟环境中,毕竟我们不是在用真正的机器(连虚拟机都不算),系统不会生成这些内容:

cd /path/to/vmdir
mount --bind /dev dev
mount --bind /dev/pts dev/pts
mount --bind /sys sys

如果有其它的目录共享需求可以用“mount –bind”把外部的目录挂载到测试环境下的某个目录,比虚拟机上的共享要方便多了。

接着改一下配置(这一步根据自己的需要修改):

rm -rf tmp && mkdir tmp && mount --bind /tmp tmp
rm -rf run && mkdir run && mount tmpfs run -t tmpfs && mkdir run/{lock,shm}
chown -R man:root var/cache/man
# add nameserver to etc/resolv.conf

然后是最激动人心的一步:

chroot . /bin/bash

这条命令把 bash 的执行目录设为镜像目录,之后在这个新的 shell 中执行的命令看到的根目录就是我们解压的镜像目录,和虚拟机差不多,除了内核及硬件,其它软件用的都是镜像目录里的东西,程序运行范围也仅限于镜像目录内(当然自己挂载的共享目录除外,所以对共享目录的操作要留心)。

chroot 后还需要执行一些步骤把环境建立起来(在 chroot 的环境下执行):

mount /proc

就是这么简单!而且还省去了虚拟机的资源占用,也不用做端口映射,还不会对宿主系统有任何影响,十分方便…可惜之前一直被虚拟机这个思维限制了。

chroot 的主要作用就像名字所说的,改变程序运行时的根目录,比如限定某个用户只能在某个目录活动(跳板机或 FTP 等服务经常这样),构造一个沙箱环境等。不过 chroot 虽然隔离了运行环境,但是似乎不能对进程使用资源进行限制,这时 LXC 是个更好的选择。

发表于 2014年8月16日
本文目前尚无任何评论.

发表评论

XHTML: 您可以使用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>