LINUX.ORG.RU

initrd - Параличъ мозжечка


0

0

Ничего не могу понять с этой initrd. Я понял что она нужна для того чтобы загрузить ядро. Я прав? Но почему нельзя без него? Написано что / еще не доступен. Что за нафиг? А что /boot не в / находится? Объясните мне, что это такое, пожалуйста.

можно без него
если ядро содержит драйвера

1) контроллера жесткого диска (ide, sata/pata, scsi)
2) драйвер для жесткого диска (ide или scsi)
3) драйвер для файловой системы / ( ext3 , ext4 ... и т п)

какой дистрибутив и какие именно сложности возникли?

Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

Никаких сложностей нет. Просто я когда собирал ядро не нашел initrd.img. Т.е. я сделал make menuconfig, make modules_install, make install, и в /boot только конфиг и ядро, а initrd.img нет. Я так понимаю что make решил что он мне не нужен, я прав? Я потом сам делал, и update-grub сам добавил initrd в загрузку. Я так понимаю что когда я приду домой, удалю initrd и сделаю update-grub то все нормально загрузится? Я не могу понять как такое может быть - / недоступен, а /boot доступен, который находится на том же разделе. Как такого можно добится?

facelift
() автор топика
Ответ на: комментарий от Sylvia

У меня Debian. Просто я смотрел какую-то страничку в интернете, там собирали ядро, и у них там уже был initrd.img, а у меня не было. Это почему так? Может быть у них дистр был другой? Процесс сборки ядра может отличаться для разных дистров?

facelift
() автор топика
Ответ на: комментарий от facelift

отличается если собирать дистрибутивными утилитами

make-kpkg для дебиана вроде бы )

или можете сами сделать

update-initramfs -c -k <версия ядра>

создает initrd.img-версияядра
в /boot

Sylvia ★★★★★
()
Ответ на: комментарий от facelift

>Я не могу понять как такое может быть - / недоступен, а /boot доступен, который находится на том же разделе.

Если в ядре нет нужный драйверов (см. пост выше), то ядру не будет доступен не /boot, ни /root. В процессе загрузки загрузчик (grub или lilo) читают ядро с жеского диска в память, ядро при этом ещё не работает, работает загрузчик, у которого есть доступ ко всему жёсткому диску и к /boot и к /. Далее загрузчик может загрузить в память initrd и сказать ядру, что вот тебе в памяти initrd (фактически RAM-диск), и это твоя корневая система на данный момент, а может просто сказать, что корневой раздел надо искать на, допустим, /dev/hda2.

Процессы сборки ядра для разных дистрибутивов разные тем, что по хорошему, нужно скомпилированное ядро завернуть в пакет, а потом инсталлировать этот пакет, чтобы у менеджера пакетов не было проблемм. Хотя обычно свежескомпилированное ядро просто копируют в /boot.

Будет ли ядро требовать для своей загрузке initrd зависит от того как собирать, а не от дистрибутива. Вариант с initrd более гибкий, так как позволяет не держать в ядре лишних драйверов и позволяет (при соответсвуещем скрипте в initrd) монтировать корневую ФС не по имени устройства, а по UUID или метки файловой системы. Но надо помнить, что для каждой версии ядра может быть нужен свой initrd и если держать несколько ядер нужно правильно настраивать загрузчик.

mky ★★★★★
()
Ответ на: комментарий от mky

1) Теперь стало намного понятнее. Теперь я понял что grub имеет доступ ко всему диску (ведь свой конфиг он же как-то читает?) и понял процесс загрузки. Теперь возник вопрос как это так grub делает что он может читать все (а он все или только /boot может читать?) с диска,
а ядро не может (предположим что у нас модулей для reiser-fs в ядре нет)? Если у меня /boot будет на /, а файловая система будет reiser-fs, что будет тогда?
2) А то что у меня после make install на Debian не оказалось initrd.img вполне нормальное явление, и случилось так именно потому что я так собирал ядро? А мог бы собирать так, что initrd.img появилось бы
в /boot.

facelift
() автор топика
Ответ на: комментарий от facelift

>как это так grub делает что он может читать

у него базовый доступ только для чтения и для ограниченного поиска по поддерживаемым файловым системам

сделайте

ls -l /boot/grub/*stage*

-rw-r----- 1 root root 8736 Nov 29 2008 e2fs_stage1_5
-rw-r----- 1 root root 8704 Nov 29 2008 fat_stage1_5
-rw-r----- 1 root root 9600 Nov 29 2008 jfs_stage1_5
-rw-r----- 1 root root 7936 Nov 29 2008 minix_stage1_5
-rw-r----- 1 root root 10560 Nov 29 2008 reiserfs_stage1_5

собственно вот его "драйвера" (условно) для поддерживаемых FS
ядро естественно этими "драйверами" не пользуется из за крайней ограниченности их функций

Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

PS: если используется lilo (у вас его нет, но для полноты картины стоит и его упомянуть) то он запоминает локацию файлов ядра и initrd в физической адресации диска (запрашивает у ядра в момент обновления boot record)

Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

Silvy, mky, огромное спасибо, теперь все понятно.

facelift
() автор топика

Стоит наверно заметить, что через функции биос есть доступ к диску и без файловой системы, а как к блочному устройству, если знать смещение от начала диска, то можно загрузить несколько блоков в оперативную память и передать управление на эти адреса

dimon555 ★★★★★
()
Ответ на: комментарий от notolerance

>initrd - костыли линупса. Привыкай.

windows pe вот классика костылестроения

dimon555 ★★★★★
()
Ответ на: комментарий от notolerance

>initrd - костыли линупса. Привыкай.

initrd - это лучшее изобретение всех времён и народов.

scaldov ★★
()

initrd нужен для того чтобы не захламлять память ненужными модулями.

Для доступа ядра к корневому разделу нужен драйвер контроллера hdd. Есть туча драйверов контроллеров hdd, ясно что для конкретной машины нужен только 1. Что делать? вариант 1 - вкомпилить нужный модуль в ядро, это проходит для конкретной машины, но для дистрибутива надо вкомпиливать все, что нехорошо т.к. они будут кушать память. Тогда появился initrd, который читается с hdd загрузчиком в память и в памяти раскрывается ядром как fs. Для универсальности в нем просто скрипт/бинарник linuxrc, который делает что надобно, а в основном грузит модуль этого самого контроллера hdd. Потом память занимаемая initrd освобождается. Всё.

gena2x ★★★
()

Мой комментарий - недольшое дополнение. Предыдущие ораторы раскрыли причину существования initrd недостаточно внятно.

gena2x ★★★
()

Я понял что она нужна для того чтобы загрузить ядро.

Нет не прав. Оно нужно для того чтобы загрузить ядро только в тех случаях когда модуль на железку, к примеру хард, вкомпилировать в ядро не получается и без железки загрузить даже само ядро, это не говоря о его модулях, проблематично.

Но почему нельзя без него?

Можно. Если у тебя все модули железок необходимые для загрузки самого ядра вкомпилированы в само ядро.

Написано что / еще не доступен. Что за нафиг?

Проверяй конфиг ядра раздел файловые системы. И конфиг груба либо иного загрузчика...

А что /boot не в / находится?

А хз. Зависит от того как ты разбивал.

init_6 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.