Busybox / Ash 究竟是什么?

Kaz*_*lfe 6 command-line

真的,busybox 和 ash 是什么?

我从来没有见过对它是什么的很好的解释。

我用过它,我知道它是一个 Linux shell,但我想真正了解它。

psu*_*usi 9

与 相比bash,Ash 是一个简单的 unix shell,后者是 Linux 系统上首选的更典型的全功能 shell。

Busybox 是一个实现ash类似 shell的程序,以及许多其他常见的 unix 程序,虽然是精简版,但都在一个程序中。它旨在在空间非常有限的环境中提供一个半典型的类 Unix 环境,因此,为什么它将许多(精简的)程序实现为单个程序,然后将单独的程序命令符号链接到 busybox 二进制文件,这就说明了它应该模拟哪个程序,并尽最大努力以与它正在替换的全功能程序类似的方式运行。

Busybox 最初是为在空间非常有限的环境中使用而开发的,例如单个软盘引导盘,并且今天继续在空间有限的环境中使用,例如 dd-wrt ​​等嵌入式系统。


Gab*_*les 6

它是什么busybox以及如何在一个可执行文件中包含多个可执行文件?

让我阐述一下@psusi 的答案。

@psusi 说(强调):

Busybox 是一个程序,它实现了像 ash 这样的 shell,以及许多其他常见的 UNIX 程序,尽管在精简版本中,所有这些都在一个程序中......因此,为什么它将许多(精简的)程序实现为单个程序程序,然后将单独的程序命令符号链接到 busybox 二进制文件,它会找出应该模拟哪个程序,并尽力以与它正在替换的功能齐全的程序类似的方式运行。

看一下这个。以下内容很有趣,并证实了上面引用中的内容。

ls -alF /bin以下是嵌入式 Linux 设备上输出开头的片段。正如您所看到的,几乎所有可执行文件/bin实际上都是符号链接(顺便说一下,/bin/busybox可以使用 来调用):/bin/busybox <cmd>

/bin# ls -alF /bin
total 1184
drwxr-xr-x    2 root     root          4096 Nov 11  2021 ./
drwxr-xr-x   22 root     root          4096 Nov 11  2021 ../
lrwxrwxrwx    1 root     root             7 Nov 11  2021 arch -> busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 ash -> busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 base64 -> busybox*
-rwsr-xr-x    1 root     root        709792 Nov 11  2021 busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 cat -> busybox*
-rwxr-xr-x    1 root     root         10288 Nov 11  2021 chattr*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 chgrp -> busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 chmod -> busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 chown -> busybox*
-rwxr-xr-x    1 root     root          1342 Nov 11  2021 compile_et*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 cp -> busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 cpio -> busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 date -> busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 dd -> busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 df -> busybox*
Run Code Online (Sandbox Code Playgroud)

因此,如果您运行ashwhich ash则显示ash可执行文件位于/bin/ash,并ls -alF /bin/ash显示该可执行文件是 的符号链接busybox。注意/bin/ash -> busybox**最后的 是由于标志ls -F表示“可执行”

/bin# la -alF /bin/ash
lrwxrwxrwx    1 root     root             7 Nov 11  2021 /bin/ash -> busybox*
Run Code Online (Sandbox Code Playgroud)

因此,运行ash与运行相同,/bin/ash运行与运行相同busybox ash,运行与运行相同/bin/busybox ash

一旦我运行其中任何一个ashbusybox ashcmd,我就可以看到 的输出echo $0已从 更改-sh为,这意味着我现在正在默认 shell 内ash运行shell 。会把我从壳里带出来,又带回壳里。ash-shexitash-sh

要查看所有可以运行的程序busybox,只需键入busyboxor busybox --help,它就会显示编译到其二进制文件中的所有程序的大列表。或者,使用busybox --list在单独的行中查看它们。将它们运行为:

/bin# ls -alF /bin
total 1184
drwxr-xr-x    2 root     root          4096 Nov 11  2021 ./
drwxr-xr-x   22 root     root          4096 Nov 11  2021 ../
lrwxrwxrwx    1 root     root             7 Nov 11  2021 arch -> busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 ash -> busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 base64 -> busybox*
-rwsr-xr-x    1 root     root        709792 Nov 11  2021 busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 cat -> busybox*
-rwxr-xr-x    1 root     root         10288 Nov 11  2021 chattr*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 chgrp -> busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 chmod -> busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 chown -> busybox*
-rwxr-xr-x    1 root     root          1342 Nov 11  2021 compile_et*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 cp -> busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 cpio -> busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 date -> busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 dd -> busybox*
lrwxrwxrwx    1 root     root             7 Nov 11  2021 df -> busybox*
Run Code Online (Sandbox Code Playgroud)

无论如何,busybox 是小型嵌入式 Linux 设备的流行程序,其中 Linux 是使用构建工具(例如BuildrootYocto这两个主要工具)进行自定义构建的。

什么是ash

概括:

Ash 是一个 shell 或终端程序。Kenneth Almquistash于 1989 年 5 月 30 日制作,勉强抢先bash,仅一周后即 1989 年 6 月 8 日发布。Herbert Xuash于 1997 年移植到 Debian Linux,并将其称为dashDebian Almquist shell”

Busybox 包含 的实现ash,该实现是 的派生dash,并且是“busybox 中包含的最完整且最迂腐正确的 shell”。

细节:

在 busybox 的上下文中,ash是一个内置的 shell busybox,可以通过调用来运行busybox ash,如上所述。

busybox源代码在这里声明它的内置版本ash是(强调是添加的):

busybox 包含最完整、最迂腐正确的 shell。该 shell 实际上是 Debian 'dash' shell(由 Herbert Xu 编写)的衍生版本,它是通过从 NetBSD 移植 'ash' shell(由 Kenneth Almquist 编写)创建的。

当它说 busyboxash是“busybox 中包含的最完整、最迂腐的正确 shell”时,我并不是 100% 清楚,但似乎 busyboxash有一堆构建选项,可以使其bash更完整、更完整,喜欢bash。例如,在这些文件中搜索“bash”,可以看到大量对看似选项的引用,其行为ash如下bash

  1. busybox/shell/ash.c
  2. busybox/shell/Config.src

根据维基百科的Almquist shell文章,原始版本ash是 Almquist shell,最初发布于 1989 年 5 月 30 日。

与此相比bash,仅 1 周后即 1989 年 6 月 8 日发布!

另外根据上面的 Wikipedia Almquist shell文章,dash它是 Debian Linux 的一个端口ash(强调已添加):

1997 年,Herbert Xuash从 NetBSD 移植到 Debian Linux。2002 年 9 月,随着 0.4.1 版本的发布,该端口更名为 Dash(Debian Almquist shell)。Xu 的主要优先事项是 POSIX 一致性和精简实施。

并且,根据上面对 busybox 源代码的引用,busybox 的ash“实际上是 Debian shell 的衍生品dash(由 Herbert Xu 编写)”。

也可以看看:

  1. https://unix.stackexchange.com/questions/82357/what-do-the-symbols-displayed-by-ls-f-mean/82358#82358
  2. =、*、|等符号代表什么 “ls -F”的输出是什么意思?

  • 这个答案真是太棒了,有很多细节和揭秘!我拼命地寻找它,但发现很难有适当的深入解释......非常感谢。 (3认同)