如果该目录不存在,我们需要创建它。我们可以使用此命令来实现这一点。-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处理的。
我们可以尝试我们引入到环境中的命令。
ls
ls /home/dave/Documents
当我们在环境中使用ls命令时,它的工作方式与我们预期的一样。当我们尝试访问环境外部的目录时,该命令失败。
我们可以使用touch创建一个文件,使用ls列出它,使用rm删除它。
touch sample_file.txt
ls
rm sample_file.txt
ls
当然,我们也可以使用Bash shell提供的内置命令。如果您在命令行中键入help,Bash将为您列出它们。
help
使用EXIT离开Cchroot环境:
exit
如果要删除chroot环境,只需将其删除即可:
rm -r testroot/
这将递归删除chroot环境中的文件和目录。
为方便起见实现自动化
如果您认为chroot环境可能对您有用,但是设置起来有点麻烦,请记住,您总是可以通过使用别名、函数和脚本来消除重复性任务的压力和风险。
相关:如何在Linux上创建别名和Shell函数