如何在Linux上使用chroot命令

chroot命令可以将您送进监狱,使您的开发或测试环境保持隔离,或者只是提高系统的安全性。我们向您展示最简单的使用方法。

什么是色罗人?

如果您试图衡量命令的有用性,则必须考虑到它提供的功能及其易用性。如果它对人们来说太复杂了,或者太冗长,让他们想要尝试使用它,那么它的功能还不如是零。如果没有人使用它,它就不会提供任何功能。

在与Linux用户的讨论中-面对面和在论坛上-似乎chroot命令被认为难以使用,或者过于挑剔和乏味,无法设置。看起来这个很棒的实用程序并没有像它应该使用的那样被使用。

使用chroot,您可以在封装的文件系统中设置和运行程序或交互式shell(如Bash),该文件系统被阻止与常规文件系统交互。chroot环境中的一切都被写进并包含其中。在不升级到root权限的情况下,chroot环境中的任何内容都不能超出其自己的特殊根目录。这为这种环境赢得了chroot监狱的绰号。“监狱”这个词不应该与FreeBSD的监狱命令混淆,FreeBSD的监狱命令创建了一个比通常的chroot环境更安全的chroot环境。

但实际上,有一种非常简单的方法来使用chroot,我们将逐步介绍。我们使用的是常规的Linux命令,可以在所有发行版上运行。一些Linux发行版有专门的工具来设置chroot环境,比如针对Ubuntu的debootstrap,但是我们在这里是独立于发行版的。

你应该在什么时候使用色罗?

chroot环境提供类似于虚拟机的功能,但它是一个更轻量级的解决方案。强制系统不需要安装和配置虚拟机管理程序,如VirtualBox或Virtual Machine Manager。它也不需要在强制系统中安装内核。强制系统共享您现有的内核。

在某种意义上,chroot环境更接近诸如lxc之类的容器,而不是虚拟机。它们是轻量级的,部署迅速,并且可以自动创建和启动一个。与容器一样,配置它们的一种方便方法是安装足够的操作系统,使您能够完成所需的任务。“什么是必需的”这个问题的答案是,看看您将如何使用您的cchroot环境。

一些常见用法包括:

软件开发和产品验证。开发人员编写软件,产品验证团队(PV)对其进行测试,有时PV会发现一些无法在开发人员电脑上复制的问题。开发人员在他们的开发计算机上安装了普通用户和PV没有的各种工具和库。通常情况下,对开发者有效而对其他人无效的新软件最终被证明是在使用开发者个人电脑上的资源,而该资源没有包括在软件的测试版本中。Chchroot允许开发者在电脑上拥有一个普通的强制环境,在将软件交给PV之前,他们可以在这个环境中进行绵羊浸泡。可以使用软件所需的最小依赖项来配置强制环境。

降低发展风险。开发人员可以创建一个专用的开发环境,这样在其中发生的任何事情都不会扰乱他的实际PC。

正在运行过时的软件。有时你只需要有一个旧版本的东西在运行。如果旧软件有与你的Linux版本冲突或不兼容的要求,你可以为有问题的软件重新启动一个环境。

恢复和文件系统升级:如果Linux安装变得无法操作,您可以使用chroot将损坏的文件系统挂载到LiveCD上的挂载点。这允许您在损坏的系统中工作,并尝试修复它,就像它正常挂载在root/上一样。这意味着损坏系统内的预期文件路径将从根目录正确引用,而不是从Live CD的挂载点引用。*在描述如何将Linux文件系统从ext2或ext3迁移到ext4的文章中使用了类似的技术。

圈护应用程序。在chroot环境中运行FTP服务器或其他连接互联网的设备可以限制外部攻击者造成的破坏。这可能是加强系统安全性的有价值的一步。

相关:如何在Linux上将ext2或ext3文件系统迁移到ext4

创建chroot环境

我们需要一个目录来充当chroot环境的根目录。这样我们就有了引用该目录的快捷方式,我们将创建一个变量并在其中存储该目录的名称。在这里,我们设置一个变量来存储“testroot”目录的路径。这个目录是否还不存在并不重要,我们很快就会创建它。如果该目录确实存在,则它应该为空。

chr=/home/dave/testroot

如果该目录不存在,我们需要创建它。我们可以使用此命令来实现这一点。-p(父目录)选项可确保同时创建所有缺少的父目录:

mkdir -p $chr

我们需要创建目录来保存chroot环境所需的操作系统部分。我们将设置一个使用Bash作为交互shell的极简主义Linux环境。我们还将包括touch、rm和ls命令。这将允许我们使用Bash的所有内置命令以及触摸、rm和ls。我们将能够创建、列出和删除文件,并使用Bash.cn-在这个简单的示例中-仅此而已。

