Qemu, busybox, linux kernel - частина 1, збірка, badembed

Для початку скачайте Busybox:

Потрібний вам Linux Kernel:

Незважаючи на нестримне зростання графічних оболонок і «доброзичливих» інтерфейсів, уявити собі UNIX без командного рядка і основних утиліт в наші дні неможливо. Численні інтерпретатори і базові системні утиліти не стоять на місці, ростуть і розвиваються, що неминуче веде і до збільшення їх обсягу. У той же час існують сфери діяльності, в яких компактність будь-яких додатків з очевидних причин дуже важлива, наприклад, у вбудованих пристроях. Разом з тим у багатьох випадках не потрібна значна частина тієї функціональності, яка властива базовим утилітам «загального призначення».

Для вирішення цих проблем ще в середині 90-х Брюсом Перенс (Bruce Perens) був створений пакет BusyBox. Зараз проект позиціонується як «швейцарський ніж для вбудованих Linux-систем» і в першу чергу орієнтований на використання в невеликих дистрибутивах GNU / Linux. Поширюється під другою версією ліцензії GNU GPL.

BusyBox являє собою єдиний виконуваний файл, при запуску якого завантажується повноцінний командний інтерфейс. Як свідчить офіційна документація BusyBox. для формування мінімальної версії GNU / Linux до цього досить додати лише ядро ​​ОС і каталоги / etc, / dev.

Одна з головних цілей, яку переслідують розробники BusyBox. - Оптимізована і компактність коду - розрахунок на обмеженість пам'яті. Це не тільки знову говорить про плюси його використання у вбудованих пристроях, а й добре поєднується з іншим підходом в дусі UNIX way. високий рівень настраиваемости (в бінарний файл BusyBox можна включити тільки необхідні компоненти).

Ще на стадії компіляції (а точніше, до самого процесу складання) можна вибрати тільки ті базові утиліти, які потрібні. Реалізовано це в стилі настройки ядра Linux. Замість більш поширеного серед зібраних з automake додатків способу у вигляді скрипта «configure» для початкових конфігурацій BusyBox потрібно виконати одну з наступних команд:

Аргумент «config» ініціює запуск «запитальника» зі списком доступних опцій і базових утиліт, що пропонує проставляти «Y» або «N» на місці потрібних і непотрібних можливостей відповідно.

Аргумент «menuconfig» викликає більш зручну конфігурацію у вигляді меню з інтерфейсом на базі curses.

Аргумент «defconfig» автоматично включає всі доступні опції, готуючи до збірки BusyBox «загального призначення».

Так само, як і в випадку з ядром Linux. після настройки створюється конфігураційний файл .config. до якого можна потім завжди повертатися командою:

Це актуально при переході на більш нову версію BusyBox зі старою конфігурацією (щоб при налаштуванні працювати тільки з появою в черговому релізі опціями).

За замовчуванням, якщо до виклику «make menuconfig» не існував файл .config. make автоматично попередньо запускається з аргументом «defconfig». Таким чином, користувачеві залишиться тільки відключити непотрібні можливості. Передбачено і зворотний варіант: запуск make з «allnoconfig» відключає всі опції, щоб після цього можна було вибрати тільки те, що потрібно.

Далі все традиційно:

Крім альтернативного набору coreutils (ls, cat, mv, cp, rm, chmod, df, ln, date, wc, nice, test ...) до складу BusyBox входить і безліч інших програм.

Широко представлені мережеві засоби: і клієнтські, і серверні. Серед демонів виділю httpd, dnsd, telnetd, inetd, udhcpd. Для FTP є ftpget, ftpput і клієнт tftp. Крім того, присутній і власна версія GNUwget. З інших стандартних утиліт: ifconfig, route, traceroute, ping / ping6, netstat, nslookup, arp і arping.

Далі в меню ставимо галочку в:
-> Busybox Settings
-> Build Options
[] Build BusyBox as a static binary (no shared libs)

зберігаємо і виходимо.

CONFIG_PREFIX =. / .. / busybox_rootfs - вказує на папочку, куди busybox складе вихідні файли.

Initrd (скорочення від англ. Initial RAM Disk. Диск в оперативній пам'яті для початкової ініціалізації) - тимчасова файлова система, яка використовується ядром Linux при початковому завантаженні. Initrd зазвичай використовується для початкової ініціалізації перед монтуванням «справжніх» файлових систем.

Починаючи з версії ядра 2.6 прийшли до поняття initramfs. Це, звичайно стиснений cpio архів, в якому розташовується міні-система busybox, яка виконує ту ж роль, що і initrd.

Можна використовувати її для тестування будь-якої функціональності вбудовується системи - коли ви просто хочете помістити всю систему в пам'ять, щоб вона швидко працювала, при цьому вам не важливо, чи збережуться ваші зміни після перезавантаження.

Вміст initramfs робиться шляхом створення cpio-архіву.

Всі файли, інструменти, бібліотеки, настройки конфігурації (якщо вони застосовні), і т.д. поміщаються в cpio-архів. Цей архів потім стискається з використанням утиліти gzip і зберігається в тому ж місці, що і ядро ​​Linux. Далі, завантажувач передасть його ядру Linux під час завантаження, щоб ядро ​​знало про те, що потрібно initramfs.

При його виявленні, ядро ​​Linux створить файлову систему tmpfs. витягне на неї вміст архіву і потім запустить сценарій init. розташований в кореневому каталозі файлової системи tmpfs.

Тепер створимо initramfs з нашим побудованим busybox:

Note: node можна не створювати через mknod. а скопіювати з основної ОС.

Далі копіюємо все з папки busybox_rootfs в папку rootfs. Таким чином, в нашому initrd з'являться утиліти Linux. які реалізує busybox.

Робимо його виконуваним:

Створюємо сам initramfs:

Стиснутий образ ядра - / arch / x86_64 / boot / bzImage.

Копіюємо bzImage і rootfs.cpio.gz в окрему директорію, заходимо в неї і

Initrd вбудований в ядро

Крім того, ви можете скомпілювати initrd разом з ядром. Для цього треба при конфігуруванні ядра вказати шлях до rootfs (див. Нижче):

А в / path_to_rootfs / rootfs у вас повинен знаходиться сам rootfs (/ bin, / dev / dev / sda / dev / console тощо - див. Опис вище). Не забуваємо створити і init скрипт.

Тоді після компіляції ядра, qemu можна запускати, що не вказуючи initrd:

Перемикання з Initrd на rootfs на диску

Спочатку створимо диск, на який помістимо rootfs:

Створюємо rootfs тут (в / mnt), також як і було описано вище (/ bin, / dev / dev / sda / dev / console тощо - див. Опис вище). Не забуваємо створити і init скрипт.

Тепер у нас на образі диска hdd знаходиться rootfs.

Для запуску qemu c диском використовуємо сл. команду:

Коли ядро ​​завантажиться з initrd. для перемикання до rootfs на диску, слід виконати такі команди:

Завантаження без Initrd

Оскільки у на rootfs є вже на диску, то грузиться з initrd не обов'язково. Для того щоб відразу вантажити rootfs з диска, треба ядру (в засобі завантаження) передати параметр root.