NAME
chroot - run command or interactive shell with special root directory
SYNOPSIS
chroot NEWROOT [COMMAND...]
chroot OPTION
DESCRIPTION
Run COMMAND with root directory set to NEWROOT.
If no command is given, run ‘‘${SHELL} -i’’ (default: /bin/sh).
chroot的主要作用是,切换NEWROOT为根目录,然后以NEWROOT为根目录执行COMMAND,假如COMMAND是一个shell,则启动这个shell,在这个shell里,根目录其实就是NEWROOT了。假如没有给定COMMAND,就执行“${SHELL} -i”,默认情况下是/bin/sh。
在测试环境中使用了busyboy工具包,BusyBox 是很多标准 Linux® 工具的一个单个可执行实现。BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大、更复杂的工具,例如 grep、find、mount 以及 telnet(不过它的选项比传统的版本要少);有些人将 BusyBox 称为 Linux 工具里的瑞士军刀【1】。
测试目录为:/root/work,在改目录里新建了bin, etc,home三个目录,busybox在bin目录中。
# tree
.
|-- bin
| `-- busybox
|-- etc
`—home
切换到/root/work/bin目录中,执行下面的命令,新建一个名为指向busybox的名为ash的软链接文件,执行该文件将会执行busybox工具包中的ash,这是一个简单的shell
#ln –s busybox ash
# tree
.
|-- bin
| |-- ash -> busybox
| `-- busybox
|-- etc
`—home
执行chroot命令切换当前目录为根目录,同时执行/bin/ash,这个路径是当前路径被设置为根路径情况下的,实际位置就是/root/work/bin/ash
# chroot . /bin/ash
chroot: cannot run command `/bin/ash': Permission denied //这种情况是因为busybox没有可执行的权限导致的
#chmod u+x bin/busybox //给busybox增加可执行权限
#chroot . /bin/ash //执行成功,切换进入一个新的shell
# pwd //可以看到,在这个新的shell,/root/work已经是根目录了
/
# ls //但我们执行ls,报告没有ls这个文件,在busybox是包含了ls的
/bin/ash: ls: not found
# busybox ls //通过这种方法就可以调用busyboy中的ls了,但是执行起来很麻烦
bin etc home
# cd bin
# busybox ln -s busybox ln
# ln -s busybox ls //新建了ln,ls链接文件,可以直接使用ln和ls命令,可以用相同的办法新建chmod,vi等busybox支持的命令
# ls
ash busybox ln ls
#echo $PATH //虽然根目录改了,但是环境变量还是没有变
#exit //退出ash
# chroot . /bin/bash出现上面这种情况,很多人可能会有些疑惑,这是因为执行命令是是在/root/wanghf/bin/中寻找bash可执行文件,而不是在/bin中寻找,COMMAND里面调用的命令必须要在/root/work/bin中找到。
[1]BusyBox 简化嵌入式 Linux 系统 http://www.ibm.com/developerworks/cn/linux/l-busybox/
[2]理解chroot http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/