列出您需要在{}大括号扩展内创建的目录。

mkdir -p $chr/{bin,lib,lib64}

现在,我们将目录更改为新的根目录。

cd $chr

让我们将我们在极简主义Linux环境中需要的二进制文件从常规的“/bin”目录复制到chroot“/bin”目录。-v命令(详细)选项使cp能够在执行每个复制操作时告诉我们它在做什么。

cp -v /bin/{bash,touch,ls,rm} $chr

将为我们复制文件:

这些二进制文件将具有依赖性。我们需要发现它们是什么,并将这些文件复制到我们的环境中,否则bash、touch、rm和ls将无法运行。对于我们选择的每个命令,我们需要依次执行此操作。我们先洗澡。ldd命令将为我们列出依赖项。

ldd /bin/bash

在终端窗口中标识并列出依赖关系:

我们需要将这些文件复制到我们的新环境中。从该列表中挑选详细信息并一次复制一个,将非常耗时且容易出错。

谢天谢地,我们可以半自动完成。“我们将再次列出依赖项,这一次我们将形成一个列表。然后,我们将遍历列表,复制文件。

在这里,我们使用LDD列出依赖项,并通过管道将结果提供给egrep。使用egrep与使用带-E(扩展正则表达式)选项的grep相同。o(唯一匹配)选项将输出限制为行的匹配部分。我们正在查找以数字[0-9]结尾的匹配库文件。

list="$(ldd /bin/bash | egrep -o '/lib.*\.[0-9]')"

我们可以使用Echo查看列表内容:

echo $list

现在我们有了列表,我们可以使用下面的循环逐步执行该列表,一次复制一个文件。我们使用变量i遍历列表。对于列表中的每个成员,我们将文件复制到chroot根目录,这是$chr中保存的值。

-v父目录(详细)选项使cp在执行复制时通告每个副本。--parents选项确保在chroot环境中创建任何缺少的父目录。

for i in $list; do cp -v --parents "$i" "${chr}"; done

下面是输出:

我们将使用该技术来捕获其他每个命令的依赖项。我们将使用循环技术来执行实际的复制。好消息是,我们只需要对收集依赖项的命令进行微小的编辑。

我们可以通过按几次向上箭头键从命令历史记录中检索命令,然后进行编辑。循环复制命令根本不需要更改。

在这里,我们使用向上箭头键查找该命令,并对其进行了编辑,使其显示为touch而不是bash。

list="$(ldd /bin/touch | egrep -o '/lib.*\.[0-9]')"

我们现在可以重复与前面完全相同的循环命令:

for i in $list; do cp -v --parents "$i" "${chr}"; done

我们的文件会自动复制:

我们现在可以编辑ls的list命令行:

list="$(ldd /bin/ls | egrep -o '/lib.*\.[0-9]')"

同样,我们将使用相同的LOOP命令。它不关心列表中有哪些文件。它盲目地浏览列表,为我们复制文件。

for i in $list; do cp -v --parents "$i" "${chr}"; done

并且为我们复制ls的依赖项:

我们最后一次编辑list命令行,使其适用于RM:

list="$(ldd /bin/ls | egrep -o '/lib.*\.[0-9]')"

我们最后一次使用循环复制命令:

for i in $list; do cp -v --parents "$i" "${chr}"; done

我们的最后一个依赖项被复制到chroot环境中。“我们终于准备好使用chroot命令了。该命令设置chroot环境的根,并指定哪个应用程序作为shell运行。

sudo chroot $chr /bin/bash

我们的chroot环境现在处于活动状态。终端窗口提示符已经更改,在我们的环境中,交互shell是由bash shell处理的。

我们可以尝试我们引入到环境中的命令。

lsls /home/dave/Documents

当我们在环境中使用ls命令时,它的工作方式与我们预期的一样。当我们尝试访问环境外部的目录时,该命令失败。

我们可以使用touch创建一个文件,使用ls列出它,使用rm删除它。

touch sample_file.txtlsrm sample_file.txtls

当然,我们也可以使用Bash shell提供的内置命令。如果您在命令行中键入help,Bash将为您列出它们。

help

使用EXIT离开Cchroot环境:

exit

如果要删除chroot环境,只需将其删除即可:

rm -r testroot/

这将递归删除chroot环境中的文件和目录。

为方便起见实现自动化

如果您认为chroot环境可能对您有用,但是设置起来有点麻烦,请记住,您总是可以通过使用别名、函数和脚本来消除重复性任务的压力和风险。

相关:如何在Linux上创建别名和Shell函数

相关文章