Что такое BusyBox?
- title
- Что такое BusyBox?
- type
- summary
- summary
- Разбор диспетчеризации в multicall-бинарнике BusyBox: один бинарник, 130+ симлинков в Alpine, поиск апплета по argv[0], ~304 апплета
- tags
- linux, unix, busybox, alpine
- sources
- specular-what-is-busybox
- created
- 2026-05-13
- updated
- 2026-05-13
- lang
- ru
- translation_of
- specular-what-is-busybox
- source_updated
- 2026-05-13
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Пост в блоге specular.fi, начавшийся с наблюдения: /usr/bin/wget в Alpine на самом деле оказывается BusyBox Wget. Затем автор обнаружил, что то же самое справедливо для ~130 других бинарников Alpine - все они являются симлинками на /bin/busybox. Пост короткий и читается так, будто автор разбирался в исходном коде прямо на ходу:
$ ls -lah /usr/bin/wget
lrwxrwxrwx 1 root root 12 Apr 15 04:51 /usr/bin/wget -> /bin/busybox
Как устроена диспетчеризация
Точка входа BusyBox считывает argv[0] и ищет подходящий апплет:
applet_name = argv[0];
if (applet_name[0] == '-') // login shells: argv[0] starts with -
applet_name++;
applet_name = bb_basename(applet_name);
int applet = find_applet_by_name(name);
run_applet_no_and_exit(applet, name, argv);
// xfunc_error_retval = applet_main[applet_no](argc, argv);
Прямой вызов бинарника тоже работает:
$ busybox ls -1
bin
dev
etc
home
$ busybox meheh
meheh: applet not found
У каждого апплета свой C-файл (wget живёт в wget.c) с метаданными в стиле Kconfig в комментариях //config: и типичной точкой входа int wget_main(int argc, char **argv). При сборке они объединяются в единый интерфейс Kconfig, позволяя дистрибутиву выбирать, какие апплеты вкомпилировать.
Команда busybox --install -s создаёт симлинки (-s для символических ссылок; по умолчанию используются жёсткие). busybox --list | wc -l выводит количество апплетов - в Alpine их 304.
Главный вывод поста:
Alpine больше похож на интерфейс к бинарникам на базе BusyBox. Каждый бинарник выглядит несколько урезанной версией полноценного оригинала.
Именно на таком компромиссе и построен multicall-binary - единый общий runtime, множество имён команд, апплеты, покрывающие 80% типовых сценариев с малой долей затрат диска и памяти по сравнению с GNU coreutils. В посте автор задаётся вопросом, являются ли апплеты собственными реализациями или урезанными оригиналами; верен в основном первый вариант: апплеты BusyBox пишутся с нуля с меньшим набором опций, а не вырезаются из кода GNU.
Почему это важно
- Образы Alpine весят ~5 МБ отчасти из-за этой архитектуры. Если заменить BusyBox на полные GNU coreutils + util-linux + bash + ..., образ вырастет на порядок.
- Шелл-скрипты и директивы
RUNв контейнерах, завязанные на специфичные флаги GNU, в Alpine молча ломаются:find -printf,grep -P,sed -i ''и т. д. Решением обычно становитсяapk add coreutils findutils sed gnu-grep(что сводит на нет multicall-оптимизацию для этих утилит) либо переписывание скрипта в переносимом для BusyBox виде. - Тот же паттерн multicall встречается в CLI в стиле Pi ("один общий бинарник, множество подкоманд"), только там используется argv[1], а не argv[0] - механизм другой, но пользовательская модель схожа. Разграничение описано в multicall-binary.
Какое место занимает в базе
Пост встаёт в один ряд с другими разборами Unix в вики из серии "мелочь с большими последствиями" - zsh-glob-qualifiers, t-context-go-testing, macos-tcp-time-bomb - и служит опорным примером для multicall-binary. Более близкий контекст: проектирование минимального userspace (microvm-2026, qemu-microvm) - то же стремление предоставить наименьший жизнеспособный базис под реальную нагрузку. BusyBox - это userspace-половина того, чем microVM являются для связки ядра и VMM.