chroot环境

本文介绍了如何通过chroot和changeroot技术改变程序运行环境,包括检测依赖库、复制库文件、使用包管理工具安装软件包、以及利用BusyBox创建轻量级虚拟环境。最后提到将程序依赖封装进Docker镜像以实现隔离运行。
摘要由CSDN通过智能技术生成

关于隔离环境--CHROOT

chroot - change root, 主要是将程序运行环境切换到指定目录。什么是将运行环境切换到指定目录呢,就是切换过去之后,在应用程序内,根目录“/”的位置变成了你指定的目录了,这样一来,就要求你的目录下必须包括程序的所有依赖环境,比如程序调用的系统命令(及其依赖项),系统调用的动态链接库等。

建立CHROOT环境

检查需要在CHROOT下运行程序的依赖库

为了检测我们的程序调用了哪些动态链接库,我们可以使用ldd命令,例如:

ldd /bin/bash

该命令会运行某个/bin/bash文件,并追踪该文件加载的动态链接库,*.so文件。

P.S. ldd命令是一个脚本文件,经过查看,发现其本质是通过调用bash内置的eval命令,追踪其调用的动态链接库。上述命令实际上就等价于:

eval LD_TRACE_LOADED_OBJECTS=1 LD_VERBOSE=1 /bin/bash

在系统上缺少ldd命令时,可以执行此命令,如果此命令查找的依赖项不全,还可以通过以下命令检查在内存中正常运行程序所加载的动态库

pmap $PID

lsof -p $PID

P.S. 以上分析都会使程序运行并加载到内存中,对于未知程序来说具有较高的风险性,针对未知程序来说,一般建议使用readelf, nm, objdump之类的反编译工具。不过通过这种方式获取到的依赖结果不是特别完整就是了。

我们将依赖文件拷贝到CHROOT的目录下

mkdir -p $DIR/lib64
cp -pfL /lib64/xxx.so.y $DIR/lib64/

构建部分所需的设备文件(一般来说不需要,但对于一些访问系统底层功能的应用可能会用到,比如常见的真随机数设备/dev/random)

ls -l /dev/{random,stdin,stdout,stderr,tty} #查看设备文件类型及主次设备号

按照同样的配置权限、类型、主次设备号构建

mknod -m 666 random c 1 8 

该命令创建random设备文件,模式为rw-rw-rw, 设备类型为c(CHAR),主设备号1,次设备号8,可通过ls -l /dev/random 查看

注:实测貌似/dev/stdin, stdout, stderr貌似不需要创建

二、以指定目录为根目录并快速创建CHROOT环境

不管是常见的包管理工具,还是系统自带的rpm工具,都能以指定目录为根目录安装软件包。并在指定目录下释放相关文件。

使用rpm工具

rpm --root=/opt/c-root -ivh xxxx.rpm

如果不检查依赖,则加上 --nodeps 参数

使用yum包管理

yum --installroot=/opt/c-root/ install package-name

这个就比较厉害了,会将软件包相关文件及其依赖项安装到特定目录,这里是/opt/c-root/,这样,通常情况下,直接就能以chroot方式运行了。

编译安装

./configure --prefix=/opt/c-root

默认情况下会将文件编译安装到/usr目录下

通过busybox快速获得一个虚拟环境

yum --installroot=/opt/c-root install busybox
cd /opt/c-root/sbin
ln -s busybox ln
ln -s busybox sh
ln -s busybox clear
....
chroot /opt/c-root sh

解析出程序依赖项后,只需要将相关文件封装进以当前运行的操作系统版本的基础docker镜像,然后写好启动命令即可。当然理论比较简单,实际操作起来就是另一回事了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值