Команды Linux всегда воспринимаются как должное. Они поставляются вместе с системой при установке Linux, и мы часто не задаемся вопросом, зачем они нужны. Некоторые из основных команд, такие как cd, kill и echo, не всегда являются независимыми приложениями, но фактически встроены в вашу оболочку. Другие, такие как ls, mv и cat, являются частью основного пакета служебных программ (часто специально для GNU coreutils). Но в мире открытого кода всегда есть альтернативы, и одна из самых интересных — BusyBox.

Что такое BusyBox?

BusyBox — это проект с открытым исходным кодом (GPL), обеспечивающий простую реализацию почти 400 распространенных команд, включая ls, mv, ln, mkdir, more, ps, gzip, bzip2, tar и grep. Он также содержит версию языка программирования awk, редактор потока sed, средство проверки файловой системы fsck, менеджеры пакетов rpm и dpkg и, конечно же, оболочку (sh), которая обеспечивает легкий доступ ко всем этим командам. Короче говоря, он содержит все основные команды, необходимые системе POSIX для выполнения общих задач обслуживания системы, а также многих пользовательских и административных задач.

Фактически, он даже содержит команду init, которую можно запустить как PID 1, чтобы она служила родительским процессом для всех других системных служб. Другими словами, BusyBox можно использовать как альтернативу systemd, OpenRC, sinit, init и другим процессами запуска.

BusyBox очень маленький. Как исполняемый файл, он составляет менее 1 МБ, поэтому он приобрел большую популярность во встроенных устройствах, устройствах Edge и IoT, где дисковое пространство имеет первостепенное значение. В мире контейнеров и облачных вычислений он также популярен как основа для создания минимальных образов контейнеров Linux.

Минимализм

Отчасти привлекательность BusyBox заключается в его минимализме. Все его команды скомпилированы в единый двоичный файл (busybox), а его справочная система занимает всего 81 страницу, но он содержит почти 400 команд.

В качестве примера сравнения, вот результат shadow версии useradd --help:

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

А вот версия той же команды для BusyBox:

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

Является ли это различие функцией или ограничением, зависит от того, предпочитаете ли вы иметь в своих командах 20 или десять вариантов. Для многих пользователей и вариантов использования минимализм BusyBox предоставляет ровно столько, сколько необходимо для работы. Для других это хорошая минимальная среда, которую можно использовать в качестве запасного варианта или в качестве основы для установки более надежных инструментов, таких как Bash, Zsh, GNU Awk и т. Д.

Установка BusyBox

В Linux вы можете установить BusyBox с помощью диспетчера пакетов. Например, в Fedora и подобных:

<span class="co4">$ </span><span class="kw2">sudo</span> dnf <span class="kw2">install</span> busybox

В Debian и подобных:

<span class="co4">$ </span><span class="kw2">sudo</span> apt <span class="kw2">install</span> busybox

Вы можете установить BusyBox в качестве оболочки с помощью команды chsh —shell, за которой следует путь к приложению BusyBox sh. Я храню BusyBox в / lib64, но его расположение будет зависеть от того, где он установлен в вашем дистрибутиве.

which busybox
/lib64/busybox/busybox
$ chsh --shell /lib64/busybox/sh

Замена всех распространенных команд оптом на BusyBox немного сложнее, потому что большинство дистрибутивов «жестко запрограммированы», чтобы искать конкретные пакеты для определенных команд. Другими словами, технически возможно заменить init на init от BusyBox, ваш менеджер пакетов может отказать вам в удалении пакета, содержащего init, из опасения, что ваша система станет неработоспособной. Есть некоторые дистрибутивы, построенные на BusyBox, поэтому начать с нуля, является самым простым способом испытать систему, построенную на BusyBox.

Использование BusyBox

Для постоянной работы не нужно менять оболочку на BusyBox, чтобы просто протестировать ее. Вы можете запустить оболочку BusyBox из текущей оболочки:

$ busybox sh
~ $

В вашей системе будут установлены версии команд, не относящиеся к BusyBox, поэтому, чтобы испытать инструменты BusyBox, вы должны вводить команды в качестве аргументов для исполняемого файла busybox:

~ $ busybox echo $0
sh
~ $ busybox ls --help
BusyBox vX.YY.Z (2021-08-25 07:31:48 NZST) multi-call binary.Usage: ls [-1AaCxdLHRFplinshrSXvctu] [-w WIDTH] [FILE]...

Список содержимого каталога

-1  One column output
-a  Include entries that start with .
-A  Like -a, but exclude . and ..
-x  List by lines
[...]

Для «полного» взаимодействия с BusyBox вы можете создавать символические ссылки на busybox для каждой команды. Это проще, чем кажется, если вы используете цикл for:

mkdir bbx
$ for i in $(bbx --list)do 
ln -s /path/to/busybox bbx/$i 
done

Добавьте свой каталог символических ссылок при старте в  path и запустите BusyBox:

<span class="co4">$ </span><span class="re2">PATH</span>=$<span class="br0">(</span><span class="kw3">pwd</span><span class="br0">)</span><span class="sy0">/</span>bbx:<span class="re1">$PATH</span> bbx<span class="sy0">/</span><span class="kw2">sh</span>

Быть «busy»

BusyBox — забавный проект и пример того, насколько минимальными могут быть вычисления. Независимо от того, используете ли вы BusyBox в качестве облегченной среды для спасенного вами древнего компьютера, в качестве пользовательского пространства для встроенного устройства, для испытания новой системы инициализации или просто в качестве любопытства, может быть заново познакомиться со старыми знакомыми, но c другой стороны новыми, командами.

Поделитесь с друзьями

Добавить комментарий

1 Комментарий
Новіші
Старіші Найпопулярніші
Вбудовані Відгуки
Переглянути всі коментарі
VINRARUS

BusyBox це рятівник для боротьби з тупістю авторів дистрибутивів.
Незамінний інструмент для роботи автономних shell програм без боротьби з мільйонами варіантів наявних утиліт — просто клади потрібну версію busybox біля скрипта і забудь про головну біль.

Варто зауважити що зараз проектом керує українець — Денис Власенко.
ПС: колись всі сімлінки можна було створити за допомогою команди :

<span id="line107" class="codeline">busybox --install -s</span>

але зараз так не можна на жаль.

1
0
Ми любимо ваші думки, будь ласка, прокоментуйте.x