主题:【原创】基于Linux内核的开放源代码操作系统的组成:第一篇 -- 请尽量
首先,对每个进程而言,根目录是一个逻辑上的概念。在内核中代表进程的数据结构中,有一个指向一个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返回,还能继续找到这些路径。
- 相关回复 上下关系8
前天正好看了一下微软下一代web server IIS 7.0的简介, Highway 字217 2005-03-07 08:01:31
多谢了。 请尽量 字320 2005-03-07 21:45:13
有一点没太看懂,请教 参学 字255 2005-03-07 01:33:07
chroot即是一个工具,也是一种机制。
【原创】基于Linux内核的开放源代码操作系统的组成:第三篇(下) 7 请尽量 字16935 2005-02-27 01:13:04
🙂有一个小问题,scim是suzhe开发的。 邪恶本质 字33 2006-06-02 07:37:19
😁洋洋洒洒,娓娓道来,写的好! Highway 字0 2005-02-28 10:19:46
坐一下沙发,继续学习! 参学 字0 2005-02-27 02:40:46