chroot详解
我是一个刚接触 Linux 和 Unix 的新手。我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密码或修复基于 Linux/Unix的受损坏的环境?
在 Linux和类 Unix 系统下每一个进程/命令的当前工作目录称之为进程/命令的根目录(译注:译者以为此处有误,实际上没有进行过chroot的进程,其根目录是系统的根目录,而不是其工作目录)。你可以使用 chroot 命令改变一个命令的根目录,这最终将会改变当前运行的进程及其子进程的根目录。
如果一个进程/命令运行在一个不能访问外部根目录文件的已修改环境中。这种修改环境通常被称为"监禁目录"(jail)或是"chroot 监禁"。只有特权进程和根用户才能使用 chroot 命令。然而这通常是很有用的: 1.将特权分配给无特权的进程,例如 Web 服务或 DNS 服务。 2.建立测试环境。 3.不使程序或系统崩溃下,运行旧程序或 ABI 兼容的程序。 4.系统恢复。 5.重新安装引导装载程序,例如 Grub 或 Lilo。 6.密码找回,重置一个已丢失的密码等。
用途
chroot 命令 改变其当前目录,并将根目录变为指定目录,然后如果提供了命令则运行命令,也可以运行一个用户的交互式shell的副本(译注:即bash等。)。请注意并不是每一个程序都可以使用 chroot 命令。
语法
基本语法如下: 1.chroot /path/to/new/root command
或者 1.chroot /path/to/new/root /path/to/server
或者 1.chroot [options]/path/to/new/root /path/to/server
chroot 命令实例
在这个例子中,建立了一个"迷你监狱"用来测试一个只有 ls 命令的 Bash shell。首先用 mkdir 命令设定好 jail "监狱" 路径。 1.$ J=$HOME/jail
在 $J 内创建目录: 1.$ mkdir -p $J 2.$ mkdir -p $J/{bin,lib64,lib} 3.$ cd $J
用cp 命令将/bin/bash 和 /bin/ls 复制到 $J/bin/ 路径下: 1.$ cp -v /bin/{bash,ls} $J/bin
将所需库文件拷贝到$J。可以用 ldd 命令找到 bash 所依赖的共享库。 1.$ ldd /bin/bash
输出样例: 1.linux-vdso.so.1=>(0x00007fff8d987000) 2.libtinfo.so.5=>/lib64/libtinfo.so.5(0x00000032f7a00000) 3.libdl.so.2=>/lib64/libdl.so.2(0x00000032f6e00000) 4.libc.so.6=>/lib64/libc.so.6(0x00000032f7200000) 5./lib64/ld-linux-x86-64.so.2(0x00000032f6a00000)
直接拷贝上面输出中的库文件到 $J 目录: 1.$ cp -v /lib64/libtinfo.so.5/lib64/libdl.so.2/lib64/libc.so.6/lib64/ld-linux-x86-64.so.2 $J/lib64/
输出样例: 1.`/lib64/libtinfo.so.5' -> `/home/vivek/jail/lib64/libtinfo.so.5' 2.`/lib64/libdl.so.2'->`/home/vivek/jail/lib64/libdl.so.2' 3.`/lib64/libc.so.6' -> `/home/vivek/jail/lib64/libc.so.6' 4.`/lib64/ld-linux-x86-64.so.2' -> `/home/vivek/jail/lib64/ld-linux-x86-64.so.2'
复制 ls 命令所需的库文件到 $J 目录下。用 ldd 命令打印出 ls 命令依赖的共享库: 1.$ ldd /bin/ls
输出样例: 1.linux-vdso.so.1=>(0x00007fff68dff000) 2.libselinux.so.1=>/lib64/libselinux.so.1(0x00000032f8a00000) 3.librt.so.1=>/lib64/librt.so.1(0x00000032f7a00000) 4.libcap.so.2=>/lib64/libcap.so.2(0x00000032fda00000) 5.libacl.so.1=>/lib64/libacl.so.1(0x00000032fbe00000) 6.libc.so.6=>/lib64/libc.so.6(0x00000032f7200000) 7.libdl.so.2=>/lib64/libdl.so.2(0x00000032f6e00000) 8./lib64/ld-linux-x86-64.so.2(0x00000032f6a00000) 9.libpthread.so.0=>/lib64/libpthread.so.0(0x00000032f7600000) 10.libattr.so.1=>/lib64/libattr.so.1(0x00000032f9600000)
你可以一个个的复制库文件,为了更高效的作业,我们也可以使用bash shell 的循环指令实现: 1.list="$(ldd /bin/ls | egrep -o '/lib.*\.[0-9]')" 2.for i in $list;do cp -v "$i""${J}${i}";done
输出样例: 1.`/lib64/libselinux.so.1' -> `/home/vivek/jail/lib64/libselinux.so.1' 2.`/lib64/librt.so.1'->`/home/vivek/jail/lib64/librt.so.1' 3.`/lib64/libcap.so.2' -> `/home/vivek/jail/lib64/libcap.so.2' 4.`/lib64/libacl.so.1' -> `/home/vivek/jail/lib64/libacl.so.1' 5.`/lib64/libc.so.6'->`/home/vivek/jail/lib64/libc.so.6' 6.`/lib64/libdl.so.2' -> `/home/vivek/jail/lib64/libdl.so.2' 7.`/lib64/ld-linux-x86-64.so.2' -> `/home/vivek/jail/lib64/ld-linux-x86-64.so.2' 8.`/lib64/libpthread.so.0'->`/home/vivek/jail/lib64/libpthread.so.0' 9.`/lib64/libattr.so.1' -> `/home/vivek/jail/lib64/libattr.so.1'
最后,chroot 到你的新jail: 1.$ sudo chroot $J /bin/bash
尝试浏览一下 /etc 或 /var: 1.# ls / 2.# ls /etc/ 3.# ls /var/
改变了根目录的 bash 和 ls 程序现在被监禁在$HOME/$J这个特殊目录中,而且不能再访问外部的目录树,这个目录可以看做是它们的"/"(root)目录。如果配置正确的话,这会极大增强安全性。我通常用这种技术锁定以下的应用程序。 1.Apache - Red Hat / CentOS: Chroot Apache 2 Web Server 2.Nginx - Linux nginx: Chroot (Jail) Setup 3.Chroot Lighttpd web server on a Linux based system 4.Chroot mail server. 5.Chroot Bind DNS server 等等
如何退出 chroot 监禁呢?
键入 exit 即可 1.$ exit
上述会话样例如下:
Animated gif 01: Linux / Unix: Bash Chroot ls Command Demo
Gif 动画01: Linux / Unix: Bash Chroot ls 命令演示
查找服务是否存在于 chrooted 监禁内
你可以用下面两个命令[轻松的找出 Postfix 邮件服务是否已经 chrooted]: 1.pid=$(pidof -s master) 2.ls -ld /proc/$pid/root
从基本Linux服务中输出样例: 1.lrwxrwxrwx.1 root root 0Mar911:16/proc/8613/root ->/
PID 8613 指向了 / (root) 也就是说这个程序的根目录并没有被改变或是被 chroot。这个方法非常的快速而又直接,不需要打开配置文件。下面是从已经 chroot 的 ngnix 服务中得到的另一个例子: 1.pid=$(pidof -s master) 2.ls -ld /proc/$pid/root
输出样例: 1.lrwxrwxrwx 1 nginx nginx 0Mar911:17/proc/4233/root ->/nginxjail
程序的根目录已经改为 /nginxjail。
Ubuntu 14.04 下载、安装、配置的相关知识 http://www.linuxidc.com/Linux/2014-04/100370.htm
Ubuntu 14.04系统下载地址:http://www.linuxidc.com/Linux/2014-04/100352.htm
Windows 7下硬盘安装Ubuntu 14.04图文教程 http://www.linuxidc.com/Linux/2014-04/100983.htm
更多Ubuntu相关信息见Ubuntu 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=2
本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-05/102130.htm linux 本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2014-05/102130.htm
chroot详解的更多相关文章
- Rsync 服务部署与参数详解
Rsync 简介 rsync 是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份的优秀工具.Rsync软件适用于unix/linux/windows等多种操作系统平台. 传统的 ...
- php配置php-fpm启动参数及配置详解
约定几个目录 /usr/local/php/sbin/php-fpm/usr/local/php/etc/php-fpm.conf/usr/local/php/etc/php.ini一,php-fpm ...
- php-fpm 启动参数及重要配置详解
约定几个目录 /usr/local/php/sbin/php-fpm /usr/local/php/etc/php-fpm.conf /usr/local/php/etc/php.ini 一,php- ...
- rsync.conf详解
1.在服务端编辑配置文件 [root@game_intf ~]# more /etc/rsyncd.conf port=8730 log file=/var/log/rsync.log pid fil ...
- Rsync详解
Rsync详解 1.什么是RsyncRsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.Rsync使用所谓的“Rsync算法”来使本 ...
- VSFTPD全攻略(/etc/vsftpd/vsftpd.conf文件详解)
/etc/vsftpd/vsftpd.conf文件详解,分好类,方便大家查找与学习 #################匿名权限控制############### anonymous_enable=YE ...
- Haproxy均衡负载部署和配置文件详解
HAproxy均衡负载部署和配置文件详解 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.根据官方数据,其最高极限支持10G ...
- 负载均衡之Haproxy配置详解(及httpd配置)
下图描述了使用keepalived+Haproxy主从配置来达到能够针对前段流量进行负载均衡到多台后端web1.web2.web3.img1.img2.但是由于haproxy会存在单点故障问题,因此使 ...
- haproxy 安装与配置文件详解
本文主要阐述haproxy的安装配置详解,对于它的概念,作用,功能,和其它LB软件的区别,优点,缺点等不再进行说明. 一. haproxy 的安装配置 # cat /etc/redhat-releas ...
随机推荐
- ArcGis 中MapControl 框选
void mCtrl_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e) ...
- javascript js string.Format()收集
方案1http://www.cnblogs.com/loogn/archive/2011/06/20/2085165.html String.prototype.format = function(a ...
- Android_firstClass
一个Project 创建后,大概的文件目录如下:在Android Studio每个Project,相当于Eclipse 的WorkSpace:每个Module(上图的app 目录)相当于Eclipse ...
- Bolts-Android
对Android客户端编程来说,有个明确的规则是不能在ui线程里面做耗时的操作.这样就要求网络请求.文件读写等等操作都要异步操作.而异步操作完成后,往往需要再更新ui界面.最直接的想法是回调,只要保证 ...
- WPF好看的进度条实现浅谈(效果有点类似VS2012安装界面)
为了界面友好,一般的操作时间较长时,都需要增加进度条提示.由于WPF自带的进度条其实不怎么好看,而且没啥视觉效果.后来,装VS2012时,发现安装过程中进度条效果不错,于是上网查了资料.学习了Mode ...
- survival analysis 生存分析与R 语言示例 入门篇
原创博客,未经允许,不得转载. 生存分析,survival analysis,顾名思义是用来研究个体的存活概率与时间的关系.例如研究病人感染了病毒后,多长时间会死亡:工作的机器多长时间会发生崩溃等. ...
- windows7设置java的环境变量
win7 下配置 java 环境变量 首先,你应该已经安装了 java 的 JDK 了,笔者安装的是:jdk-7u7-windows-x64 接下来主要讲怎么配置 java 的环境变量,也是为了以 ...
- 深入探究javascript的 {} 语句块
今日学习解析json字符串,用到了一个eval()方法,解析字符串的时候为什么需要加上括号呢?摸不着头脑.原来javascript中{}语句块具有二义性,不加括号会出错,理解这种二义性对我们理解jav ...
- 从零开始写redis客户端(deerlet-redis-client)之路——第一个纠结很久的问题,restore引发的血案
引言 正如之前的一篇博文,LZ最近正在从零开始写一个redis的客户端,主要目的是为了更加深入的了解redis,当然了,LZ也希望deerlet客户端有一天能有一席之地.在写的过程当中,LZ遇到了一个 ...
- UITextField实现左侧空出一定的边距
就是通过uitextfield的leftview来实现的,同时要设置leftviewmode. 如果设置左右边距,需要再加上rightView功能 -(void)setTextFieldLeftPad ...