私は次がうまくいくと仮定します:
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/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を使用しています。出力形式はLinuxシステムでは異なりますが、ldd
Linuxでも同じ基本情報(共有ライブラリと場所)を表示する必要があります。
私が使用しようとすると非常に簡略化されたchrootに/bin/sh
および/bin/bash
(doas
OpenBSDの「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 ソルバーは存在しません。または、インタプリタが必要とするファイルまたは共有ライブラリが見つかりません。
それではそうします。
答え2
インストールシステムとchrootに使用されるメディアのアーキテクチャが同じであることを確認してください。
/ mntにマウントされたパーティションは、システムをインストールしたとき/パーティションと同じですか?
私はこのようにchrootします。
ext* ファイルシステムの場合。
sudo mount /dev/sdxY /mnt
別の/boot BIOSモードパーティションの場合
sudo mount /dev/sdzY /mnt/boot
efiモードの場合
sudo mount /dev/sdwY /mnt/boot/efi
Vituelleファイルシステムのマウント
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でのみ使用しています。
答え3
サンプルコードを次のように修正してください。 (私にとって効果的でした)
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