
現在Debian(wheezy / amd64)で奇妙な問題が発生しました。
サーバーをインストールするためにchrootを作成しました(申し訳ありませんが、詳細は提供できません)。私たちはそれをパスと呼びます/chr_path/
。作業を容易にするために、debootstrap(またwheezy / amd64)を使用してこのchrootを初期化しました。
chroot内ではすべてがうまくいくようですが、サーバーのインストールプログラムスクリプトを起動すると、次のメッセージが表示されます。 (
zsh: Not found /some_path/perl
何らかの理由でインストーラにperlバイナリが含まれているか)
/some_path/
当然、位置を確認してみると「perl」バイナリが見つかりました。file
chroot環境からの返却:
/some_path/perl ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
ファイルが存在し、大丈夫に見え、正しい権限を持っています。file
、を使用できますls
がvim
、実行しようとすると(./perl
たとえば)、次のような結果が表示されますzsh: Not found ./perl
。
この状況は私に理解されます。そして:
- エラーなしでchrootで別のデフォルトのバイナリ(/ bin / ls、...)を実行できます。
- プロジェクトに付属する他のバイナリにも同じ問題があります。
/chr_path/some_path/perl
メインルート()でバイナリを実行しようとすると機能します。- バイナリの1つを私と比較してみました
ls
。アクセス権が同じであることを確認しましたが、何も変更されませんでした(1つは機能し、もう1つは機能しません)。
答え1
「ローダー」に依存するファイルを実行できない場合、受信したエラーは実行中のファイルではなくローダーと関連がある可能性があります。
- 動的にリンクされたデフォルトの実行可能ファイルのローダーは、動的ライブラリーのロードを担当するシステムの一部です。これは
/lib/ld.so
実行可能ファイルに似ており、実行可能ファイルで/lib/ld-linux.so.2
なければなりません。 /bin/sh
スクリプトのローダーは、で始まるスクリプトなど、shebang行に記載されているプログラムです#!/bin/sh
。 (この場合、Bashとzshは「コマンドが見つかりません」の代わりに「無効なソルバー」というメッセージを表示します。)
エラーメッセージは誤解を招き、ローダーに問題があることを示していません。残念ながら、カーネルインターフェイスには数値エラーコードを報告するスペースしかありませんが、エラーが実際に他のファイルに関連付けられていることを示すスペースがないため、この問題を解決するのは困難です。一部のシェルはスクリプト自体に対してこれを行いますが(#!
スクリプトの行を読み取り、エラー条件を再評価します)、ネイティブバイナリに対して同じことをしたいシェルは見たことがありません。
ldd
また、いくつかの特別な環境変数を設定してからプログラムを実行し、ローダーにタスクを実行させることで動作するため、バイナリでは機能しません。strace
また、カーネルが報告する以上を報告しないため、意味のある情報も提供しません。そして私たちが見たように、カーネルは知っているすべてを報告することはできません。
これは通常、正しいシステム(またはシステムスイート)とスーパーアーキテクチャに対してバイナリを実行しようとしていますが、無効なサブアーキテクチャに対して実行しようとしたときに発生します。これにはそれを必要とするシステムにELFバイナリがあるため、カーネルはそれを正しくロードできます。これはx86_64プロセッサで実行されているi386バイナリなので、これらのガイドラインは意味があり、プログラムがそのローダを見つけることができます。ただし、このプログラムは32ビットプログラム(出力に表示されている)で32ビットローダーを探しており、おそらくfile
chrootには/lib/ld-linux.so.2
64ビットローダーのみがインストールされています。/lib64/ld-linux-x86-64.so.2
chroot:ローダーとプログラムに必要なすべてのライブラリに32ビットランタイムシステムをインストールする必要があります。 Debian wheezy から i386 と x86_64 をサポートしたい場合は、amd64 のインストールから起動して有効にしてください。マルチアーキテクチャsupport: run then dpkg --add-architecture i386
(どのライブラリが必要かを調べるために Debian Perl パッケージの依存関係リストを作成する場合はこれを使用できます)。以下をインストールして、公共図書館のコレクションをインポートできます。apt-get update
apt-get install libc6:i386 zlib1g:i386 …
aptitude search -F %p '~Rdepends:^perl$ ~ri386'
ia32-libs
パッケージ(最初にマルチアーキテクチャサポートを有効にする必要があります)Debian amd64からwheezyまで32ビットローダーがあります。libc6-i386
パック。以下をインストールして、より大きな32ビットライブラリセットをインストールできます。ia32-libs
。
答え2
ldd(1)
バイナリで実行してくださいperl
。Not found
明らかに、存在するファイルの見かけ上の混乱は、プログラムが使用している共有ライブラリの1つが見つからないために発生することがよくあります。
したがって、バイナリに必要な共有ライブラリに対してchrootが不完全になる可能性があります。