我创建了一个脚本,该脚本创建 chroot 并设置 php-fpm 和 apache2 以使网站正常工作。在我的脚本中,我使用以下命令将所有必需的库复制到我的 chroot lib(s) 目录:
fileArray=$(ldd /usr/bin/php* 2>/dev/null | awk 'NF == 4 {print $3}; NF == 2 {print $1}' | sort -u)
for file in $fileArray
do
dirName="$(dirname $file)"
[ ! -d "$serverDir$dirName" ] && mkdir -p "$serverDir$dirName" || :
cp $file "$serverDir$dirName"
done
但我发现如果我使用这样的小脚本:
<?php
print_r(gethostbynamel("google.com"));
?>
除非库中有 libnss_dns.so.1,否则它不会解析。现在我的问题是:我需要“ldd”将 libnss_dns 复制到我的 chroot 的文件是什么?
PS:我不想手动复制它,因为我希望我的脚本是跨架构的。
答案1
您无法提供任何选项ldd
,也ldd
无法调用任何功能来使其包含libnss_dns.so.1
在要复制的库列表中。该库是在运行时动态加载的,因为配置文件的内容与动态链接器(即/etc/nsswitch.conf
)无关,并且ldd
根本无法知道程序可能会或可能不会以这种方式动态加载哪些库。
您会发现可能需要手动复制各种其他文件才能创建有效的 chroot:从语言/dev/null
环境配置到区域设置的所有内容,具体取决于您所使用的内容。
PS:我不想手动复制它,因为我希望我的脚本是跨架构的。
不幸的是,获得chroot
恰到好处本质上是一件不可移植的事情。也就是说,没有可用于设置的标准 API。
(我认为你在这里的意思并不是“跨架构”:假设你有一个在 SPARC 上设置 chroot 的工作程序,在相同的操作系统下,完全相同的程序应该在 x86_64 上运行得很好.)
您可以尝试使用诸如debootstrap
设置新的 chroot 之类的方法。至少它与包管理器绑定在一起,因此它确保所有依赖项都存在。即便如此,debootstrap
仍然会留下几个系统文件(例如/etc/fstab
)处于一种 TODO 状态。