Команди 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 як полегшене середовище для врятованого вами стародавнього комп’ютера, як користувальницький простір для вбудованого пристрою, для випробування нової системи ініціалізації або просто як цікавість, може бути наново познайомитися зі старими знайомими, але з іншого боку новими командами.
BusyBox це рятівник для боротьби з тупістю авторів дистрибутивів.
Незамінний інструмент для роботи автономних shell програм без боротьби з мільйонами варіантів наявних утиліт — просто клади потрібну версію busybox біля скрипта і забудь про головну біль.
Варто зауважити що зараз проектом керує українець — Денис Власенко.
ПС: колись всі сімлінки можна було створити за допомогою команди :
але зараз так не можна на жаль.