เป็นไปได้หรือไม่ที่จะใส่รูทใน LVM โดยไม่ใช้ initrd?


12

ฉันเพิ่งตั้งค่าระบบพื้นฐาน Gentoo (ซึ่งหมายความว่าฉันสามารถบูตและเข้าสู่ระบบและทำสิ่งต่าง ๆ ได้ทันที) root พาร์ติชันของฉันอยู่ในกลุ่มเสมือน LVM2 (มี/bootพาร์ติชันแยกต่างหาก) ในการบูตฉันต้องส่งพารามิเตอร์ด้านล่างไปยังเคอร์เนล:

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

เห็นได้ชัดว่ามันใช้ ramdisk เริ่มต้นเพื่อทำบางสิ่ง (ฉันเดาว่าจะโหลดสิ่งของ LVM) ก่อนที่จะติดตั้งรูท มีวิธีที่ฉันสามารถใส่รหัสนี้ลงในเคอร์เนลของตัวเองเพื่อให้ไม่จำเป็นต้องเริ่มต้นหรือไม่? ถ้าไม่ฉันจะสร้างตัวประทับเองได้อย่างไร

มันอาจจะมีประโยชน์ที่จะเพิ่มว่าฉันได้พยายามรวบรวมเคอร์เนลสำหรับรากที่ไม่ใช่ LVM โดยไม่ต้องเริ่มต้นและมันทำงานได้อย่างสมบูรณ์ จากนั้นฉันพยายามใส่ทุกอย่างภายใต้ LVM และไม่สามารถทำให้เครื่องบูตได้ (ฉันเดาว่ามันไม่สามารถจัดการกับสิ่งที่ LVM ได้) จากนั้นฉันใช้genkernelเครื่องมือพร้อม--lvmตัวเลือกและสร้างเคอร์เนลที่ใช้งานได้และเริ่มต้นที่ฉันใช้อยู่ในปัจจุบัน

ตอนนี้ฉันต้องการข้ามgenkernelและทำทุกอย่างด้วยตัวเองโดยไม่ต้องเริ่มต้นเพื่อให้เครื่องบูตได้ค่อนข้างเร็ว (ฉันไม่ต้องการความยืดหยุ่นอยู่ดี)


ตัวเริ่มอาจมีผลเพียงเล็กน้อยต่อเวลาบูต แต่มันจะไม่ส่งผลกระทบต่อประสิทธิภาพของระบบของคุณเมื่อมันเริ่มทำงาน
Kristof Provost

โอ้ใช่ฉันหมายถึงเวลาบูตจริง ๆ แก้ไขแล้ว
phunehehe

คำตอบ:


6

คำตอบง่ายๆ: ไม่ถ้าคุณต้องการ LVM คุณต้องมี initrd

แต่อย่างที่คนอื่น ๆ เคยพูดไว้ก่อนหน้านี้: LVM ไม่ทำให้ระบบของคุณช้าลงหรือทำสิ่งที่ไม่ดีในทางอื่นพวกเขาเพียงแค่อนุญาตให้คุณสร้างสภาพแวดล้อมที่ทำให้เคอร์เนลของคุณโหลดและทำงานได้

initrd อนุญาตให้เคอร์เนลของคุณโหลดได้: หากเคอร์เนลของคุณอยู่บนไดรฟ์ LVM คุณจะต้องสร้างสภาพแวดล้อม LVM ทั้งหมดก่อนที่จะโหลดไบนารีที่มีเคอร์เนล

ลองดูที่Wikipedia Entry บน initrdซึ่งจะอธิบายว่า initrd ทำอะไรได้บ้างและทำไมคุณถึงต้องการมัน

