ПредишенСледващото

Първоначално RAM диск, за да стартирате Linux (initrd) е временно основната файлова система се монтира при зареждане в RAM да подкрепят модел зареждане на 2 нива. Initrd се състои от различни изпълними файлове и драйвери, които ви позволяват да монтирате недвижими основната файлова система, а след това на initrd
немонтирани и паметта се освобождава. В много вградени системи initrd и остава основната файлова система. Тази статия изследва зареждане RAM диск за Linux ядро ​​2.6, включително и в процеса на създаването му и използването му в ядрото Linux.

Какво е обувка RAM диск?

стартовия диск RAM (Initrd) е образ на основната файлова система, която е монтирана преди реалния корен FS на ще бъдат на разположение. Initrd свързани с ядрото и заредени в ядрото по време на зареждане. Ядрото монтира initrd образа, който съдържа необходимите модули за монтиране на основните FS, и има по-нататъшното прехода към корена на първични избори.

В initrd съдържа минимален набор от директории и изпълними за зареждане на модули, като например да се зареди insmod модули на ядрото.

В случай на десктоп система или сървъра, initrd временно файлова система. Неговият живот е кратък и служи само като връзка към главната FS. В областта на вградените системи, няма записани устройства за съхранение на данни, така initrd е постоянен корен FS. Тази статия изследва и двете опции.

Вътрешни елементи initrd

В initrd изображение съдържа изискваните минимални системни файлове и изпълними за втори етап обувка Linux. В зависимост от версията на Linux, който използвате различни методи за създаване на initrd.

Започвайки с Fedora Core 3, изображението по подразбиране initrd е компресиран CPIO архив. Вместо монтаж на файл с помощта на устройство линия, ще трябва да използвате CPIO програма. За да се запознае със съдържанието на архива CPIO, използвайте следните команди:

Обявата 2. Изследвания initrd (FC3 и по-нови версии)

# Защитен режим температура; CD температура
# Cp /boot/initrd-2.6.14.2.img initrd-2.6.14.2.img.gz
# Gunzip initrd-2.6.14.2.img.gz
# CPIO -i -Осъществяване директории

В резултат на това ние имаме един малък корен файлова система, чието съдържание е показано на Обява 3. малка, но необходима гама от приложения, намиращи се в директорията на директория / хамбар, включително Неш (не черупка, скрипт преводач), insmod за товарене модули на ядрото, и LVM (помощна програма за управление LVM ).

Обява 3. initrd структура подразбиране (за FC3)

Интересът към обява 3 е първоначален в основната директория. Този файл, както и в традиционния процес на Linux обувка започва, когато initrd образа разопаковането в паметта. Ние ще анализираме този процес по-късно в тази статия.

Utility, за да създадете initrd образ

Да се ​​върнем към началото и официално razbremsya как да се създаде един образ на initrd. За традиционните системи Linux initrd образа Содано време на инсталацията. Огромен брой програми, като например mkinitrd, може да бъде използван за създаване на initrd с необходимите библиотеки и модули за комуникация с корен FS. Mkinitrd е по същество конвенционална обвивка
скрипт, така че можете да видите как да се постигне необходимия резултат. Налице е също така YAIRD (Yet Another Mkinitrd) - програма, която ви позволява да персонализирате почти всеки параметър в initrd.

Използването CPIO команда CPIO команда. можете да манипулирате CPIO файлове. CPIO файл е по същество един прост konkatentsiya заглавна част на файла. CPIO файлов формат ви позволява да работите с двете ASCII файлове и двоичен. За съвместимост, използвайте ASCII, за да намалите размера - двоична версия.

Ръчно създаване на индивидуален initrd образ

Поради факта, че много вградени системи, базирани на Linux не е твърд диск, на initrd е постоянна и FS. Обява 4 показва как да се създаде един образ на initrd. Аз се използва стандартен десктоп с кутия Linux, така че можете да изпробвате тези действия, без да има под ръка вградена система с Linux. Отделно от съставянето на друг
платформа, концепцията за създаване на initrd образ е един и същ за вградени системи и настолни (включително сървъри).

Обява 4. Utility (mkird), за да създадете персонализирано изображение initrd

