如何在 Linux 上使用 BusyBox

运维 系统运维
我们很容易认为 Linux 的命令是理所当然的。当你安装 Linux 时,它们与系统捆绑在一起,而我们常常不问为什么它们会在那里。一些基本的命令,如 cd、kill 和 echo,并不总是独立的应用程序,而是实际上内置于你的 shell 中。
  • BusyBox 是一个开源(GPL)项目,提供了近 400 个常用命令的简单实现。

我们很容易认为 Linux 的命令是理所当然的。当你安装 Linux 时,它们与系统捆绑在一起,而我们常常不问为什么它们会在那里。一些基本的命令,如 cd、kill 和 echo,并不总是独立的应用程序,而是实际上内置于你的 shell 中。其他如 ls、mv 和 cat 是核心工具包(通常是 GNU coreutils)的一部分。但在开源的世界里,总是有一些替代品,其中最有趣的是 BusyBox。

Linux 中的 BusyBox 简介

BusyBox 是一个开源(GPL)项目,提供近 400 个常用命令的简单实现,包括 ls、mv、ln、mkdir、more、ps、gzip、bzip2、tar 和 grep。它还包含了编程语言 awk、流编辑器 sed、文件系统检查工具 fsck、rpm 和 dpkg 软件包管理器,当然还有一个可以方便的访问所有这些命令的 shell(sh)。简而言之,它包含了所有 POSIX 系统需要的基本命令,以执行常见的系统维护任务以及许多用户和管理任务。

事实上,它甚至包含一个 init 命令,可以作为 PID 1 启动,以作为所有其它系统服务的父进程。换句话说,BusyBox 可以作为 systemd、OpenRC、sinit、init 和其他初始化系统的替代品。

BusyBox 非常小。作为一个可执行文件,它不到 1MB,所以它在 嵌入式、边缘计算 和 物联网 领域很受欢迎,因为这些场景的存储空间是很宝贵的。在容器和云计算的世界里,它作为精简的 Linux 容器镜像的基础镜像也很受欢迎。

极简主义

BusyBox 的部分魅力在于它的极简主义。它的所有命令都被编译到一个二进制文件里(busybox),它的手册只有 81 页(根据我对 man 送到 pr 管道的计算),但它涵盖了近 400 条命令。

作为一个例子的比较,这是 “原版” 的 useradd —help 的输出:

  1. -b, --base-dir BASE_DIR       base directory for home 
  2.  -c, --comment COMMENT         GECOS field of the new account 
  3.  -d, --home-dir HOME_DIR       home directory of the new account 
  4.  -D, --defaults                print or change the default config 
  5.  -e, --expiredate EXPIRE_DATE  expiration date of the new account 
  6.  -f, --inactive INACTIVE       password inactivity 
  7.  -g, --gid GROUP               name or ID of the primary group 
  8.  -G, --groups GROUPS           list of supplementary groups 
  9.  -h, --help                    display this help message and exit 
  10.  -k, --skel SKEL_DIR           alternative skeleton dir 
  11.  -K, --key KEY=VALUE           override /etc/login.defs 
  12.  -l, --no-log-init             do not add the user to the lastlog 
  13.  -m, --create-home             create the user's home directory 
  14.  -M, --no-create-home          do not create the user's home directory 
  15.  -N, --no-user-group           do not create a group with the user's name 
  16.  -o, --non-unique              allow users with non-unique UIDs 
  17.  -p, --password PASSWORD       encrypted password of the new account 
  18.  -r, --system                  create a system account 
  19.  -R, --root CHROOT_DIR         directory to chroot into 
  20.  -s, --shell SHELL             login shell of the new account 
  21.  -u, --uid UID                 user ID of the new account 
  22.  -U, --user-group              create a group with the same name as a user 

而这是是同一命令的 BusyBox 版本:

  1. -h DIR    Home directory 
  2. -g GECOS  GECOS field 
  3. -s SHELL  Login shell 
  4. -G GRP    Group 
  5. -S            Create a system user 
  6. -D            Don't assign a password 
  7. -H            Don't create home directory 
  8. -u UID    User id 
  9. -k SKEL   Skeleton directory (/etc/skel) 

这种差异是一种特性还是一种限制,取决于你是喜欢你的命令拥有 20 个选项还是 10 个选项。对于一些用户和某些用例来说,BusyBox 的极简主义刚刚满足所需。对于其他人来说,它是一个很好的最小化环境,可以作为一个后备工具,或者作为安装更强大的工具的基础,比如 Bash、Zsh、GNU Awk 等等。