หมายเหตุอื่น: ฉันเห็นประเด็นของคุณที่ต้องการทำสิ่งต่าง ๆ ด้วยตัวเอง แต่คุณสามารถทำให้มือของคุณสกปรกแม้กับเคอร์เนล ใช้ genkernel --menuconfig all และโดยทั่วไปคุณสามารถตั้งค่าทุกอย่างราวกับว่าคุณจะสร้างเคอร์เนลของคุณอย่างสมบูรณ์โดยไม่มีการสนับสนุนเครื่องมือ genkernel เพียงเพิ่ม make bzImage สร้างโมดูลและสร้างบรรทัด modules_install สำหรับคุณและทำสิ่งที่น่ารังเกียจ

คุณเห็นได้ชัดสามารถสร้าง initrd ตัวเองมันเป็นที่ที่ระบุไว้ที่นี่สำหรับ initramfsหรือที่นี่สำหรับ initrd


ขอบคุณมากสำหรับการยืนยัน แต่คุณพลาดส่วน "ถ้าไม่ฉันจะสร้างตัวเองได้อย่างไร"
phunehehe

เพิ่มข้อมูลบางส่วนและรวมคำตอบอื่น ๆ ของฉันเข้ากับข้อมูลนี้
tante

8
การแก้ไขเล็กน้อย: initrd ไม่ได้ใช้เพื่อโหลดเคอร์เนล : เคอร์เนลถูกโหลดโดย bootloader (GRUB, LILO, อะไรก็ตาม); initrd เป็น ram-disk ชนิดหนึ่งที่มีระบบไฟล์รูทเริ่มต้น มันควรมีไบนารีทั้งหมด (เช่นโมดูลเคอร์เนล, โปรแกรมสนับสนุนพื้นที่ผู้ใช้) ที่จำเป็นในการทำให้ระบบทำงานได้จริง นี่คือสาเหตุที่จำเป็นสำหรับรูต LVM: ระบบย่อย LVM ต้องถูกกำหนดค่าเริ่มต้นและการกำหนดค่าเริ่มต้นนั้นซับซ้อนเกินกว่าที่จะทำได้โดยสะดวกด้วยพารามิเตอร์การบูตเคอร์เนลเพียงอย่างเดียว ดังนั้นlinuxrcสคริปต์ใน initrd จึงทำงานนี้
Riccardo Murri

แน่นอนว่าคุณพูดถูกฉันค่อนข้างเลอะเทอะกับถ้อยคำของฉัน
tante

2
ไม่สามารถลงคะแนนเพราะข้อผิดพลาดใหญ่ ๆ ในการตอบ (initrd ไม่อนุญาตให้โหลดเคอร์เนล)
wzzrd

5

แก้ไข: เพิ่งรู้ว่าคุณพยายามบูตด้วย LVM ฉันไม่เคยติดตั้ง LVM ไม่จำเป็นต้องใช้เลยดังนั้นวิธีที่นี่อาจใช้ไม่ได้

นี่เป็นกฎพื้นฐานที่คุณต้องทำเพื่อสร้างเคอร์เนล initrd-less (จากหน่วยความจำฉันจำไม่ได้)

  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 = และ setup root = ดังนั้นจึงชี้ไปที่อุปกรณ์ระบบไฟล์รูท

ฉันคิดว่านั่นคือทั้งหมดที่ อย่าลืมเก็บเคอร์เนลสำรองไว้และสำเนาที่ดีของซีดี Live ที่สามารถบู๊ตได้ในกรณีที่มีบางอย่างเกิดขึ้น

สิ่งที่อาจผิดพลาด: หากคุณรวบรวมในไดรเวอร์ที่ไม่ถูกต้องหรือถ้าคุณรวบรวมไดรเวอร์พื้นฐานเป็นโมดูลแล้วเคอร์เนลไม่สามารถอ่านระบบไฟล์ได้ รีบูตด้วยเคอร์เนลใหม่หรือด้วย Live CD และคอมไพล์เคอร์เนลอีกครั้งพร้อมไดรเวอร์ที่ถูกต้อง

ส่วนที่ยากคือการหาว่าไดรเวอร์ใดที่เกี่ยวข้องกับฮาร์ดแวร์ของคุณ คุณสามารถใช้lspciและlshwเพื่อช่วยระบุฮาร์ดแวร์ของคุณ emerge lshw pciutilsหากคุณไม่ได้มีเครื่องมือเหล่านี้อยู่แล้ว


