Я только что установил базовую систему Gentoo (что означает, что я могу загружаться, входить в систему и делать что-то с ней сейчас). Мой корневой раздел находится в виртуальной группе LVM2 (с отдельным /boot
разделом). Для загрузки мне нужно передать нижеуказанные параметры ядру:
root=/dev/ram0 real_root=/dev/vg/rootlv init=/linuxrc dolvm
Очевидно, что он использует начальный ramdisk, чтобы сделать что-то (я думаю, загрузка вещей LVM) перед монтированием root. Есть ли способ, которым я могу поместить этот код в само ядро, чтобы не нужен initrd? Если нет, то как я могу сделать initrd сам?
Возможно, было бы полезно добавить, что я пытался скомпилировать ядро для не-LVM root без initrd, и оно работало отлично. Затем я попытался поместить все это под LVM и не смог загрузить машину (я думаю, она не может справиться с вещами LVM). Затем я использовал genkernel
инструмент с --lvm
опцией, и он создает рабочее ядро и initrd, которые я сейчас использую.
Теперь я хочу пропустить genkernel
и сделать все самостоятельно, желательно без initrd, чтобы машина загрузилась немного быстрее (мне все равно не нужна гибкость).
Ответы:
Простой ответ: Нет. Если вы хотите LVM, вам нужен initrd.
Но, как уже говорили другие: LVM не замедляют работу вашей системы и не делают ничего плохого по-другому, они просто позволяют вам создать среду, которая позволяет вашему ядру загружаться и выполнять свою работу.
Initrd позволяет загружать ваше ядро: если ваше ядро находится на диске LVM, перед загрузкой двоичного файла, содержащего ядро, должна быть установлена вся среда LVM.
Проверьте запись в Википедии на initrd, которая объясняет, что делает initrd и зачем вам это нужно.
Еще одно замечание: я вижу, что вы хотите делать что-то самостоятельно, но вы можете испачкать руки даже с помощью genkernel. Используйте genkernel --menuconfig all, и вы можете установить все так, как если бы вы собирали свое ядро полностью без поддержки инструментов, genkernel просто добавляет make bzImage, make modules и строки modules_install для вас и выполняет такие неприятные вещи initrd.
Очевидно, вы можете собрать initrd самостоятельно, как указано здесь для initramfs или здесь для initrd .
источник
linuxrc
скрипт в initrd выполняет эту задачу.редактировать: только что понял, что вы пытаетесь загрузиться на LVM, я никогда не настраивал LVM, никогда не нуждался в них, поэтому, вероятно, подход здесь может не сработать
Вот основные правила, которые необходимо выполнить для создания ядра без initrd (из памяти я точно не помню):
Перекомпилируйте ядро, убедитесь, что встроено в ядро (ВАЖНО: не как модуль!):
Device Drivers
)/
,/etc/*
и/lib/modules/*
(вFile systems
)По сути, ядро должно иметь возможность монтировать корневую файловую систему, читать файл / etc / fstab, загружать другие модули драйверов (при необходимости) и монтировать другие некорневые файловые системы для завершения остальной части процесса загрузки. Если у вас более сложный процесс загрузки, например загрузка по сети, вам также необходимо встроить эти драйверы.
Отключите initrd в ядре: «Общая настройка> Поддержка файловых систем начальной памяти и диска RAM (initramfs / initrd)» aka CONFIG_BLK_DEV_INITRD = n.
Измените конфигурацию GRUB, вам больше не нужны init = и realroot =, и настройте root =, чтобы он указывал на устройство корневой файловой системы.
Я думаю, что это все. Не забудьте сохранить резервную копию ядра и хорошую копию загрузочного Live CD на случай, если что-то случится.
То, что может пойти не так: если вы скомпилировали неправильные драйверы или если вы скомпилировали базовые драйверы как модуль, ядро не сможет прочитать файловую систему. Перезагрузитесь с новым ядром или с Live CD и перекомпилируйте ядро с правильными драйверами.
Единственная сложная задача - выяснить, какой драйвер относится к вашему оборудованию. Вы можете использовать
lspci
и,lshw
чтобы помочь определить ваше оборудование. Если у вас еще нет этих инструментов, тогдаemerge lshw pciutils
.источник
lsmod
из запущенного ядра также полезно.Да, вам нужен initrd. Вот почему:
Обычный процесс загрузки начинается с загрузчика, который знает достаточно о вашей системе, чтобы найти ядро и запустить его. (GRUB2 достаточно умен, чтобы найти ядро, расположенное в разделе LVM2 или RAID, но GRUB1 нет, поэтому обычно рекомендуется создавать / загружать как отдельный раздел с упрощенной разметкой.) После загрузки ядру необходимо чтобы можно было найти корневую файловую систему, чтобы она могла начать процесс загрузки. Однако LVM не может запуститься без запуска некоторыми инструментами пользовательского пространства, которые существуют в корневой файловой системе, которые не могут быть загружены без инструментов LVM, которые существуют в корневой файловой системе ...;)
Чтобы разорвать этот цикл, initrd или initramfs - это сжатая файловая система, хранящаяся с ядром (либо в / boot, либо внутри самого ядра), которая содержит достаточно системы Linux для запуска таких служб, как LVM или MD или что-то еще ты хочешь. Это временная файловая система, и она действует только как корневая файловая система достаточно долго для загрузки реального корня.
Что касается создания, большая часть документации по этой теме потрясающе устарела - например, lvm2create_initrd даже не работает на Gentoo. (Я установил то же самое несколько месяцев назад, и мне пришлось почти переписать сценарий, прежде чем я получил от него рабочий initrd.) Создание собственных initramfs может быть забавным, и это единственный способ получить абсолютно минимальную загрузку процесс (и узнать все о том, как Linux загружается в процессе), но это много работы.
Краткий ответ: используйте Dracut. Это новый фреймворк, созданный для генерации initramfs в основном автоматическим способом, и он находится на порте. Документация немного скудная, но ее достаточно, чтобы разобраться, и на сегодняшний день это самый простой способ получить твердый initramfs и корень LVM.
источник
Хотя невозможно использовать какой-либо тип initrd, можно не использовать отдельные файлы initrd. (Я никогда не использовал genkernel, поэтому не могу дать инструкции для него).
Например, я установил параметр:
Где
/usr/src/initrd.contents
в моем случае выглядит (у меня LVM + tuxonice + fbsplash):И
/usr/src/init
это:источник
Да, это так.
Сложности, возникающие при создании и обработке initrds, оказываются спорными, если вы устанавливаете и используете grub2. Вики grub2 http://grub.enbug.org/LVMandRAID описывает, как вы можете иметь / boot на lvm, используя только insmod lvm в grub.cfg, файле конфигурации grub, поэтому нет необходимости в initrd.
grub2 теперь в версии 1.98, но все еще в экспериментальной ветке в gentoo. Однако он может быть установлен в другом слоте и отлично подходит для использования.
Наслаждайтесь!
источник