Можно ли установить root в LVM без использования initrd?

Я только что создал базовую систему Gentoo (что означает, что я могу загрузиться и войти в систему и сделать с ней все). Мой корневой раздел находится в виртуальной группе LVM2 (с разделенным /boot разделом). Для загрузки мне нужно передать параметры ниже в ядро:

 root=/dev/ram0 real_root=/dev/vg/rootlv init=/linuxrc dolvm 

По-видимому, он использует начальный ramdisk, чтобы что-то сделать (я думаю, загружая вещи LVM) перед установкой root. Есть ли способ, которым я могу поместить этот код в самое ядро, чтобы не требовалось initrd? Если нет, как я могу сделать initrd самостоятельно?

Возможно, было бы полезно добавить, что я попытался скомпилировать ядро ​​для корня без LVM без initrd, и он отлично работал. Затем я попытался переложить все это на LVM и не смог заставить машину загружаться (я думаю, он не может справиться с вещами LVM). Затем я использовал инструмент genkernel с опцией --lvm и он создает рабочее ядро ​​и initrd, которые я сейчас использую.

Теперь я хочу пропустить genkernel и сделать все самостоятельно, желательно без initrd, чтобы машина загружалась несколько быстрее (в любом случае мне не нужна гибкость).

Простой ответ: Нет. Если вы хотите LVM, вам нужен initrd.

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

Initrd позволяет загружать ядро: если ваше ядро ​​находится на диске LVM, вся среда LVM должна быть установлена ​​до того, как будет загружен двоичный файл, содержащий ядро.

Посмотрите запись в Wikipedia на initrd, которая объясняет, что делает initrd и зачем вам это нужно.

Еще одно замечание: я вижу, что вы хотите сделать что-то сами, но вы можете заразиться руками даже с genkernel. Используйте genkernel –menuconfig all, и вы можете в принципе настроить все так, как если бы вы полностью построили свое ядро ​​без поддержки инструмента, genkernel просто добавляет make bzImage, создает модули и создает для вас модули-модули и делает этот неприятный материал initrd.

Вы, очевидно, можете построить initrd самостоятельно, как это описано здесь для initramfs или здесь для initrd .

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