+1 สำหรับการพูดถึงโมดูลในตัวกับการคอมไพล์เคอร์เนล
แอมเฟตามาจิน

lsmodจากเคอร์เนลที่กำลังทำงานอยู่ก็มีประโยชน์เช่นกัน
LawrenceC

2

ใช่คุณต้องมี initrd นี่คือเหตุผล:

กระบวนการบูตปกติเริ่มต้นด้วย bootloader ซึ่งรู้เพียงพอเกี่ยวกับระบบของคุณเพื่อค้นหาเคอร์เนลและเรียกใช้ (GRUB2 ฉลาดพอที่จะค้นหาเคอร์เนลที่อยู่ในพาร์ติชั่น LVM2 หรือ RAID แต่ GRUB1 ไม่ได้ดังนั้นจึงแนะนำให้คุณสร้าง / บู๊ตเป็นพาร์ติชั่นแยกต่างหากที่มีเค้าโครงที่เรียบง่าย) เมื่อโหลดแล้วเคอร์เนลต้องการ เพื่อให้สามารถค้นหาระบบไฟล์รูทได้ดังนั้นจึงสามารถเริ่มกระบวนการบูตได้ อย่างไรก็ตาม LVM ไม่สามารถเริ่มได้หากไม่ได้รับการกระตุ้นจากเครื่องมือ userspace บางตัวที่มีอยู่ในระบบไฟล์รูทซึ่งไม่สามารถโหลดได้หากไม่มีเครื่องมือ LVM ซึ่งมีอยู่ในระบบไฟล์รูท ... ;)

เพื่อทำลายวงจรนี้ initrd หรือ initramfs เป็นระบบไฟล์บีบอัดที่เก็บไว้กับเคอร์เนล (ทั้งใน / boot หรือภายใน kernel เอง) ซึ่งมีระบบ Linux เพียงพอที่จะเริ่มให้บริการเช่น LVM หรือ MD หรืออย่างอื่น คุณต้องการ. เป็นระบบไฟล์ชั่วคราวและทำหน้าที่เป็นระบบไฟล์รูทของคุณนานพอที่จะโหลดรูทจริง

เท่าที่เป็นจริงการจัดทำเอกสารส่วนใหญ่ในหัวข้อนั้นล้าสมัยอย่างเช่น lvm2create_initrd ซึ่งไม่ได้ทำงานกับ Gentoo อีกต่อไป (ฉันตั้งค่าสิ่งเดียวกันไม่กี่เดือนที่ผ่านมาและฉันต้องทำทั้งหมด แต่เขียนสคริปต์ใหม่ก่อนที่ฉันจะได้รับ initrd จากการทำงาน) การสร้าง initramfs ของคุณเองอาจเป็นเรื่องสนุกและเป็นวิธีเดียวที่จะได้บูตอย่างน้อยที่สุด ประมวลผล (และเรียนรู้เกี่ยวกับการบูทลีนุกซ์ในกระบวนการ), แต่มันทำงานได้มากมาย

คำตอบสั้น ๆ : ใช้ 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 จะแสดงผล moot หากคุณติดตั้งและใช้ grub2 วิกิ grub2 http://grub.enbug.org/LVMandRAIDอธิบายวิธีที่คุณสามารถมี / boot on lvm โดยไม่มีอะไรมากไปกว่า insmod lvm ใน grub.cfg ซึ่งเป็นไฟล์คอนฟิกูเรชันของ grub ดังนั้นจึงไม่จำเป็นต้องมี initrd

ตอนนี้ grub2 รุ่น 1.98 แต่ยังอยู่ในสาขาทดลองใน gentoo อย่างไรก็ตามมันสามารถติดตั้งในสล็อตอื่นและใช้งานได้อย่างสมบูรณ์แบบ

สนุก!


เฮ้ที่ดูดีจริง ๆ ฉันต้องลอง!
phunehehe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.