# Камериер ...
RM-F /tmp/ramdisk.img
RM-F /tmp/ramdisk.img.gz

# Ramdisk Константи
RDSIZE = 4000
BLKSIZE = 1024

# Създаване на празен Ramdisk изображение
дд ако = / Dev / нула = / TMP / ramdisk.img BS = $ BLKSIZE брои = $ RDSIZE

# Направете го на ext2 монтиране на файловата система
/ Sbin / mke2fs -F -m 0 -b $ BLKSIZE /tmp/ramdisk.img $ RDSIZE

# Го монтирате за да можем да се пренесат
монтиране /tmp/ramdisk.img / MNT / initrd -t ext2 -о цикъл = / ррт / loop0

# Населяват файловата система (поддиректории)
защитен режим / MNT / initrd / бин
защитен режим / MNT / initrd / сис
защитен режим / MNT / initrd / сътрудничество
защитен режим / MNT / initrd / Proc

# Вземете BusyBox и създаване на символни връзки
в обратен ред / MNT / initrd / бин
кп /usr/local/src/busybox-1.1.1/busybox.
LN -s BusyBox пепел
Въ -s монтиране BusyBox
Въ -s BusyBox ехо
Въ -s BusyBox ли
Въ -s BusyBox котка
Въ -s BusyBox к.с.
Въ -s BusyBox dmesg
Въ -s BusyBox Sysctl
Превърта стека

# Вземете необходимите DEV файлове
CP-а / сътрудничество / конзола / MNT / initrd / сътрудничество
CP-а / сътрудничество / Ramdisk / MNT / initrd / сътрудничество
CP-а / сътрудничество / ram0 / MNT / initrd / сътрудничество
CP-а / сътрудничество / нула / MNT / initrd / сътрудничество
CP-а / сътрудничество / tty1 / MNT / initrd / сътрудничество
CP-а / сътрудничество / tty2 / MNT / initrd / сътрудничество

# Equate sbin с бин
в обратен ред / MNT / initrd
Въ -s бин sbin
Превърта стека

# Създаване на първоначален файл
котка >> / MNT / initrd / linuxrc <

Обява 4. Script mkird за автоматично създаване на изображения

За да създадете initrd образа, започнете чрез създаване на празен файл с помощта на
псевдо / Dev / нула (нулев дебит) като вход
поток ramdisk.img файл. Резултатът е размера на файла на 4
мегабайт (4000 първите килобайт блокове). След това, с помощта на командата
mke2fs, да създадете файл във файловата система ext2. След като файлът
форматиран като ext2, да го монтирате в директорията / MNT / initrd като
апарат линия. Точката за монтиране вече имате директория
който отразява система файла с ext2 файл и там вече можете да
прибере initrd образ.

Следващата стъпка е да се създадат необходимите поддиректории: / хамбар, / Сис,
/ Dev и / Proc. Един нужда необходимо само да се осигури изискваната
функционалност, като не се нуждаят от библиотека (това условие е вярно
когато се събират всички изпълними файлове, намиращи се в initrd образа
статично).

За тази корен FS predostavlyalya необходимата функционална употреба
BusyBox. Това приложение е един от начините за много комунални услуги,
обикновено се използва в Linux системи (като пепел, AWK, СЕД,
insmod т.н.). BusyBox Предимството е, че той, в това число
функционалността на много от най-необходимите инструменти, има много по-малък размер.
Той е на идеален изход за вградени системи. Копирайте BusyBox в директорията
/ Bin в главната файлова система образ initrd. създавам
необходимите символни връзки (на същата пепел, AWK, СЕД и т.н.)
/ Бин директория на BusyBox. BusyBox разбира кое е започната полезността и
Тя осигурява необходимите функции. Малък брой връзки, създаден
в този каталог да се направи първоначален сценарий (тези връзки водят назад
също на BusyBox).

Следващата стъпка - е създаването на необходимите ustroyst файлове. Аз ги копирате
директно от / сътрудничество директория със своята операционна система, като се използва опцията -a (за
ср), за да запазите атрибутите на файла.

