是否可以在不使用initrd的情况下将root放在LVM中?


12

我刚刚建立了一个Gentoo基本系统(这意味着我现在可以启动和登录并使用它进行操作)。我的根分区位于LVM2虚拟组中(具有单独的/boot分区)。为了启动,我需要将以下参数传递给内核:

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

显然,它是在挂载root之前使用初始ramdisk做一些事情(我猜是加载LVM事情)。有没有一种方法可以将该代码放入内核本身,从而不需要initrd?如果没有,我该如何使自己成为initrd?

补充一下,我曾尝试在没有initrd的情况下为非LVM根目录编译内核,并且运行良好。然后,我试图将整个东西放在LVM下,并且无法启动计算机(我想它无法处理LVM的东西)。然后,我将该genkernel工具与该--lvm选项一起使用,它会创建当前正在使用的工作内核和initrd。

现在,我想跳过genkernel并自己完成所有操作,最好不要使用initrd,这样计算机可以更快地启动(无论如何我都不需要灵活性)。


initrd可能对启动时间影响很小,但是一旦系统启动并运行,它就不会影响系统的性能。
克里斯托弗·普罗沃斯特

哦,是的,我的意思是引导时间,编辑过
phunehehe

Answers:


6

简单的答案:否。如果要LVM,则需要一个initrd。

但是正如其他人以前所说的那样:LVM不会降低系统速度或以其他方式做任何坏事,它们只是允许您创建一个允许内核加载并完成其工作的环境。

initrd允许您加载内核:如果您的内核位于LVM驱动器上,则必须先建立整个LVM环境,然后才能加载包含内核的二进制文件。

请查看initrd上Wikipedia条目,其中解释了initrd的功能以及为什么需要它。

另一个注意事项:我看到您想要自己做事的要点,但是即使使用Genkernel,您也可以弄脏您的手。使用genkernel --menuconfig all,您基本上可以设置所有内容,就好像您完全在没有工具支持的情况下构建内核一样,genkernel只是为您添加make bzImage,make模块和make modules_install行,并执行讨厌的initrd东西。

很明显,您可以自己构建initrd,如此处为initramfs此处为initrd所概述。


好,谢谢您的确认,但是您错过了“如果没有,我如何自己制作initrd”这一部分?
phunehehe

添加了一些信息,并将我的其他答案合并到此答案中。
tante 2010年

8
较小的更正:initrd不用于加载内核:内核由引导加载程序(GRUB,LILO等)加载;initrd是提供初始根文件系统的ram磁盘。它应包含实际使系统运行所需的所有二进制文件(例如,内核模块,用户空间支持程序)。这就是为什么LVM根需要它的原因:LVM子系统需要初始化,并且其初始化太复杂而无法仅通过内核引导参数方便地完成;因此,linuxrcinitrd中的脚本将执行此任务。
Riccardo Murri 2010年

您当然是对的,我的措词有些草率。
tante

2
由于答案中的重大错误而无法投票(initrd不允许加载内核)。
wzzrd

5

编辑:刚刚意识到您正在尝试在LVM上启动,我从未设置过LVM,从不需要它们,所以这里的方法可能不起作用

这是创建无initrd内核所需的基本规则(从内存中,我记不清了):

  1. 重新编译您的内核,确保已内置到内核中(重要信息:不作为模块!):

    1. 主板驱动程序和硬盘驱动器驱动程序(均在下Device Drivers
    2. 文件系统驱动程序//etc/*/lib/modules/*(下File systems

    基本上,内核需要能够挂载根文件系统,读取/ etc / fstab,加载其他驱动程序模块(如果需要)以及挂载其他非根文件系统,以完成其余的引导过程。如果您有一个更复杂的启动过程,例如网络启动,那么您还需要内置这些驱动程序。

  2. 从内核“常规设置>初始RAM文件系统和RAM磁盘(initramfs / initrd)支持”中禁用initrd,也称为CON​​FIG_BLK_DEV_INITRD = n。

  3. 修改GRUB配置,您不再需要init =和realroot =,并设置root =即可指向根文件系统设备。

我认为就这些。不要忘记保留备份内核以及可启动Live CD的良好副本,以防万一。

可能出错的事情:如果在错误的驱动程序中编译,或者在将基本驱动程序编译为模块时,内核将无法读取文件系统。使用新内核或Live CD重新引导,并使用正确的驱动程序重新编译内核。

唯一困难的部分是弄清楚哪个驱动程序与您的硬件有关。您可以使用lspcilshw帮助您识别硬件。如果您还没有这些工具,请点击emerge lshw pciutils


+1表示内核编译中的内置vs.模块。
amphetamachine

lsmod从正在运行的内核中也很有用。
LawrenceC

2

是的,您需要一个initrd。原因如下:

正常的引导过程从引导加载程序开始,引导加载程序对您的系统足够了解,可以找到并运行内核。(GRUB2足够聪明,可以找到位于LVM2或RAID分区上的内核,但是GRUB1则不是,因此通常建议您将/ boot创建为具有简化布局的单独分区。)一旦加载,内核就需要为了能够找到根文件系统,因此它可以启动引导过程。但是,LVM无法启动,而不会被存在于根文件系统上的某些用户空间工具触发,如果没有存在于根文件系统上的LVM工具,则无法加载它们。

为了打破这个循环,initrd或initramfs是与内核一起存储的压缩文件系统(在/ boot中,或在内核本身内部),其中仅包含足以启动LVM或MD之类的服务的Linux系统。你要。这是一个临时文件系统,仅充当根文件系统,其时间足以加载实际的根。

就实际编写一个文件而言,有关该主题的大多数文档都已过时-例如,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

是的。

如果安装和使用grub2,则由于创建和处理initrds而引起的复杂性将变得毫无意义。grub2 Wiki http://grub.enbug.org/LVMandRAID描述了如何在lvm上使用/ boot,而在grub配置文件grub.cfg中仅使用insmod lvm,因此不需要initrd。

grub2现在的版本为1.98,但仍在gentoo的实验分支中。但是,它可以安装在另一个插槽中,并且可以完美使用。

请享用!


嘿,实际上看起来很棒,我必须尝试一下!
phunehehe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.