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


12

Я только что установил базовую систему 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, чтобы машина загрузилась немного быстрее (мне все равно не нужна гибкость).


Initrd может оказать небольшое влияние на время загрузки, но это не повлияет на производительность вашей системы, когда она будет запущена и работает.
Кристоф Провост

о да, я на самом деле имел в виду время загрузки, отредактировано
phunehehe

Ответы:


6

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

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

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

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

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

Очевидно, вы можете собрать initrd самостоятельно, как указано здесь для initramfs или здесь для initrd .


Хорошо, спасибо за подтверждение, но вы пропустите часть "Если нет, то как я могу сделать initrd сам?"
phunehehe

Добавил немного информации и слил мой другой ответ в этот.
танте

8
Небольшое исправление: initrd не используется для загрузки ядра : ядро ​​загружается загрузчиком (GRUB, LILO, что угодно); initrd - это своего рода ram-диск, который предоставляет исходную корневую файловую систему. Он должен содержать все двоичные файлы (например, модули ядра, программы поддержки пользовательского пространства), необходимые для реальной работы системы. Вот почему он необходим для корня LVM: подсистему LVM необходимо инициализировать, а ее инициализация слишком сложна, чтобы ее можно было удобно выполнять только с помощью параметров загрузки ядра; Таким образом, linuxrcскрипт в initrd выполняет эту задачу.
Риккардо Мурри

Вы, конечно, правы, я был немного неаккуратен с моей формулировкой.
Танте

2
Невозможно поднять голос из-за довольно большой ошибки в ответе (initrd не позволяет загружать ядро).
Wzzrd

5

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

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

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

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

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

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

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

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

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

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


+1 за упоминание встроенного модуля против модуля в ядре компиляции.
амфетамина

lsmodиз запущенного ядра также полезно.
LawrenceC

2

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

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

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

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

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


2

Хотя невозможно использовать какой-либо тип 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}

1

Да, это так.

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

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

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


эй, это на самом деле выглядит великолепно, я должен попробовать!
phunehehe
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.