Действительно ли возможно поместить корень в LVM, не используя initrd?

Можно также заставить это произойти автоматически.

Я покажу Вам как в zsh, затем добавьте информацию о bash.

Сущность похожа на это:

preexec()
{
    starttime=$SECONDS
}

precmd()
{
    if ((SECONDS - starttime >= 5)); then
        aplay "sound.wav"
        # or printf "\b", or notify-send, or whatever
    fi
}

Можно также заставить его только сделать это, если программой был Python, например.

preexec()
{
    starttime=$SECONDS
    case $3 in python*)
        command_is_python=true;;
    *)
        command_is_python=false;;
    esac
}

precmd()
{
    if $command_is_python && ((SECONDS - starttime >= 5)); then
        aplay "sound.wav"
        # or printf "\b", or notify-send, or whatever
    fi
}

В bash, лучший способ состоит в том, чтобы загрузить preexec.bash.txt и получить его (например. . ~/preexec.bash.txt наверху Вашего ~/.bashrc, затем вышеупомянутое (или что-то близко к нему) должно работать. (Не уверенный в $3 бит, чтобы проверить, является ли командой Python.)

Если бы Вы используете Терминал GNOME, я также указал бы на Вас на Высвечивание Терминала GNOME. Это - патч, я записал, что это делает терминальное мигание, когда команда сделана, таким образом, Вы можете Alt-Tab к чему-то еще, затем это сообщает, когда это сделано.

12
28.09.2010, 06:48
5 ответов

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

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

initrd позволяет Вашему ядру быть загруженным: Если Ваше ядро находится на диске LVM, целая среда LVM должна быть установлена, прежде чем двоичный файл, который содержит ядро, может быть загружен.

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

Другое примечание: Я вижу Вашу точку в желании сделать вещи самостоятельно, но можно пачкать руки даже с genkernel. Используйте genkernel - menuconfig все, и можно в основном установить все, как будто Вы создали бы свое ядро полностью без поддержки инструмента, genkernel просто добавляет делание bzImage, сделайте модули и сделайте modules_install строки для Вас, и делает тот противный материал initrd.

Можно, очевидно, создать initrd сами, как он обрисован в общих чертах здесь для initramfs или здесь для initrd.

6
27.01.2020, 19:55
  • 1
    Хорошо спасибо за подтверждение, но Вы пропускаете часть "В противном случае, как я могу сделать initrd сам?" –  phunehehe 28.09.2010, 06:52
  • 2
    Добавленный некоторая информация и объединенный мой другой ответ в этого. –  tante 28.09.2010, 10:00
  • 3
    незначительное исправление: initrd не используется для загрузки ядра: ядро загружается загрузчиком (GRUB, LILO, безотносительно); initrd является своего рода электронным диском, который обеспечивает начальную корневую файловую систему. Это должно содержать все двоичные файлы (например, модули ядра, программы поддержки пространства пользователя) должен был на самом деле сделать систему операционной. Поэтому это необходимо для корня LVM: подсистема LVM должна быть инициализирована, и ее инициализация слишком сложна, чтобы быть удобно сделанной с одними только параметрами начальной загрузки ядра; таким образом, linuxrc сценарий в initrd выполняет эту задачу. –  Riccardo Murri 28.09.2010, 10:29
  • 4
    Вы, конечно, правы, я был несколько неаккуратен со своей формулировкой. –  tante 28.09.2010, 10:38
  • 5
    Не Может upvote из-за довольно большой ошибки в ответе (initrd, не позволяет ядру быть загруженным). –  wzzrd 28.09.2010, 11:55

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

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

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

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

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

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

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

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

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

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

5
27.01.2020, 19:55
  • 1
    +1 для упоминания встроенного по сравнению с модулем в компиляции ядра. –  amphetamachine 04.02.2011, 20:47
  • 2
    lsmod от рабочего ядра также полезно. –  LawrenceC 18.02.2011, 16:58

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

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

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

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

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

2
27.01.2020, 19:55

В то время как не возможно не использовать своего рода 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}
2
27.01.2020, 19:55

Да, это.

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

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

Приятного отдыха!

1
27.01.2020, 19:55
  • 1
    эй, который на самом деле выглядит большим, я должен испытать! –  phunehehe 02.10.2010, 13:16

Теги

Похожие вопросы