Команди 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 для кожної команди. Це простіше, ніж здається, якщо ви використовуєте цикл:

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 як полегшене середовище для врятованого вами стародавнього комп’ютера, як користувальницький простір для вбудованого пристрою, для випробування нової системи ініціалізації або просто як цікавість, може бути наново познайомитися зі старими знайомими, але з іншого боку новими командами.

Поділіться своєю знахідкою

Залишити відповідь

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

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

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

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

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

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