Чи можна поставити корінь у LVM без використання initrd?


12

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

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

Мабуть, це використовує початковий ramdisk, щоб зробити щось (я думаю, завантажуючи речі LVM) перед монтажем root. Чи є спосіб, щоб я міг ввести цей код у самому ядрі, щоб не потрібен initrd? Якщо ні, то як я можу зробити собі інітард сам?

Може бути корисним додати, що я спробував скласти ядро ​​для не-LVM root, без initrd, і воно працювало чудово. Потім я спробував поставити всю річ під LVM і не зміг змусити машину завантажитися (я думаю, вона не може мати справу з речами LVM). Тоді я використав genkernelінструмент з --lvmопцією, і він створює робоче ядро ​​та initrd, якими я зараз користуюся.

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


Інітдр може мати невеликий вплив на час завантаження, але це не вплине на продуктивність вашої системи після її запуску та роботи.
Прорік Крістоф

о так, я насправді мав на увазі час завантаження, відредаговано
phunehehe

Відповіді:


6

Проста відповідь: Ні. Якщо ви хочете LVM, вам потрібен initrd.

Але, як говорили інші раніше: LVM не уповільнюють роботу вашої системи чи не роблять нічого поганого по-іншому, вони просто дозволяють створити середовище, яке дозволяє вашому ядру завантажуватися та виконувати свою роботу.

Інітдр дозволяє завантажувати ваше ядро: Якщо ваше ядро ​​знаходиться на LVM-диску, слід встановити все середовище LVM, перш ніж бінарний файл, що містить ядро, може бути завантажений.

Ознайомтеся з записом у Вікіпедії про initrd, де пояснюється, що робить initrd і навіщо це вам потрібно.

Ще одна примітка: я бачу, що ви хочете робити речі самостійно, але ви можете забруднити руки навіть з генкернел. Використовуйте genkernel --menuconfig all, і ви в основному можете встановити все так, як ніби ви створили б ваше ядро ​​повністю без підтримки інструментів, genkernel просто додає make bzImage, виготовляє модулі та робить модулі module_install для вас, і робить це неприємне інтридж.

Ви можете, очевидно, створити інітард самостійно, як це окреслено тут для initramfs або тут для initrd .


Добре дякую за підтвердження, але ви пропускаєте частину "Якщо ні, то як я можу зробити собі" initrd "?"
phunehehe

Додав трохи інформації та з’єднав мою іншу відповідь у цю.
tante

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

Ви, звичайно, праві, я був дещо неохайний зі своїми фразуваннями.
tante

2
Неможливо подати заявку через досить велику помилку у відповіді (initrd не дозволяє завантажувати ядро).
wzzrd

5

редагувати: щойно зрозумів, що ти намагаєшся завантажувати LVM, я ніколи не встановлював LVM, ніколи не потребував їх, тому, ймовірно, підхід тут може не спрацювати

Ось основні правила, які вам потрібно виконати, щоб створити ядро ​​без initrd (з пам’яті я точно не пам’ятав):

  1. Перекомпілюйте своє ядро, переконайтеся, що воно вбудовано в ядро ​​(ВАЖЛИВО: не як модуль!):

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

    В основному, ядро ​​повинно мати можливість монтувати кореневу файлову систему, читати / etc / fstab, завантажувати інші модулі драйверів (якщо потрібно) та монтувати інші некоренні файлові системи, щоб завершити решту процесу завантаження. Якщо у вас є більш задіяний процес завантаження, наприклад, завантаження мережі, тоді вам також потрібно вбудувати ці драйвери.

  2. Вимкнути initrd з ядра "Загальна настройка> Початкові файлові системи RAM та диск RAM (initramfs / initrd)" aka CONFIG_BLK_DEV_INITRD = n.

  3. Змінивши GRUB-конфігурацію, вам більше не потрібно init = і realroot =, а встановити root = так він вказує на пристрій кореневої файлової системи.

Я думаю, що це все. Не забудьте зберегти резервне ядро ​​та гарну копію завантажувального Live CD, якщо щось трапиться.

Речі, які можуть піти не так: якщо ви компілювали в неправильних драйверах або якщо ви збираєте основні драйвери як модуль, ядро ​​не може прочитати файлову систему. Перезавантажте свіже ядро ​​або живий компакт-диск та перекомпілюйте ядро ​​з правильними драйверами.

Єдина складна частина - це з’ясувати, який драйвер відповідає вашому обладнання. Ви можете використовувати lspciта lshwдопомогти визначити своє обладнання. Якщо у вас уже немає цих інструментів, значить emerge lshw pciutils.


+1 для згадування вбудованого порівняно з модулем у компіляції ядра.
амфетамахін

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

2

Так, вам потрібен initrd. Ось чому:

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

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

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

Коротка відповідь: використовуйте Dracut. Це новий фреймворк, який створюється для генерації initramfs здебільшого автоматизованим способом, і це у portage. Документація дещо рідкісна, але її там достатньо, щоб розібратися, і це, безумовно, найпростіший спосіб отримати міцні інітрами та корінь 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 описує, як ви можете мати / завантажувати файл у lvm, не маючи нічого іншого, ніж інстамований lvm у grub.cfg, файл конфігурації grub, отже, не потрібно initrd.

grub2 зараз у версії 1.98, але все ще в експериментальній галузі в gentoo. Однак він може бути встановлений в іншому слоті і є ідеально корисним.

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


Ей, що насправді виглядає чудово, я повинен спробувати!
phunehehe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.