Предпоследната стъпка - създаването на linuxrc файл. След ядрото
овен монтира устройството, изглежда за първоначален скрипт, за да бъде изпълнена. Ако първоначален файл
не е намерен, ядрото изпълнява linuxrc подаде вместо първоначален. Този файл
основни операции се извършват за задаване на околната среда, например
монтира файловата система / Proc. В допълнение към / Proc Просто
монтира файловата система / Сис, и показва съобщение в конзолата. В края на
писти пепел (Bourne обвивка клонинг), за да бъде в състояние да си взаимодействат с
кореноплодни FS. Linuxrc изпълним файл се поставя (+ х), като използвате флаг
команда коригират.

В резултат на това ние се пригответе да се изкорени FS. Изображението е демонтирана и
компресира, използвайки софтуерна. Полученият файл (ramdisk.img.gz)
копира в директорията / обувка, за да бъде в състояние да изтеглите GRUB'om
или Лило.

За да създадете първоначалния RAM диск, можете просто да стартирате mkinitrd и той
автоматично събира на изображението и го копирайте в / обувка

Разпределение на Linux в initrd интересно открито е разработена
източник проект, в който цялото разпределение на Linux е бил поставен в картинката
initrd, той се нарича Минимакс. Той заема 32 мегабайта. Той включва
BusyBox и самата uClibc до по-малък размер. Въпреки малкия си
размер, това е разпределение на базата на ядро ​​2.6 и е в сравнително
голям брой полезни комунални услуги.

Една алтернатива на файловата система ext2 Ext2 е стандарт
де факто стандарт за Linux, но ако алтернативите, които намаляват
размера на окончателното initrd на изображението. Например romfs (ROM файлова система),
CramFS (сгъстен ROM файлова система) и SquashFS (силно компресиран файл
система е само за четене). Ако имате нужда от нещо да пише на FS, ext2
Тя ще се вмести. Най-накрая има e2compr - това разширение
за ext2 драйвер, който поддържа компресия.

Тестване индивидуален initrd образ

Така че, новия си initrd образ е в / багажника, следващата стъпка
Ние трябва да го тествате с ядрото си. Рестартирайте системата и когато
Появява GRUB ред, натиснете бутона C, тя ще се трансформира в GRUB
режим на команден ред. Можете да vzaimodestvovat с такава GRUB'om
да се премине към параметри на ядрото, специфични или да качите ваша собствена картинка
initrd. ядрото команда да се определи кои ядрото да се зареди, а екипът
initrd initrd изберете изображението. Когато тези параметри opredelnie набиране
и зареждане на ОС зарежда определен ядрото и initrd.

Обява 5. Ръчно зареждане на ядрото и initrd използване GRUB

кльопам> /bzImage-2.6.1 ядрото
[Linux-bzImage, настройка = 0x1400, размер = 0x29672e]

кльопам> initrd /ramdisk.img.gz
[Linux-initrd @ 0x5f2a000, 0xb5108 байта]

Uncompressing Linux. Добре, стартиране на ядрото.

Обява 6. Заредете Linux ядрото с един прост initrd


MD: Autodetecting RAID масиви
MD: автомобил
MD. автомобил направено.
Ramdisk: Сгъстен изображение намерите в блок 0
VFS: Монтирани корен (ext2 файлова система).
Освобождаване на неизползвана памет на ядрото: 208k освободен
/ $ Ls
бен др linuxrc PROC сис
Дев ИЪ загубил + намерено sbin
/ $ Cat / Proc / 1 / команден-ред
/ Bin / пепел / linuxrc
/ $ Cd бин
/ BIN $ ли
пепел котка ехо монтиране Sysctl
BusyBox dmesg ли к.с.
/ Bin $ докосване zfile
/ BIN $ ли
пепел котка ехо монтиране Sysctl
BusyBox dmesg ли к.с. zfile

Процесът на зареждане с първоначална RAM диск

Вече знаете как да се съберат си initrd образ, в тази част ние астатин
погледнете как ядрото идентифицира и initrd е монтиран като корен файлова система.
Минах през този процес на спиране на някои от най-важните
функции във веригата за зареждане, които обясняват какво се случва.

Loader, като GRUB, идентифицира ядрото, която искате да заредите и
копирате изображението на ядрото и initrd в паметта. Можете да намерите описание на всички
необходими функции в директорията / първоначален в ядрото източник дърво.