Вот основные правила, которые вам нужно сделать для создания ядра без initrd (из памяти я точно не помню):

  1. Перекомпилируйте ядро, убедитесь, что оно встроено в ядро ​​(ВАЖНО: не как модуль!):

    1. драйвер материнской платы и драйвер жесткого диска (оба в драйвере Device Drivers )
    2. драйвер файловой системы для / , /etc/* и /lib/modules/* (в разделе « File systems )

    В основном, ядро ​​должно иметь возможность монтировать корневую файловую систему, читать / etc / fstab, загружать другие модули драйверов (при необходимости) и монтировать другие файловые системы, отличные от root, для завершения остальной части процесса загрузки. Если у вас более активный процесс загрузки, например, загрузка по сети, вам также необходимо создать эти драйверы.

  2. Отключить initrd из ядра «Общая настройка». Начальные RAM-файловые системы и RAM-диск (initramfs / initrd) поддерживают «aka CONFIG_BLK_DEV_INITRD = n.

  3. Измените конфигурацию GRUB, вам больше не нужны init = и realroot =, а setup root =, поэтому он указывает на устройство корневой файловой системы.

Я думаю, что все. Не забудьте сохранить резервное ядро ​​и хорошую копию загрузочного Live CD, если что-то случится.

Все, что может пойти не так: если вы скомпилировали неправильные драйверы или если вы скомпилируете базовые драйверы в качестве модуля, ядро ​​не сможет прочитать файловую систему. Перезагрузитесь со свежим ядром или с Live CD и перекомпилируйте ядро ​​с правильными драйверами.

Единственная сложная часть – выяснить, какой драйвер относится к вашему оборудованию. Вы можете использовать lspci и lshw для определения вашего оборудования. Если у вас уже нет этих инструментов, emerge lshw pciutils .

Да, вам нужен initrd. Вот почему:

Обычный процесс загрузки начинается с загрузчика, который достаточно точно знает о вашей системе, чтобы найти ядро ​​и запустить его. (GRUB2 достаточно умен, чтобы найти ядро, расположенное на разделе LVM2 или RAID, но GRUB1 нет, поэтому обычно рекомендуется создавать / загружать как отдельный раздел с упрощенным макетом.) После его загрузки требуется ядро чтобы найти корневую файловую систему, чтобы она могла начать процесс загрузки. Однако LVM не может запускаться без запуска некоторых инструментов пользовательского пространства, которые существуют в корневой файловой системе, которые не могут быть загружены без инструментов LVM, которые существуют в корневой файловой системе …;)

Чтобы разбить этот цикл, initrd или initramfs представляют собой сжатую файловую систему, которая хранится в ядре (либо в / boot, либо внутри самого ядра), который содержит достаточно системы Linux для запуска таких сервисов, как LVM или MD или что-то еще вы хотите. Это временная файловая система, и она действует только как ваша корневая файловая система, достаточная для загрузки реального корня.

Что касается фактического создания, большинство документации по этой теме ошеломляюще устарело – например, lvm2create_initrd даже больше не работает на Gentoo. (Я создал то же самое несколько месяцев назад, и мне пришлось переписать сценарий, прежде чем я получил от него рабочий initrd.) Создание собственных initramf может быть забавным, и это единственный способ получить абсолютно минимальную загрузку (и узнайте, как Linux загружается в процессе), но это большая работа.

Короткий ответ: используйте Dracut. Это новая структура, которая создается для генерации initramfs главным образом автоматическим способом, и она находится в portage. Документация немного редка, но ее достаточно, чтобы понять, что это такое, и это самый простой способ получить твердые initramfs и корень LVM.

Хотя невозможно использовать какой-то initrd, невозможно использовать отдельные файлы initrd. (Я никогда не использовал genkernel, поэтому я не могу дать ему инструкцию).

Например, у меня есть опция:

 CONFIG_INITRAMFS_SOURCE="/usr/src/initrd.contents" 

Где /usr/src/initrd.contents в моем случае выглядит (у меня LVM + tuxonice + fbsplash):

 dir /bin 0755 0 0 file /bin/busybox /bin/busybox 0755 0 0 file /bin/lvm /sbin/lvm.static 0755 0 0 dir /dev 0755 0 0 dir /dev/fb 0755 0 0 dir /dev/misc 0755 0 0 dir /dev/vc 0755 0 0 nod /dev/console 0600 0 0 c 5 1 nod /dev/null 0600 0 0 c 1 3 nod /dev/snapshot 0600 0 0 c 10 231 nod /dev/tty1 0600 0 0 c 4 0 dir /etc 0755 0 0 dir /etc/splash 0755 0 0 dir /etc/splash/natural_gentoo 0755 0 0 dir /etc/splash/natural_gentoo/images 0755 0 0 file /etc/splash/natural_gentoo/images/silent-1680x1050.jpg /etc/splash/natural_gentoo/images/silent-1680x1050.jpg 0644 0 0 file /etc/splash/natural_gentoo/images/verbose-1680x1050.jpg /etc/splash/natural_gentoo/images/verbose-1680x1050.jpg 0644 0 0 file /etc/splash/natural_gentoo/1680x1050.cfg /etc/splash/natural_gentoo/1680x1050.cfg 0644 0 0 slink /etc/splash/tuxonice /etc/splash/natural_gentoo 0755 0 0 file /etc/splash/luxisri.ttf /etc/splash/luxisri.ttf 0644 0 0 dir /lib64 0755 0 0 dir /lib64/splash 0755 0 0 dir /lib64/splash/proc 0755 0 0 dir /lib64/splash/sys 0755 0 0 dir /proc 0755 0 0 dir /mnt 0755 0 0 dir /root 0770 0 0 dir /sbin 0755 0 0 file /sbin/fbcondecor_helper /sbin/fbcondecor_helper 0755 0 0 slink /sbin/splash_helper /sbin/fbcondecor_helper 0755 0 0 file /sbin/tuxoniceui_fbsplash /sbin/tuxoniceui_fbsplash 0755 0 0 file /sbin/tuxoniceui_text /sbin/tuxoniceui_text 0755 0 0 dir /sys 0755 0 0 file /init /usr/src/init 

И /usr/src/init :

 #!/bin/busybox ash local X ROOT RUNLEVEL INIT PARAM # Preliminary stuff mount -t proc proc /proc mount -t sysfs sysfs /sys mdev -s /bin/lvm vgchange -ay picard-main # Try to resume. This never returns if it succeeds test -e /sys/power/tuxonice/do_resume && echo 1 > /sys/power/tuxonice/do_resume #/bin/resume # Parse the command line for relevant options. INIT=/sbin/init RESCUE="" PARAM=" " for X in `cat /proc/cmdline` do case "$X" in root=*) ROOT=${X#root=} ;; [0-6Ss]) RUNLEVEL=${X} ;; init=*) INIT=${X#init=} ;; rescue) RESCUE="rescue" ;; splash=*) PARAM="${PARAM} ${X}" ;; consol=*) PARAM="${PARAM} ${X}" ;; esac done if [ x${RESCUE} = xrescue ] then busybox ash fi # Mount and switch root. mount -o ro ${ROOT} /mnt umount -f /sys || umount -l /sys umount -f /proc || umount -l /proc exec switch_root /mnt ${INIT} ${RUNLEVEL} ${PARAM} 

Да.

Сложности, возникающие при создании и обработке initrds, оказываются спорными, если вы устанавливаете и используете grub2. Grub2 wiki http://grub.enbug.org/LVMandRAID описывает, как вы можете иметь / boot на lvm с не более чем insmod lvm в grub.cfg, файле конфигурации grub, поэтому нет необходимости в initrd.

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

Наслаждайтесь!