BusyBox 和 ash 是什么?
我从未见过对它们是什么的很好的解释。
我使用过 ash 并且我知道它是一个 Linux shell,但我想真正了解它。
答案1
与 相比bash
,Ash 是一个简单的 unix shell,而 是 Linux 系统上更典型的全功能 shell。
Busybox 是一个程序,它实现了ash
类似的 shell,以及许多其他常见的 unix 程序,尽管是精简版,但都包含在单个程序中。它旨在在空间非常有限的环境中提供半典型的类 unix 环境,因此,它将许多(精简版)程序实现为单个程序,然后将单独的程序命令符号链接到 busybox 二进制文件,该二进制文件会确定它应该模拟哪个程序,并尽力使其行为类似于它要替换的全功能程序。
Busybox 最初是为在空间极其有限的环境(例如单个软盘启动盘)中使用而开发的,如今仍在空间有限的环境(例如 dd-wrt 等嵌入式系统)中使用。
答案2
它是什么busybox
?它如何在一个可执行文件内包含许多可执行文件?
让我详细阐述一下@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*
因此,如果您运行ash
,which 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
。
一旦我运行其中任何一个ash
或busybox ash
cmd,我都可以看到的输出echo $0
已经从变为-sh
,ash
这意味着我现在正在ash
默认-sh
shell内运行shell。exit
将使我退出ash
shell并返回-sh
shell。
要查看所有可以运行的程序busybox
,只需输入busybox
或busybox --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
:
根据维基百科Almquist 壳文章,的原始版本ash
是 Almquist shell,最初于 1989 年 5 月 30 日发布。
比较一下bash
,仅一周后,即 1989 年 6 月 8 日发布!
根据维基百科Almquist 壳上面的文章dash
是移植ash
到 Debian Linux 的(重点添加):
1997 年,Herbert Xu
ash
从 NetBSD 移植到 Debian Linux。2002 年 9 月,随着 0.4.1 版本的发布,该移植版更名为 Dash (Debian Almquist shell)。Xu 的主要任务是 POSIX 一致性和精简实现。
并且,根据上面对 busybox 源代码的引用,busybox ash
“实际上是 Debian dash
shell 的衍生品(由 Herbert Xu 编写)”。