Chroot

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沒有足夠能力去防禦一個擁有root特權的行程造成危害。

限制 
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

参考

外部链接 
 
 
 
 openroot - an extended chroot with X11 access, /dev & /media automounting & more.

Unix进程和任务管理相关软件
虛擬化軟體
Linux内核功能