DNS解析在php chroot中

我创建了一个脚本,它创建了一个chroot并设置了php-fpm和apache2来使网站正常工作.
在我的脚本中,我使用以下方法将所有必需的lib复制到我的chroot lib(s)dir(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")); 
?>

除非libs中有libnss_dns.so.1,否则它无法解析.
现在我的问题是:我需要’ldd’将libnss_dns复制到我的chroot中的文件是什么?

PS:我不想手动复制它,因为我希望我的脚本是跨架构的.

解决方法:

没有可以提供给ldd的选项,也没有可以调用的ldd功能,使其在要复制的库列表中包含libnss_dns.so.1.该库是在运行时动态加载的,因为与动态链接器无关的配置文件的内容(即/etc/nsswitch.conf)和ldd根本无法知道程序可能或可能不会在此动态加载的库.办法.

您会发现可能会有一大堆其他文件需要手动复制以生成工作chroot:从/ dev / null到语言环境配置的所有内容,具体取决于您使用的内容.

PS: I don’t want to copy it manually because I want my script to be cross architecture.

不幸的是,正确使用chroot本身就是一种非便携式的东西.也就是说,没有标准的API可用于设置一个.

(我认为你并不是指“交叉架构”:假设你有一个工作程序来设置一个chroot,比如SPARC,完全相同的程序应该可以正常工作,比如x86_64,给定相同的操作系统.)

您可能会尝试使用debootstrap之类的东西来设置新的chroot.至少它与包管理器绑定,因此它确保存在所有依赖项.即使这样,debootstrap确实会将一些系统文件(例如/ etc / fstab)保留为某种TODO状态.

上一篇:libraries – 查找已编译C程序的依赖项


下一篇:java – 在64位Linux安装上缺少32位库