EnglishРусский Map

Что такое BusyBox?

title
Что такое BusyBox?
type
summary
summary
Разбор диспетчеризации в multicall-бинарнике BusyBox: один бинарник, 130+ симлинков в Alpine, поиск апплета по argv[0], ~304 апплета
tags
linux, unix, busybox, alpine
created
2026-05-13
updated
2026-05-13
lang
ru
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.