理解 chroot
2009-07-12 08:32:13 来源:WEB开发网清单 9. 粗略 `chroot` 的使用
$ gcc -Wall test.c -o test
# ./test
# ls
ash: ls: not found
# busybox ls
bin etc newhome test test.c
下面给出功能将近完整的 chroot ,加上了一些错误处理并新增了可执行指定命令的功能。当在没有给出 chroot 切换后要执行的命令时,默认执行 `/bin/sh`,同时检测环境以确认使用何种 shell。
清单 10. 功能完整的 chroot
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if(argc<2){
printf("Usage: chroot NEWROOT [COMMAND...] \n");
return 1;
}
printf("newroot = %s\n", argv[1]);
if(chroot(argv[1])) {
perror("chroot");
return 1;
}
if(chdir("/")) {
perror("chdir");
return 1;
}
if(argc == 2) {
argv[0] = getenv("SHELL");
if(!argv[0])
argv[0] = (char *)"/bin/sh";
argv[1] = (char *) "-i";
argv[2] = NULL;
} else {
argv += 2;
}
execvp (argv[0], argv);
printf("chroot: cannot run command `%s`\n", *argv);
return 0;
}
保存以上代码为 newchroot.c 文件,编译后运行测试其功能。最后要指出的是,本文中的 `chroot` 并没有使用静态编译。如果有必要(如,在 initrd 中使用 chroot),chroot 应该使用静态编译,若是使用动态编译,那么要拷贝相关的动态库文件到相应目录结构中。
清单 11. `newchroot` 的测试
$ gcc -Wall newchroot.c -o newchroot
# ./newchroot . /bin/ash
newroot = .
#
结束语
在 Linux 系统初始引导的过程中,通常都有使用 chroot。但是 chroot 的好处不仅于此,它还增加了系统的安全性等。而通过本文后半部分对 chroot 的认识,我相信读者可以更好的发挥chroot 的作用。
本文源代码下载:http://file.ddvip.com/2009_07/work.tar.bz2
更多精彩
赞助商链接