安装 BusyBox

在 Linux 上,你可以使用你的软件包管理器安装 BusyBox。例如,在 Fedora 及类似发行版:

  1. $ sudo dnf install busybox 

在 Debian 及其衍生版:

  1. $ sudo apt install busybox 

在 MacOS 上,可以使用 MacPorts 或 Homebrew。在 Windows 上,可以使用 Chocolatey。

你可以将 BusyBox 设置为你的 shell,使用 chsh —shell 命令,然后再加上 BusyBox sh 应用程序的路径。我把 BusyBox 放在 /lib64 中,但它的位置取决于你的发行版的安装位置。

  1. $ which busybox 
  2. /lib64/busybox/busybox 
  3. $ chsh --shell /lib64/busybox/sh 

用 BusyBox 全盘替换所有常见的命令要复杂一些,因为大多数发行版都是“硬接线”,会在特定的软件包寻找特定的命令。换句话说,虽然技术上可以用 BusyBox 的 init 替换系统的 init,但你的软件包管理器可能会拒绝让你删除包含 init 的软件包,以免你担心删除会导致系统无法启动。有一些发行版是建立在 BusyBox 之上的,所以从新环境开始可能是体验 BusyBox 系统的最简单方法。

试试 BusyBox

你不必为了尝试 BusyBox 而将你的 shell 永久改为 BusyBox。你可以从你当前的 shell 中启动一个 BusyBox shell。

  1. $ busybox sh 
  2. ~ $ 

不过你的系统仍然有安装的非 BusyBox 版本的命令,所以要体验 BusyBox 的工具,你必须把命令作为参数发给 busybox 可执行文件:

  1. ~ $ busybox echo $0 
  2. sh 
  3. ~ $ busybox ls --help 
  4. BusyBox vX.YY.Z (2021-08-25 07:31:48 NZST) multi-call binary
  5. Usage: ls [-1AaCxdLHRFplinshrSXvctu] [-w WIDTH] [FILE]... 
  6. List directory contents 
  7.  -1  One column output 
  8.  -a  Include entries that start with . 
  9.  -A  Like -a, but exclude . and .. 
  10.  -x  List by lines 
  11. [...] 

为了获得“完整”的 BusyBox 体验,你可以为每个命令创建一个 busybox 的符号链接。这很容易,只要你使用 for 循环 就行:

  1. $ mkdir bbx 
  2. for i in $(bbx --list); do \ 
  3.     ln -s /path/to/busybox bbx/$i \ 
  4. done 

在你的 路径 的 开头 添加这个符号链接目录,并启动 BusyBox:

  1. $ PATH=$(pwd)/bbx:$PATH bbx/sh 

用起来

BusyBox 是一个有趣的项目,也是一个可以实现 极简 计算的例子。无论你是把 BusyBox 作为 你唤醒的 古老的计算机 的轻量级环境,还是作为 嵌入式设备 的用户界面,抑或试用一个新的初始化系统,就算是为了好奇,让自己重新认识那些熟悉而又陌生的命令,都会很有意思。

责任编辑:未丽燕 来源: Linux中国
相关推荐

2019-11-26 16:58:51

Linuxpkgsrc

2019-01-07 09:50:06

Linuxtarball命令

2023-01-17 07:40:59

LinuxAppImage应用程序

2020-08-24 12:37:54

Linuxxargs命令

2022-08-10 13:12:04

Linuxcat命令

2018-03-07 11:32:44

LinuxVundleVim

2018-04-25 10:46:05

Linux命令行日历

2018-08-06 09:30:00

LinuxPbcopyPbpaste

2022-09-19 08:45:52

Telnet系统Linux

2021-08-03 14:33:53

cron定时器Linux命令

2015-08-21 09:07:52

LinuxNMAP安全

2020-04-21 14:21:31

LinuxPython

2018-12-11 11:00:50

Linux字体命令

2021-10-12 08:43:19

LinuxSambaWindows

2019-11-26 09:20:47

LinuxJava

2022-08-30 19:14:31

LinuxBash

2016-11-23 08:48:24

LinuxCalibre电子书

2019-09-29 09:40:20

LinuxWindowsMacOS

2014-06-05 15:06:29

2017-05-03 15:30:38

LinuxMeld比较文件夹
点赞
收藏

51CTO技术栈公众号