**chroot**是起源于Unix系统的一个操作，作用于正在运行的进程和它的子进程，改变它外显的根目录。一个运行在这个环境下，经由chroot设定根目录的程序，它不能够对这个指定根目录之外的文件进行存取动作，不能读取，也不能更改它的内容。chroot这一特殊表达可以指chroot(2)系统调用或chroot(8)应用程序。

由chroot创造出的那个根目录，叫做"chroot监牢"（chroot jail，或chroot prison）。

历史
--

1979年，在开发Version 7 Unix时，chroot系统调用首次问世。1982年3月18日，在4.2BSD发布前17个月，比尔·乔伊（Bill Joy）将chroot机制移植到BSD系统上，主要用于测试安装和构建系统。

1991年，威廉·齊斯韋克（William Cheswick）开发出第一个蜜罐程序，来监视入侵骇客的行动。他使用了chroot来进行实作，这是chroot最早被用于开发程序的先例，也因此，chroot创造出的根目录空间，之后被人称为软件监牢（chroot jail）。

2000年，FreeBSD团队，将原本chroot机制，导入虚拟化技术的概念，开发了新的jail系统命令，伴随着FreeBSD 4.0版一同发布。

2004年，因为骇客开发出许多可以破解chroot机制的方法，出现了jailbreak这个术语。

2005年，昇陽電腦在Solaris系统上开发出Solaris Containers，称它是吃了类固醇的chroot（chroot on steroids）。

2006年，Linux內核中开发出cgroups。2007年，被加到Linux 2.6.24版內核中。2008年，基于cgroups，开发出LXC，以及Docker。2013年被加入Linux 3.8版中。

应用
--

应用chroot，可以创建并运行一个隔离的虚拟软件系统拷贝。这对于以下应用是十分有用的:

测试和开发可以经由chroot建立一个测试环境，用来测试软件。这可以減少将软件直接布署到整个生产系统中可能造成的风险。
依赖控制可以在chroot建立的环境下，进行软件开发，组建以及测试，只保留这个程序需要的软件依赖。这可以避免在系统中预先安裝的各种软件库，影响到开发，造成软件开发者在构建软件时，可能遇到一些链接冲突。
兼容性早期遗留软件或使用不同应用二进制接口（ABI）的软件，因为它们提供的软件库和宿主机的库之间，可能发生名称或链接冲突，可以在chroot环境下运行，以保持系统安全。
修复当一个系统不能启动时，可以使用chroot，先从另一个根文件系统（比如从安裝媒体，或是Live CD）下开机，之后再回到受损的环境中，重新修正系统。
特权分离将允许开启文件描述符（例如文件，管線或是网络连接）的程序放到chroot下执行，不用特地将工作所需的文件，放到chroot路径底下，这可以简化软件监牢的设计。chroot简化了安全设计，可以创造出一个沙盒环境，来执行一个有潜在危险的特权程序，以预先防御可能的安全漏洞。但值得注意的是，chroot没有足够能力去防御一个拥有特权的路径造成危害。

限制
--

chroot机制的设计中，并不包括抵抗特权用戶（root）的蓄意篡改。在大多数的系统中，chroot环境沒有设计出适当的堆叠，所以一个在chroot下执行的程序，可能会通过第二次chroot来获得足够权限，逃出chroot的限制。为了减轻这种安全漏洞所带来的风险，在使用chroot后，在chroot下执行的程序，应该尽快放弃root权限，或是改用其他机制來替代，例如FreeBSD jail。在某些操作系统中，例如FreeBSD，已经采取预防措施，来防止第二次chroot的攻击。

* 在支持设备节点的文件系统中，一个在chroot中的root用户仍然可以创建设备节点和挂载在chroot根目录的文件系统；尽管，chroot机制不是被打算用来阻止低特权用户级访问系统设备。
* 在启动时，程序都期望能在某些预设位置找到scratch space，配置文件，设备节点和共享库。为了使chroot能够正常启动，在运行chroot的目录必须包含这些最基本的文件，这使得chroot难以作为一般的沙箱来使用。
* 只有root用户可以执行chroot。这是为了防止用户把一个setuid的程序放入一个特制的chroot监牢（例如一个有着假的/etc/passwd和/etc/shadow文件的chroot监牢）由于引起提权攻击。

