chroot是一个系统调用,能改变一个进程的根目录。
进程的根目录
一个进程有两个目录:工作目录和根目录。工作目录(working directory)也叫当前目录, 随cd命令经常发生变化,而一般情况下,所有进程看到的根路径都是/
。不考虑权限问题,整个的文件系统树对所有进程都是可见的。假如,管理员要把一个进程限制某个目录下面,这个进程可以是一个测试程序,就要用到chroot。数据结构关系如下:
include/linux/sched.h:
struct task_struct {
...
771 /* Filesystem information: */
772 struct fs_struct *fs;
...
}
且
include/linux/fs_struct.h:
struct fs_struct {
...
struct path root, pwd;
}
chroot调用
注意,使用chroot并不是件容易的事情,因为执行chroot后,原来系统中的命令和动态库等都不可用了,所以要预先准备好环境再切换。chroot系统调用只要改变进程根目录就可以了,很简单。
fs/open.c:
482 SYSCALL_DEFINE1(chroot, const char __user *, filename)
483 {
...
503 set_fs_root(current->fs, &path);
...