След ядрото и initrd разопаковани и копирани в паметта
Той маркира ядрото. В този момент, има много различни инициализация
процедури, в крайна сметка ще се озовете в инициализиращите / Стартиране функции: първоначален ()
(Функция Поддиректория / файл). Тази функция е просто
инициализация подсистема. Следователно, налице е извикване на функция
първоначален / do_mounts.c: prepare_namespaces (), който подготвя работата
пространство (монтира файлова система Дев, RAID или MD устройство и,
В резултат на това той initrd). Зарежда initrd се прави, като се обадите
първоначален / do_mounts_initrd.c: initrd_load ().

initrd_load () функция нарича първоначален / do_mounts_rd.c: rd_load_image ()
който определя RAM диск Брас за да го заредите в
първоначален / do_mounts_rd.c: identify_ramdisk_image (). Тази функция проверява
"Магическо число" на изображението, за да определи кои бензиностанции тази снимка:
minux, ext2, romfs, CramFS или софтуерна формат. Vozvrayaschayas да функционират
initrd_load_image, има телефони първоначален / do_mounts_rd: crd_load (). това
функция разпределя памет пространство за RAM диск и споменатата контролна
(CRC), след това разархивира и зарежда RAM диск в паметта. сега
Вашата initrd образ е в подходящ блок за монтаж
устройство.

Монтаж блок Устройство започва корен раздел
в първоначален / do_mounts.c функция: mount_root (). Един получава корен дял, и
Той се среща първоначален / do_mounts.c разговор: mount_block_root (). Оттук идва и името
първоначален / do_mounts.c: do_mount_root (), което причинява
FS / namespace.c: sys_mount (), трябва да се монтира на основните FS и си отиват
в нея. Това е мястото, където на изхода в конзолата познат ни от списъка 6
Мнение VFS: Монтирани корен (ext2 файлова система).

В края на краищата, вие се върнете към функцията за първоначален се извиква
първоначален / Стартиране: run_init_process. Това се случва в резултат на execve на повикване
За да започнете първоначален процес (в този случай linuxrc). Linuxrc може
да бъде или изпълним файл или скрипт (ако скриптът е,
интерпретатор).

Обява 7 показва йерархията на функции. Не всички функции участват в
процеса на копиране и инициализация монтира RAM диск
Тук е показано, но общата идея на цялостния процес е даден тук.

Обява 7. Йерархия на основните функции, които участват в процеса на зареждане и
монтиране initrd

първоначален / Стартиране: първоначален
първоначален / do_mounts.c: prepare_namespace
първоначален / do_mounts_initrd.c: initrd_load
първоначален / do_mounts_rd.c: rd_load_image
първоначален / do_mounts_rd.c: identify_ramdisk_image
първоначален / do_mounts_rd.c: crd_load
ИЪ / inflate.c: gunzip
първоначален / do_mounts.c: mount_root
първоначален / do_mounts.c: mount_block_root
първоначален / do_mounts.c: do_mount_root
FS / namespace.c: sys_mount
първоначален / Стартиране: run_init_process
execve

бездискова системи

Намаляване на размера на initrd образа

Когато създавате вградена система и искате да се постигне в най-малките
размера на initrd на изображението, ако няколко трика, за да го направят.
Първият край - използва BusyBox (описан в статията). BusyBox включва
няколко мегабайта комунални услуги и ги компресира до няколкостотин
килобайт.

В този пример BusyBox компилиран статично, т.е. той не трябва да се
работят всички библиотеки. Въпреки това, трябва eesli стандартни библиотеки
С език (за допълнителни програми), има начини за решаване на този neskolno
problemmu не използват масово НЬс. Първата малка библиотека
подходящ за нашите цели е uClibc, която е сведена до минимум
версия на стандартната библиотека на C за системи с ограничено пространство.
Друг библиотека, която е идеална от гледна точка на диск
Космосът е dietlib. Не забравяйте, че за да получите вашата програма
работи с олекотена версия, тези програми трябва да бъдат прекомпилирани
С помощта на тези библиотеки се нуждаят от допълнителна работа,
но си струва.

Подкрепете проекта - споделете линка, благодаря!