web-dev-qa-db-ja.com

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を正常に開くには何が必要ですか?

7
UTF-8

_/bin/bash_が共有ライブラリの依存関係を持つバイナリの場合、これらの依存関係はchroot内で解決できる必要があります。

私のシステムでは:

_$ 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を使っています。 lddの出力の形式はLinuxシステムでは異なりますが、Linuxでも同じ重要な情報(共有されるライブラリーとその場所)を表示する必要があります。

_/bin/sh_と_/bin/bash_( doas のみを含むvery単純なchrootを試すと、OpenBSDの"Sudo replacement"):

_$ 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_は失敗することに注意してください。エラーはあなたのものとは異なりますが、同じ原因があると思います。 chrootコマンドを使用して_/bin/bash_を直接実行すると、おそらく1つの単語の「中止」メッセージが表示されます。これは、おそらくライブラリの同じ問題が原因であると考えられます。

結論: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ファイルfilenameまたはスクリプトまたはELFインタープリターが存在しないか、またはファイルまたはインタープリターに必要な共有ライブラリが見つかりません

さあ、行きます。

14
Kusalananda

インストールシステムとchrootに使用するメディアが同じArchであることを確認してください。

/ mntにマウントするパーティションは、インストールシステムの/パーティションですか?

私はこの方法でchrootします。

Ext *ファイルシステム用。

Sudo mount /dev/sdxY /mnt

個別の/ boot biosモードパーティションの場合

Sudo mount /dev/sdzY /mnt/boot

Efiモードの場合

Sudo mount /dev/sdwY /mnt/boot/efi

マウントヴィトゥエルファイルシステム

for dir in /dev /dev/pts /proc /sys /run; do Sudo mount --bind $dir /mnt/$dir; done

ネットワークアクセスの場合

cp -a /etc/resolv.conf /mnt/etc/resolve.conf

その後

Sudo chroot /mnt /bin/bash

しかし、私はそれをDebianとUbuntuでのみ使用します。

4
user192526

サンプルコードを次のように変更してください:(私のために働いた)

mkdir /tmp/chrootTest
mkdir /tmp/chrootTest/bin
mkdir /tmp/chrootTest/lib
mkdir /tmp/chrootTest/lib64
Sudo mount -B /bin /tmp/chrootTest/bin/
Sudo mount -B /lib /tmp/chrootTest/lib/
Sudo mount -B /lib64 /tmp/chrootTest/lib64/
Sudo chroot /tmp/chrootTest/ /bin/bash
1
Venryx