* chroot不是为限制资源的使用而设计，如I/O，带宽，磁盘空间或CPU时间。大多数Unix系统都没有以完全文件系统为导向，以即给可能通过网络和过程控制，通过系统调用接口来提供一个破坏chroot的程序。

一些Unix系统提供扩展的chroot机制（一般称为操作系统层虚拟化）用于解决上述部分限制。包括:

* AIX中的Workload Partitions
* Solaris中的Containers
* Linux下的Linux-VServer, FreeVPS和OpenVZ
* FreeBSD 中的Jails
* NetBSD和OpenBSD中的Sysjails
* DragonFly BSD中的DragonFly BSD jails

在chroot中使用图形界面
--------------

在chroot环境中使用图形界面是可能的，参见以下几个方案：

* xhost
* 使用内置像Xnest这样的X服务，或现代一点的Xephyr（或者在监牢中启动真正的X服务）
* 通过开启X11转发（X11 forwarding）的 SSH连接到chroot中（ssh -X）
* 当一个X服务启动是设置为不监听tcp端口或没有可用的SSH服务器时，使用openroot
* 通过一个X11 VNC服务，链接到在外环境的VNC客户端

参见
--

* Unix实用程序列表
* 操作系统级虚拟化
* 沙盒 (计算机安全)
* sudo

外部链接
----

* `chroot(2)`: change root directory – FreeBSD系统调用（System Calls）手册页
* `chroot(8)`: change root directory – FreeBSD系统管理（System Manager's）手册页
* `chroot(2)`: change root directory – Linux程序员手册页 – 系统调用（System Calls）
* openroot - an extended chroot with X11 access, /dev & /media automounting & more.（页面存档备份，存于）

   

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
Unix命令行程序和shell内建命令 |
| --- |
|  |
| 文件系統 | 
* cat
* cd
* chmod
* chown
* chgrp
* cksum
* cmp
* cp
* dd
* du
* df
* file
* fsck
* fuser
* ln
* ls
* mkdir
* mount
* mv
* pax（英语：）
* pwd
* rm
* rmdir
* size
* split
* stat
* tee
* touch
* type（英语：）
* umask（英语：）

 |
|  |
| 程序 | 
* at
* bg
* chroot
* cron
* fg
* kill
* killall（英语：）
* nice
* pgrep
* pkill（英语：）
* ps
* pstree（英语：）
* time
* top

 |
|  |
| 用户环境 | 
* clear
* env
* exit
* history（英语：）
* id
* logname
* mesg（英语：）
* passwd
* su
* sudo
* uptime
* talk（英语：）
* tput（英语：）
* uname
* w
* wall（英语：）
* who
* whoami
* write（英语：）

 |
|  |
| 文本编辑 | 
* awk
* banner（英语：）
* basename
* comm（英语：）
* csplit（英语：）
* cut
* diff
* dirname
* ed
* ex
* fmt（英语：）
* fold（英语：）
* head（英语：）
* iconv
* join（英语：）
* less
* more
* nl（英语：）
* paste（英语：）
* sed
* sort（英语：）
* spell（英语：）
* strings（英语：）
* tail
* tr
* uniq（英语：）
* vi
* wc
* xargs

 |
|  |
| 壳层内建 | 
* alias
* echo
* printf格式字符串
* test（英语：）
* unset
* wait

 |
|  |
| 网络 | 
* dig
* host
* ifconfig
* inetd（英语：）
* netcat
* netstat
* nslookup
* ping
* rdate（英语：）
* rlogin（英语：）
* route
* ssh
* traceroute

 |
|  |
| 查找 | 
* find
* grep
* locate
* whatis（英语：）
* whereis

 |
|  |
| 文档 | 
* apropos（英语：）
* help（英语：）
* man

 |
|  |
| 软件开发 | 
* ar
* ctags
* lex
* make
* nm
* strip
* yacc

 |
|  |
| 杂项 | 
* bc
* cal
* dc
* expr
* lp（英语：）
* lpr
* sleep
* true和false
* yes

 |
|  |
| Unix实用程序列表 |

 |