Chrootは `/bin/bash`を見つけることができません

Chrootは `/bin/bash`を見つけることができません

私は次がうまくいくと仮定します:

mkdir /tmp/chrootTest # Create chroot folder.
mkdir /tmp/chrootTest/bin # Create `/bin` in the chroot folder.
sudo mount -B /bin /tmp/chrootTest/bin/ # Bind-mount the real system's `/bin` to the chroot's `/bin`.
sudo chroot /tmp/chrootTest/ /bin/bash # Execute (open) `/bin/bash` in the chroot.

しかし、最後のコマンドは以下を生成します。

chroot: failed to run command ‘/bin/bash’: No such file or directory

/binまた、コピーして完全な/tmp/chrootTest/bin権限を付与してみました。しかし、これも動作しません。

/bin/bash他のファイルが見つからないため、非常に基本的なchrootでは動作できないというエラーメッセージが表示されても、まったく驚かないことがあります。しかし、ファイルが明らかに存在するため、印刷されたエラーメッセージは驚くべきことです。

なぜこれが起こるのですか? chrootでbashを正常に開くには何が必要ですか?

ベストアンサー1

共有ライブラリの依存関係があるバイナリの場合は、/bin/bashchroot内でその依存関係を解決できる必要があります。

私のシステムでは:

$ ldd $( command -v bash )
/usr/local/bin/bash:
        Start            End              Type Open Ref GrpRef Name
        0000115f08700000 0000115f08a0c000 exe  1    0   0      /usr/local/bin/bash
        00001161f6a2e000 00001161f6c88000 rlib 0    1   0      /usr/lib/libtermcap.so.14.0
        00001161bc41e000 00001161bc629000 rlib 0    1   0      /usr/local/lib/libintl.so.6.0
        000011614b1de000 000011614b4dd000 rlib 0    2   0      /usr/local/lib/libiconv.so.6.0
        00001161bd091000 00001161bd35b000 rlib 0    1   0      /usr/lib/libc.so.89.2
        000011612ef00000 000011612ef00000 rtld 0    1   0      /usr/libexec/ld.so

比較してみると:

$ ldd $( command -v sh )
/bin/sh:
        Start            End              Type Open Ref GrpRef Name
        000007ca3c446000 000007ca3c6c6000 dlib 1    0   0      /bin/sh

私はOpenBSDを使用しています。出力形式はLinuxシステムでは異なりますが、lddLinuxでも同じ基本情報(共有ライブラリと場所)を表示する必要があります。

私が使用しようとすると非常に簡略化されたchrootに/bin/shおよび/bin/bashdoasOpenBSDの「sudo代替」):

$ doas chroot -u kk t /bin/sh
/bin/sh: No controlling tty (open /dev/tty: No such file or directory)
/bin/sh: warning: won't have full job control
$ /bin/bash
Abort trap

シェル()を取得し/bin/shました/bin/bashが失敗しました。このエラーはあなたのエラーとは異なりますが、原因は同じだと思います。/bin/bashこのコマンドを直接実行すると、chroot「Abort」という単語メッセージのみが表示されます。これはおそらくライブラリと同じ問題によるものです。

結論として: chrootには、実行可能ファイルを実行するために必要なデバイスファイルとライブラリを含む、少なくともシステムの最小インストールを含める必要があります。

Linuxの「該当するファイルまたはディレクトリがありません」エラーの説明:

Linuxでエラーが「該当するファイルまたはディレクトリなし」である理由は少し混乱していますstrace

execve()シェルへの呼び出しはENOENTを返す必要があります。

execve("/bin/bash", ["/bin/bash"], [/* 13 vars */]) = -1 ENOENT (No such file or directory)

...だから何か問題があると思います。発見する/bin/bash。しかし、execve(2)マニュアルを読んだ後、次のことがわかりました。

ENOENTファイル名やスクリプト、ELF ソルバーは存在しません。または、インタプリタが必要とするファイルまたは共有ライブラリが見つかりません

それではそうします。

おすすめ記事