php chroot 中的 DNS 解析

php chroot 中的 DNS 解析

我创建了一个脚本,该脚本创建 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 状态。

相关内容