私はchrootを生成し、php-fpmとapache2を設定してWebサイトが機能するようにするスクリプトを作成しました。私のスクリプトでは、以下を使用して必要なすべてのライブラリを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がライブラリに存在しない場合は解決されません。今私の質問は:libnss_dnsを私のchrootに "ldd"コピーするためにどんなファイルが必要ですか?
PS:私のスクリプトがアーキテクチャの簡易化になりたいので、手動でコピーしたくありません。
答え1
オプションを指定しldd
たり、ldd
関数を呼び出してコピーするlibnss_dns.so.1
ライブラリのリストに含めることはできません。構成ファイルの内容は動的リンカー(例/etc/nsswitch.conf
:)とは無関係であり、ldd
プログラムがこのようにしてどのライブラリーを動的にロードするかを知る方法がないため、ライブラリーは実行時に動的にロードされます。
/dev/null
動作するchrootを作成するには、使用している項目によっては、ロケール設定から地域設定まですべてのファイルを手動でコピーする必要があります。
PS:私のスクリプトがアーキテクチャの簡易化になりたいので、手動でコピーしたくありません。
残念chroot
ながら、それを正しくすることは本質的に移植性がないことです。つまり、設定に使用できる標準APIはありません。
(ここでは「クロスアーキテクチャ」を意味するわけではありません。SPARCにルート指定のワーカープログラムがあると仮定すると、同じプログラムが同じOSのx86_64で正しく実行される必要があります。)
debootstrap
新しいchrootを設定するのと同じことを試すことができます。少なくともパッケージマネージャに関連付けられているので、すべての依存関係が存在することを確認してください。それにもかかわらず、debootstrap
複数のシステムファイル(例:)は/etc/fstab
TODO状態のままです。