BusyBox: швейцарський ніж для вбудованих Linux-систем
Системні адміністратори і користувачі UNIX / Linux-систем, безсумнівно, звикли до роботи зі своєю улюбленою командною оболонкою та до стандартних програмних засобів. Але їх повсюдне використання не завжди можливо. І тоді на допомогу приходить BusyBox - спрощений shell з набором компактних системних засобів.
BusyBox: що це таке і навіщо взагалі потрібно?
Незважаючи на нестримне зростання графічних оболонок і «доброзичливих» інтерфейсів, уявити собі UNIX без командного рядка і основних утиліт в наші дні неможливо. Численні інтерпретатори і базові системні утиліти не стоять на місці, ростуть і розвиваються, що неминуче веде і до збільшення їх обсягу. У той же час існують сфери діяльності, в яких компактність будь-яких додатків з очевидних причин дуже важлива, наприклад, у вбудованих пристроях. Разом з тим у багатьох випадках не потрібна значна частина тієї функціональності, яка властива базовим утилітам «загального призначення».
Для вирішення цих проблем ще в середині 90-х Брюсом Перенс (Bruce Perens) був створений пакет BusyBox [1]. Зараз проект позиціонується як «швейцарський ніж для вбудованих Linux-систем» і в першу чергу орієнтований на використання в невеликих дистрибутивах GNU / Linux. Поширюється під другою версією ліцензії GNU GPL.
BusyBox являє собою єдиний виконуваний файл, при запуску якого завантажується повноцінний командний інтерфейс. Як свідчить офіційна документація BusyBox, для формування мінімальної версії GNU / Linux до цього досить додати лише ядро ОС і каталоги / etc, / dev.
Бінарні пакети з BusyBox для систем GNU / Linux доступні в відповідних репозиторіях, а архів з вихідними кодами - на сайті проекту [2]. У статті розглядається реліз BusyBox v1.5.0. Одна з головних цілей, яку переслідують розробники BusyBox, - Оптимізована і компактність коду - розрахунок на обмеженість пам'яті. Це не тільки знову говорить про плюси його використання у вбудованих пристроях, а й добре поєднується з іншим підходом в дусі UNIX way: високий рівень настраиваемости (в бінарний файл BusyBox можна включити тільки необхідні компоненти).
Ще на стадії компіляції (а точніше, до самого процесу складання) можна вибрати тільки ті базові утиліти, які потрібні. Реалізовано це в стилі настройки ядра Linux. Замість більш поширеного серед зібраних з automake додатків способу у вигляді скрипта «configure» для початкових конфігурацій BusyBox потрібно виконати одну з наступних команд:
Аргумент «config» ініціює запуск «запитальника» зі списком доступних опцій і базових утиліт, що пропонує проставляти «Y» або «N» на місці потрібних і непотрібних можливостей відповідно.
Аргумент «menuconfig» викликає більш зручну конфігурацію у вигляді меню з інтерфейсом на базі curses (див. Рис. 1).
Малюнок 1. Установка BusyBox: «make menuconfig» на манер Linux-ядра
Аргумент «defconfig» автоматично включає всі доступні опції, готуючи до збірки BusyBox «загального призначення».
Так само, як і в випадку з ядром Linux, після настройки створюється конфігураційний файл .config, до якого можна потім завжди повертатися командою:
Це актуально при переході на більш нову версію BusyBox зі старою конфігурацією (щоб при налаштуванні працювати тільки з появою в черговому релізі опціями).
За замовчуванням, якщо до виклику «make menuconfig» не існував файл .config, make автоматично попередньо запускається з аргументом «defconfig». Таким чином, користувачеві залишиться тільки відключити непотрібні можливості. Передбачено і зворотний варіант: запуск make з «allnoconfig» відключає всі опції, щоб після цього можна було вибрати тільки те, що потрібно.
Далі все традиційно:
$ Sudo make install
Робота з BusyBox
Запуск оболонки BusyBox можна здійснити командою:
Для разового виклику якої-небудь функції (як правило, одна функція BusyBox обмежено реалізує можливості однієї з утиліт зі складу GNU coreutils, util-linux і інших стандартних пакетів) можна скористатися командою:
$ busybox <функция> [Аргументи]
Тобто, наприклад:
покаже в поточній оболонці (наприклад, bash) результат виконання команди «ls -l /» в BusyBox (див. рис .2).
Малюнок 2. BusyBox в роботі: ls
$ Busybox --help <функция>
Це набуває особливої актуальності з огляду на те, що базові утиліти в складі BusyBox обмежені в своїх можливостях, тому список доступних прапорів буде відрізнятися від тих, що всі звикли бачити в стандартних засобах.
Крім альтернативного набору coreutils (ls, cat, mv, cp, rm, chmod, df, ln, date, wc, nice, test.) До складу BusyBox входить і безліч інших програм.
Серед них, по-перше, варто виділити наявність декількох мінімалістських командних оболонок: ash (60 Кб; відгалуження від dash з Debian, заснованого на ash з NetBSD; рекомендований для використання з BusyBox), hush (18 Кб; розуміє граматику Bourne shell), lsh (всього 10 Кб; тільки найпростіший функціонал), msh (30 Кб; minix shell).
Малюнок 3. Виконання елементарних скриптів в BusyBox
Особливого сенсу в перерахуванні всіх функцій BusyBox не бачу, тому обмежуся простий статистикою. У моїй збірці BusyBox з портежей Gentoo Linux представлена 241 функція (але в неї входить далеко не все, що реалізовано в рамках цього проекту). Якщо розглядати для прикладу ls, то у версії BusyBox для цієї утиліти є 26 прапорів, а в оригінальній в моєму випадку (ls з GNU coreutils 6.7) - 55 (не рахуючи «допомоги» і «версії»). Серед відсутніх прапорів в першій можна виділити: -Q (назви в лапках), -m (список через кому), -U і -f (висновок списку без сортування). Інші, на мій погляд, ще менш значні. Загальні тенденції, думаю, очевидні.
Малюнок 4. Мережеві засоби в «make menuconfig» BusyBox
При цьому важливо враховувати специфіку BusyBox, а саме - його позиціонується і фактичне ключове призначення: використання в середовищах з серйозними обмеженнями в пам'яті, котрі мають потреби в тій розширеної функціональності, яку представляють сучасні базові системні утиліти.
Де використовується BusyBox
BusyBox знайшов застосування в таких системах, як Familiar Linux (для КПК) і MoviX (популярний компактний дистрибутив з набором мультимедійних Open Source-рішень), в установник Debian, Gentoo, Red Hat, Mandriva та інших проектів, а також у багатьох Linux-заснованих пристроях (Sharp Zaurus, роутери, AP.).