西西河

主题:【原创】基于Linux内核的开放源代码操作系统的组成:第一篇 -- 请尽量

共:💬75 🌺106
全看分页树展 · 主题 跟帖
家园 chroot即是一个工具,也是一种机制。

首先,对每个进程而言,根目录是一个逻辑上的概念。在内核中代表进程的数据结构中,有一个指向一个dentry结构的指针,代表该进程的根目录。在当前进程下进行文件操作时,所有的路径都要以这个dentry指向的目录作为出发点,也就是根目录。dentry是dir entry的简称,是Linux在内核中用于代表文件系统目录的数据结构。在fork一个新进程时,该指针指向代表真正的(the physical)根目录“/”的那个dentry。也就是说,大家刚生下来时,都把“/”当作自己的根目录。

内核提供的chroot系统调用使得应用程序可以改变当前进程的根目录。要注意这里说的是当前进程的根目录,也就是说,其他进程的根目录并不会受影响。

可能举个例子会清楚一些。要把HTTPD进程限制在目录“/data/jail_root”下作为HTTPD进程的根目录,只需要调用chroot("/data/jail_root")。chroot要完成的事情说起来挺简单,用代表“/data/jail_root”的dentry指针替换当前进程中的根目录dentry指针。虽然chroot返回后,HTTPD进程“看”到的所有路径,还是从根目录“/”开始的,比如说“/images/next.gif”。但是在查找代表该路径的dentry时,内核先找到“/data/jail_root/”,然后再从那里出发,查找“images/next.gif”。

对另外一个没有调用chroot的进程,要得到那个GIF文件,需要使用的路径是“/data/jail_root/images/next.gif”。

说chroot是一个工具,一方面是因为内核提供了chroot这样一个系统调用,另一方面是因为操作系统在/usr/sbin目录下还提供了一个同名的命令行程序,使shell scripts可以使用chroot。其实除了增加系统安全性外,chroot还普遍用于系统安装和修复。

说chroot是一种机制,是因为光是系统调用本身并不足以完成一个应用程序的chroot jail,还需要进行相当的设置工作。应用程序通常都需要运行环境,比如说动态链接库、存放临时文件的目录、系统级的配置文件、数据文件等等。例如,在Debian下,缺省配置的Apache HTTPD就需要/etc、/var/log、/usr/lib/httpd、/var/lib/www等目录。所以,仅仅是调用chroot是不够的。还必须在“/data/jail_root”下复制相应的目录,例如/data/jail_root/etc、/data/jail_root/var/log等。这样,当HTTPD进程调用chroot返回,还能继续找到这些路径。

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河