Busybox/Ash 到底是什么?

Busybox/Ash 到底是什么?

BusyBox 和 ash 是什么?

我从未见过对它们是什么的很好的解释。

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

答案1

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

Busybox 是一个程序,它实现了ash类似的 shell,以及许多其他常见的 unix 程序,尽管是精简版,但都包含在单个程序中。它旨在在空间非常有限的环境中提供半典型的类 unix 环境,因此,它将许多(精简版)程序实现为单个程序,然后将单独的程序命令符号链接到 busybox 二进制文件,该二进制文件会确定它应该模拟哪个程序,并尽力使其行为类似于它要替换的全功能程序。

Busybox 最初是为在空间极其有限的环境(例如单个软盘启动盘)中使用而开发的,如今仍在空间有限的环境(例如 dd-wrt ​​等嵌入式系统)中使用。

答案2

它是什么busybox?它如何在一个可执行文件内包含许多可执行文件?

让我详细阐述一下@psusi 的回答。

@psusi 说(强调添加):

Busybox 是一个实现了类似 ash shell 的程序,以及许多其他常见的 unix 程序,尽管是精简版,全部包含在一个程序中...因此,它实现了许多(精简版)程序作为单个程序, 和然后将单独的程序命令符号链接到 busybox 二进制文件,它会找出应该模拟哪个程序,并尽力使其行为与它所替代的全功能程序相似。

看看这个。下面的内容很有趣,证实了上面引文中所说的内容。

以下是嵌入式 Linux 设备上输出开头的片段ls -alF /bin。如您所见,中的几乎所有可执行文件/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*

因此,如果您运行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*

因此,跑步ash与跑步相同,/bin/ash跑步与跑步相同,busybox ash跑步与跑步相同/bin/busybox ash

一旦我运行其中任何一个ashbusybox ashcmd,我都可以看到的输出echo $0已经从变为-shash这意味着我现在正在ash默认-shshell内运行shell。exit将使我退出ashshell并返回-shshell。

要查看所有可以运行的程序busybox,只需输入busyboxbusybox --help,它就会列出编译到二进制文件中的所有程序。或者,使用busybox --list以在单独的行中查看所有程序。以如下方式运行它们:

busybox program_name args

无论如何,busybox 是一个适用于小型嵌入式 Linux 设备的流行程序,其中 Linux 是使用构建工具自定义构建的,例如构建根或者约克托,其中两个是主要的。

什么是ash

概括:

Ash 是一个 shell 或终端程序。Kenneth Almquistash于 1989 年 5 月 30 日制作,几乎早于bash,后者于 1989 年 6 月 8 日仅一周后发布。Herbert Xuash于 1997 年将其移植到 Debian Linux 上,并称其dash“Debian Almquist 外壳”

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 壳文章,的原始版本ash是 Almquist shell,最初于 1989 年 5 月 30 日发布。

比较一下bash,仅一周后,即 1989 年 6 月 8 日发布!

根据维基百科Almquist 壳上面的文章dash是移植ash到 Debian Linux 的(重点添加):

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

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

也可以看看:

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

相关内容