Първоначално 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 температура В резултат на това ние имаме един малък корен файлова система, чието съдържание е показано на Обява 3. малка, но необходима гама от приложения, намиращи се в директорията на директория / хамбар, включително Неш (не черупка, скрипт преводач), insmod за товарене модули на ядрото, и LVM (помощна програма за управление LVM ). Обява 3. initrd структура подразбиране (за FC3) Интересът към обява 3 е първоначален в основната директория. Този файл, както и в традиционния процес на Linux обувка започва, когато initrd образа разопаковането в паметта. Ние ще анализираме този процес по-късно в тази статия. Да се върнем към началото и официално razbremsya как да се създаде един образ на initrd. За традиционните системи Linux initrd образа Содано време на инсталацията. Огромен брой програми, като например mkinitrd, може да бъде използван за създаване на initrd с необходимите библиотеки и модули за комуникация с корен FS. Mkinitrd е по същество конвенционална обвивка Използването CPIO команда CPIO команда. можете да манипулирате CPIO файлове. CPIO файл е по същество един прост konkatentsiya заглавна част на файла. CPIO файлов формат ви позволява да работите с двете ASCII файлове и двоичен. За съвместимост, използвайте ASCII, за да намалите размера - двоична версия. Поради факта, че много вградени системи, базирани на Linux не е твърд диск, на initrd е постоянна и FS. Обява 4 показва как да се създаде един образ на initrd. Аз се използва стандартен десктоп с кутия Linux, така че можете да изпробвате тези действия, без да има под ръка вградена система с Linux. Отделно от съставянето на друг Обява 4. Utility (mkird), за да създадете персонализирано изображение initrd # Камериер ... # Ramdisk Константи # Създаване на празен Ramdisk изображение # Направете го на ext2 монтиране на файловата система # Го монтирате за да можем да се пренесат # Населяват файловата система (поддиректории) # Вземете BusyBox и създаване на символни връзки # Вземете необходимите DEV файлове # Equate sbin с бин # Създаване на първоначален файл Обява 4. Script mkird за автоматично създаване на изображения За да създадете initrd образа, започнете чрез създаване на празен файл с помощта на Следващата стъпка е да се създадат необходимите поддиректории: / хамбар, / Сис, За тази корен FS predostavlyalya необходимата функционална употреба Следващата стъпка - е създаването на необходимите ustroyst файлове. Аз ги копирате Предпоследната стъпка - създаването на linuxrc файл. След ядрото В резултат на това ние се пригответе да се изкорени FS. Изображението е демонтирана и За да създадете първоначалния RAM диск, можете просто да стартирате mkinitrd и той Разпределение на Linux в initrd интересно открито е разработена Една алтернатива на файловата система ext2 Ext2 е стандарт Тестване индивидуален initrd образ Така че, новия си initrd образ е в / багажника, следващата стъпка Обява 5. Ръчно зареждане на ядрото и initrd използване GRUB кльопам> /bzImage-2.6.1 ядрото кльопам> initrd /ramdisk.img.gz Uncompressing Linux. Добре, стартиране на ядрото. Обява 6. Заредете Linux ядрото с един прост initrd Процесът на зареждане с първоначална RAM диск Вече знаете как да се съберат си initrd образ, в тази част ние астатин Loader, като GRUB, идентифицира ядрото, която искате да заредите и След ядрото и initrd разопаковани и копирани в паметта initrd_load () функция нарича първоначален / do_mounts_rd.c: rd_load_image () Монтаж блок Устройство започва корен раздел В края на краищата, вие се върнете към функцията за първоначален се извиква Обява 7 показва йерархията на функции. Не всички функции участват в Обява 7. Йерархия на основните функции, които участват в процеса на зареждане и първоначален / Стартиране: първоначален бездискова системи Намаляване на размера на initrd образа Когато създавате вградена система и искате да се постигне в най-малките В този пример BusyBox компилиран статично, т.е. той не трябва да се
# 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 -Осъществяване директории Utility, за да създадете initrd образ
скрипт, така че можете да видите как да се постигне необходимия резултат. Налице е също така YAIRD (Yet Another Mkinitrd) - програма, която ви позволява да персонализирате почти всеки параметър в initrd.Ръчно създаване на индивидуален initrd образ
платформа, концепцията за създаване на initrd образ е един и същ за вградени системи и настолни (включително сървъри).
RM-F /tmp/ramdisk.img
RM-F /tmp/ramdisk.img.gz
RDSIZE = 4000
BLKSIZE = 1024
дд ако = / Dev / нула = / TMP / ramdisk.img BS = $ BLKSIZE брои = $ RDSIZE
/ 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
в обратен ред / 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
Превърта стека
CP-а / сътрудничество / конзола / MNT / initrd / сътрудничество
CP-а / сътрудничество / Ramdisk / MNT / initrd / сътрудничество
CP-а / сътрудничество / ram0 / MNT / initrd / сътрудничество
CP-а / сътрудничество / нула / MNT / initrd / сътрудничество
CP-а / сътрудничество / tty1 / MNT / initrd / сътрудничество
CP-а / сътрудничество / tty2 / MNT / initrd / сътрудничество
в обратен ред / MNT / initrd
Въ -s бин sbin
Превърта стека
котка >> / MNT / initrd / linuxrc <
псевдо / Dev / нула (нулев дебит) като вход
поток ramdisk.img файл. Резултатът е размера на файла на 4
мегабайт (4000 първите килобайт блокове). След това, с помощта на командата
mke2fs, да създадете файл във файловата система ext2. След като файлът
форматиран като ext2, да го монтирате в директорията / MNT / initrd като
апарат линия. Точката за монтиране вече имате директория
който отразява система файла с ext2 файл и там вече можете да
прибере initrd образ.
/ Dev и / Proc. Един нужда необходимо само да се осигури изискваната
функционалност, като не се нуждаят от библиотека (това условие е вярно
когато се събират всички изпълними файлове, намиращи се в initrd образа
статично).
BusyBox. Това приложение е един от начините за много комунални услуги,
обикновено се използва в Linux системи (като пепел, AWK, СЕД,
insmod т.н.). BusyBox Предимството е, че той, в това число
функционалността на много от най-необходимите инструменти, има много по-малък размер.
Той е на идеален изход за вградени системи. Копирайте BusyBox в директорията
/ Bin в главната файлова система образ initrd. създавам
необходимите символни връзки (на същата пепел, AWK, СЕД и т.н.)
/ Бин директория на BusyBox. BusyBox разбира кое е започната полезността и
Тя осигурява необходимите функции. Малък брой връзки, създаден
в този каталог да се направи първоначален сценарий (тези връзки водят назад
също на BusyBox).
директно от / сътрудничество директория със своята операционна система, като се използва опцията -a (за
ср), за да запазите атрибутите на файла.
овен монтира устройството, изглежда за първоначален скрипт, за да бъде изпълнена. Ако първоначален файл
не е намерен, ядрото изпълнява linuxrc подаде вместо първоначален. Този файл
основни операции се извършват за задаване на околната среда, например
монтира файловата система / Proc. В допълнение към / Proc Просто
монтира файловата система / Сис, и показва съобщение в конзолата. В края на
писти пепел (Bourne обвивка клонинг), за да бъде в състояние да си взаимодействат с
кореноплодни FS. Linuxrc изпълним файл се поставя (+ х), като използвате флаг
команда коригират.
компресира, използвайки софтуерна. Полученият файл (ramdisk.img.gz)
копира в директорията / обувка, за да бъде в състояние да изтеглите GRUB'om
или Лило.
автоматично събира на изображението и го копирайте в / обувка
източник проект, в който цялото разпределение на Linux е бил поставен в картинката
initrd, той се нарича Минимакс. Той заема 32 мегабайта. Той включва
BusyBox и самата uClibc до по-малък размер. Въпреки малкия си
размер, това е разпределение на базата на ядро 2.6 и е в сравнително
голям брой полезни комунални услуги.
де факто стандарт за Linux, но ако алтернативите, които намаляват
размера на окончателното initrd на изображението. Например romfs (ROM файлова система),
CramFS (сгъстен ROM файлова система) и SquashFS (силно компресиран файл
система е само за четене). Ако имате нужда от нещо да пише на FS, ext2
Тя ще се вмести. Най-накрая има e2compr - това разширение
за ext2 драйвер, който поддържа компресия.
Ние трябва да го тествате с ядрото си. Рестартирайте системата и когато
Появява GRUB ред, натиснете бутона C, тя ще се трансформира в GRUB
режим на команден ред. Можете да vzaimodestvovat с такава GRUB'om
да се премине към параметри на ядрото, специфични или да качите ваша собствена картинка
initrd. ядрото команда да се определи кои ядрото да се зареди, а екипът
initrd initrd изберете изображението. Когато тези параметри opredelnie набиране
и зареждане на ОС зарежда определен ядрото и initrd.
[Linux-bzImage, настройка = 0x1400, размер = 0x29672e]
[Linux-initrd @ 0x5f2a000, 0xb5108 байта]
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
погледнете как ядрото идентифицира и initrd е монтиран като корен файлова система.
Минах през този процес на спиране на някои от най-важните
функции във веригата за зареждане, които обясняват какво се случва.
копирате изображението на ядрото и initrd в паметта. Можете да намерите описание на всички
необходими функции в директорията / първоначален в ядрото източник дърво.
Той маркира ядрото. В този момент, има много различни инициализация
процедури, в крайна сметка ще се озовете в инициализиращите / Стартиране функции: първоначален ()
(Функция Поддиректория / файл). Тази функция е просто
инициализация подсистема. Следователно, налице е извикване на функция
първоначален / do_mounts.c: prepare_namespaces (), който подготвя работата
пространство (монтира файлова система Дев, RAID или MD устройство и,
В резултат на това той initrd). Зарежда initrd се прави, като се обадите
първоначален / do_mounts_initrd.c: initrd_load ().
който определя 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 може
да бъде или изпълним файл или скрипт (ако скриптът е,
интерпретатор).
процеса на копиране и инициализация монтира RAM диск
Тук е показано, но общата идея на цялостния процес е даден тук.
монтиране 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 на изображението, ако няколко трика, за да го направят.
Първият край - използва BusyBox (описан в статията). BusyBox включва
няколко мегабайта комунални услуги и ги компресира до няколкостотин
килобайт.
работят всички библиотеки. Въпреки това, трябва eesli стандартни библиотеки
С език (за допълнителни програми), има начини за решаване на този neskolno
problemmu не използват масово НЬс. Първата малка библиотека
подходящ за нашите цели е uClibc, която е сведена до минимум
версия на стандартната библиотека на C за системи с ограничено пространство.
Друг библиотека, която е идеална от гледна точка на диск
Космосът е dietlib. Не забравяйте, че за да получите вашата програма
работи с олекотена версия, тези програми трябва да бъдат прекомпилирани
С помощта на тези библиотеки се нуждаят от допълнителна работа,
но си струва.