有名な nix Recovery Legend を読んでいて、不思議に思いました:
BusyBoxシェルを開いていて、BusyBoxバイナリ自体が削除されている場合でも、BusyBoxバイナリに含まれているすべてのコマンドを使用できますか?
BusyBoxファイルがあるため、bash
などのシェルを実行しているanotherからのコマンドのBBバージョンを使用できないことは明らかです。 bash
自体を開いて実行することはできません。しかし、BusyBoxの実行中のインスタンスから、BBがコマンドを実行する2つの方法があるように思えます。
(1)がBusyBoxの動作方法である場合、BBバイナリが削除された後、実行中のBBのインスタンス内から特定のBusyBox提供のコマンドが使用できなくなると予想します。
(2)が機能している場合、BusyBoxの実行中のインスタンスがまだアクセス可能であれば、BB自体が削除されたシステムの回復にもBusyBoxを使用できます。
これはどこかに文書化されていますか?そうでない場合、安全にテストする方法はありますか?
デフォルトでは、BusyBoxは、組み込みのアプレット(busybox --help
でリストされたコマンド)に関して特別なことは何もしません。
ただし、FEATURE_SH_STANDALONE
およびFEATURE_PREFER_APPLETS
オプションがコンパイル時に有効になっている場合、BusyBoxsh¹が既知のアプレット名であるコマンドを実行すると、通常のPATH
ルックアップは行われません。 、しかし代わりにショートカットを通してビルトインアプレットを実行します:
chgrp
、chmod
、chown
、cksum
、cp
、cut
、dd
、dos2unix
、env
、fold
、hd
、head
、hexdump
、ln
、ls
、md5sum
、mkfifo
、mknod
、sha1sum
、sha256sum
、sha3sum
、sha512sum
、sort
、tac
、unix2dos
。[[
、[
、basename
、cat
、dirname
、echo
、false
、fsync
、length
、logname
、mkdir
、printenv
、printf
、 pwd
、rm
、rmdir
、seq
、sync
、test
、true
、usleep
、whoami
、yes
。fork
およびexecve
を使用)。ただし、PATH
ルックアップを実行する代わりに、BusyBoxは/proc/self/exe
を実行します(可能な場合)。 Linuxの場合)、それ以外の場合はコンパイル時に定義されるパス。これは docs/nofork_noexec.txt
でもう少し詳しく説明されています。アプレット宣言は、ソースコードのinclude/applets.src.h
にあります。
ほとんどのデフォルト設定ではこれらの機能がオフになっているため、BusyBoxは他のシェルと同様に外部コマンドを実行します。 Debianはbusybox
およびbusybox-static
パッケージの両方でこれらの機能をオンにします。
したがって、FEATURE_SH_STANDALONE
およびFEATURE_PREFER_APPLETS
でコンパイルされたBusyBox実行可能ファイルがある場合、実行可能ファイルが削除されていても、BusyBoxシェルからすべてのBusyBoxコマンドを実行できます(上記にリストされていないアプレットを除く)。 /proc/self/exe
は使用できません)。
¹ BusyBoxには実際には「sh」の2つの実装(ashとhush)がありますが、この点では同じように動作します。