将指定的目录作为根目录来运行程序
命令行语法格式
chroot [OPTION] NEWROOT [COMMAND [ARG]…]
chroot OPTION
命令描述
命令chroot可以指定一个目录来做为程序运行的根目录。NEWROOT是新的根目录,在NEWROOT中运行COMMAND。在很多系统上,只有超级用户才能做到这一点。
通常,程序运行时是从目录结构的根目录(/)开始查找文件名及依赖的库文件。chroot将根目录更改为NEWROOT目录(目录必须存在),然后将工作目录更改为根目录(/),最后运行带有可选参数的命令(COMMAND)。如果没有指定COMMAND,则默认的COMMAND是”${SHELL} -i” (通常是:’/bin/sh -i’)。COMMAND不能是内建程序。
命令行选项及含义
将指定的目录作为根目录来运行程序,也就是改变了程序运行时加载的各种库、目录等环境
通常,命令运行时,是从根目录开始查找文件名,即/。chroot将根目录更改为NEWROOT(必须存在),然后将工作目录更改为/,并最终使用可选参数运行命令。如果未指定命令,则默认值为SHELL环境变量的值或/bin/sh(如果未设置),则使用-i选项调用。命令不能是特殊的内置实用程序(请参阅特殊内置实用程序)。
–userspec=USER:GROUP
默认情况下,使用了哪个用户身份运行chroot,就会使用哪个用户身份运行COMMAND。该此选项可以指定运行COMMAND的用户身份(用户和组)。如果仅仅指定了USER,则会根据系统中USER对应的组来设置COMMAND运行时的组(GROUP),除非使用–groups选项进行覆盖。
–groups=G_LIST
使用此选项覆盖新进程使用的补充组。参数G_LIST是使用逗号分隔的组名或者GID。使用–groups=”禁用–userspec选项中隐含的补充组查找。
–skip-chdir
使用该选项后,进入chroot之后,不会将工作目录修改为/。只有当NEWROOT是旧的根目录时才允许使用此选项,因此与–groups和–userspec选项一起使用来保留以前的工作目录时非常有用。
–help
显示帮助信息并退出。
–version
显示版本信息并退出。
注意事项
–userspec与–groups会在chroot的外部和内部同时进行查找,如果查找成功,内部的查找结果的优先级更高。
如果用户名或者组名为数字时,可以使用前导加号(+)来避免被解析成组ID数值。参考区别组名与组ID。
实际用途
你可能很少会用到这个命令,也许你还没理解这个命令是干什么的,你可以把它想象成一个超级简易版的Docker。
我们在编译OpenJDK 6的时候用到了这个命令。因为很多大型工程在编译的时候,非常依赖于环境操作系统的环境。比如说OpenJDK 6在在Ubuntu 10.10上可以编译成功,但是不代表他就可以在Ubuntu 16.04上编译成功,因为在这两个系统上编译时使用的库路径、版本等信息有所不同,所以在Ubuntu 16.04上编译就可能失败。我们将Ubuntu 10.10整个系统在虚拟机中安装后,复制出整个系统到Ubuntu 16.04的某个目录中,使用chroot将这个目录做为根目录,我们就可以在Ubuntu 16.04上编译OpenJDK 6了,但本质上还是在Ubuntu 10.10的环境下进行的编译动作。当然你可以说直接在虚拟机里编译就行了,不用这么麻烦。但是,在虚拟机了无法将硬件的性能完全的发挥出来。而在真机里使用chroot会更好一点。
说道这里,但愿你明白了chroot是个什么东西,由什么作用。
相关手册
chroot(2)
查看在线手册:http://www.gnu.org/software/coreutils/chroot
查看info手册:info ‘(coreutils) chroot invocation’
参考文献
- man 8 chroot, version GNU coreutils 8.26
- LFS/6.4. Entering the Chroot Environment
更新日志
- 07/10/2017 为了创建编译环境创建了这篇文章,学习一下chroot
- 06/10/2018 调整文章结构,完善文章内容