Що б ви не робили, у вас є initramfs
. Без цього не обійтися - це єдина файлова система, нав'язана вам. З kernel.org :
Що таке корінці?
Rootfs
є спеціальним екземпляром ramfs
(або tmpfs
, якщо це ввімкнено), який
завжди присутній в системах 2.6. Ви не можете відключитиrootfs
приблизно з тієї ж причини, що не можете вбити процес init; замість того, щоб мати спеціальний код для перевірки та обробки порожнього списку, це менше і простіше для ядра, щоб переконатися, що певні списки не можуть стати порожніми.
Більшість систем просто змонтують іншу файлову систему rootfs
та ігнорують її. Обсяг місця, який займає порожній екземпляр ramfs, невеликий.
Якщо * CONFIG_TMPFS * увімкнено, rootfs
використовуватиметься tmpfs
замість ramfs
за замовчуванням. Щоб примусити ramfs
, додайте "rootfstype=ramfs"
до командного рядка ядра.
Що таке initramfs?
Всі 2.6 ядра Linux містять"cpio"
архів форматуgzipped, який витягується під rootfs
час завантаження ядра. Після вилучення ядро перевіряє, чиrootfs
містить він файл"init"
, і якщо так, він виконує його як PID 1. Якщо його знайдено, цейinit
процес відповідає за те, що система підведе решту шляху, включаючи пошук та встановлення реального кореневого пристрою ( якщо якийсь). Якщо програмаrootfs
не міститьinit
програму післяcpio
вилученнявбудованогоархіву, ядро потрапить до старого коду, щоб знайти та змонтувати кореневий розділ, а потім/sbin/init
виконатиякийсь варіантіз цього.
Все це відрізняється від старого initrd кількома способами:
Старий initrd завжди був окремим файлом, а архів initramfs пов'язаний із зображенням ядра Linux. (Каталог linux - * / usr присвячений генерації цього архіву під час збирання.)
Старий файл initrd являв собою зображення файлової системи gzipped (у деякому форматі файлу, наприклад, ext2, для якого потрібен драйвер, вбудований у ядро), а новий архів initramfs - це gzipped архів cpio (як-от tar, простіше, див. Cpio (1) і Документація / рано-користувацький простір / буфер-формат.txt). Код вилучення cpio ядра не лише надзвичайно малий, він також __init тексту та даних, які можна відкинути під час завантаження.
Програма, запущена старим initrd (яка називалася / initrd, не / init), зробила деяку настройку, а потім повернулася до ядра, тоді як програма init з initramfs не очікується повернення до ядра. (Якщо / init потребує передачі керування, він може змінити / з новим кореневим пристроєм та виконати іншу програму init. Див. Утиліту switch_root, нижче.)
Під час перемикання іншого кореневого пристрою, initrd би перемикав_root, а потім маніпулює ramdisk. Але initramfs - це rootfs: ви не можете ні pivot_root rootfs, ні демонтувати його. Замість цього видаліть усе із кореневих файлів, щоб звільнити простір (знайдіть -xdev / -exec rm '{}' ';'), переставте rootfs новим коренем (cd / newmount; mount --move. /; Chroot.), додайте stdin / stdout / stderr до нової / dev / console та виконайте новий init.
Оскільки це надзвичайно складний процес (і включає видалення команд перед тим, як їх запустити), пакет klibc представив програму-помічник (utils / run_init.c), щоб зробити це все за вас. Більшість інших пакетів (наприклад, зайнятий) назвали цю команду "switch_root".
Популяція initramfs:
Процес збирання ядра 2.6 завжди створює архів initramfs формату gzipped cpio і пов'язує його в отриманий бінарний файл ядра. За замовчуванням цей архів порожній (на x86 витрачається 134 байти).
Параметр config CONFIG_INITRAMFS_SOURCE (у загальній установці в menuconfig та проживає в usr / Kconfig) може бути використаний для визначення джерела для архіву initramfs, який автоматично буде включений у отриманий бінарний файл. Цей параметр може вказувати на існуючий архів gpіp cpio, каталог, що містить файли, що підлягають архівуванню, або специфікацію текстового файлу, наприклад наступний приклад:
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
Запустіть "usr / gen_init_cpio" (після побудови ядра), щоб отримати повідомлення про використання, що документує вищевказаний формат файлу.
Однією з переваг конфігураційного файлу є те, що кореневий доступ не потрібен для встановлення дозволів або створення вузлів пристроїв у новому архіві. (Зверніть увагу, що ці два приклади "файлових" файлів очікують, що файли з назвою "init.sh" та "busybox" знайдуться в каталозі під назвою "initramfs", в каталозі linux-2.6. *. Детальніше.)
Ядро не залежить від зовнішніх інструментів cpio. Якщо ви вказали каталог замість файлу конфігурації, інфраструктура збирання ядра створює файл конфігурації з цього каталогу (usr / Makefile викликає сценарії / gen_initramfs_list.sh) і переходить до упаковки цього каталогу за допомогою файлу config (подаючи його в usr / gen_init_cpio, який створюється з usr / gen_init_cpio.c). Код створення файлів cpio часу нарощування ядра повністю автономний, а екстрактор часу завантаження ядра також (очевидно) самостійний.