私は以下がうまくいくと思います:
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を正常に開くには何が必要ですか?
_/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インタープリターが存在しないか、またはファイルまたはインタープリターに必要な共有ライブラリが見つかりません。
さあ、行きます。
インストールシステムと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でのみ使用します。
サンプルコードを次のように変更してください:(私のために働いた)
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