Apakah mungkin untuk meletakkan root di LVM tanpa menggunakan initrd?

12

Saya baru saja membuat sistem basis Gentoo (yang berarti saya bisa boot dan login dan melakukan hal-hal dengan itu sekarang). Partisi root saya ada dalam grup virtual LVM2 (dengan /bootpartisi terpisah ). Untuk mem-boot saya perlu memberikan parameter di bawah ini ke kernel:

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

Rupanya itu menggunakan ramdisk awal untuk melakukan sesuatu (saya kira memuat hal-hal LVM) sebelum me-mount root. Apakah ada cara agar saya dapat memasukkan kode ini ke dalam kernel itu sendiri sehingga tidak diperlukan initrd? Jika tidak, bagaimana saya bisa membuat initrd sendiri?

Mungkin bermanfaat untuk menambahkan bahwa saya telah mencoba mengkompilasi kernel untuk root non-LVM, tanpa initrd dan bekerja dengan sempurna. Kemudian saya mencoba untuk meletakkan semuanya di bawah LVM dan tidak bisa mendapatkan mesin untuk boot (saya kira itu tidak dapat menangani hal-hal LVM). Kemudian saya menggunakan genkernelalat dengan --lvmopsi dan itu menciptakan kernel dan initrd yang sedang saya gunakan.

Sekarang saya ingin melewatkan genkerneldan melakukan semuanya sendiri, lebih disukai tanpa initrd sehingga mesin akan boot agak lebih cepat (saya tidak memerlukan fleksibilitas pula).

phhehehe
sumber
Initrd mungkin memiliki efek kecil pada waktu boot, tetapi itu tidak akan mempengaruhi kinerja sistem Anda setelah itu berjalan dan berjalan.
Kristof Provost
oh ya, sebenarnya saya maksudkan waktu booting, diedit
phunehehe

Jawaban:

6

Jawaban sederhana: Tidak. Jika Anda menginginkan LVM, Anda memerlukan initrd.

Tetapi seperti yang orang lain katakan sebelumnya: LVM tidak memperlambat sistem Anda atau melakukan hal buruk dengan cara lain, mereka hanya memungkinkan Anda untuk menciptakan lingkungan yang memungkinkan kernel Anda memuat dan melakukan tugasnya.

Initrd memungkinkan kernel Anda untuk dimuat: Jika kernel Anda berada di drive LVM seluruh lingkungan LVM harus dibuat sebelum biner yang berisi kernel dapat dimuat.

Lihatlah Entri Wikipedia pada initrd yang menjelaskan apa yang dilakukan initrd dan mengapa Anda membutuhkannya.

Catatan lain: Saya mengerti maksud Anda ingin melakukan sesuatu sendiri, tetapi Anda bisa membuat tangan Anda kotor bahkan dengan genkernel. Gunakan genkernel --menuconfig all dan pada dasarnya Anda dapat mengatur semuanya seolah-olah Anda akan membangun kernel sepenuhnya tanpa dukungan alat, genkernel hanya menambahkan make bzImage, membuat modul dan membuat jalur modules_install untuk Anda dan melakukan hal-hal initrd yang buruk.

Anda jelas dapat membangun initrd sendiri seperti yang diuraikan di sini untuk initramfs atau di sini untuk initrd .

tante
sumber
Terima kasih atas konfirmasi, tetapi Anda melewatkan bagian "Jika tidak, bagaimana saya bisa membuat initrd sendiri?"
phunehehe
Menambahkan beberapa info dan menggabungkan jawaban saya yang lain ke dalam yang ini.
tante
8
Koreksi minor: initrd tidak digunakan untuk memuat kernel : kernel dimuat oleh bootloader (GRUB, LILO, apa pun); initrd adalah sejenis ram-disk yang menyediakan filesystem root awal. Itu harus berisi semua binari (misalnya, modul kernel, program dukungan userspace) yang diperlukan untuk benar-benar membuat sistem operasional. Inilah sebabnya mengapa diperlukan untuk root LVM: subsistem LVM perlu diinisialisasi dan inisialisasi terlalu kompleks untuk dilakukan dengan mudah dengan parameter boot kernel saja; dengan demikian, linuxrcskrip initrd melakukan tugas ini.
Riccardo Murri
Anda tentu saja benar, saya agak ceroboh dengan ungkapan saya.
tante
2
Tidak dapat mengunggah karena kesalahan jawaban yang cukup besar (initrd tidak mengizinkan kernel dimuat).
wzzrd
5

sunting: baru sadar Anda mencoba untuk boot pada LVM, saya tidak pernah mengatur LVM, tidak pernah membutuhkannya, jadi mungkin pendekatan di sini mungkin tidak berfungsi

Berikut adalah aturan dasar yang perlu Anda lakukan untuk membuat kernel initrd-less (dari memori, saya tidak ingat persis):

  1. Kompilasi ulang kernel Anda, pastikan untuk memasukkan kernel (PENTING: bukan sebagai modul!):

    1. driver motherboard dan driver harddrive (keduanya di bawah Device Drivers)
    2. driver filesystem untuk /, /etc/*dan /lib/modules/*(di bawah File systems)

    Pada dasarnya, kernel harus dapat me-mount sistem file root, membaca / etc / fstab, memuat modul driver lain (jika perlu), dan me-mount sistem file non-root lainnya untuk menyelesaikan sisa proses booting. Jika Anda memiliki proses booting yang lebih terlibat, misal boot jaringan maka Anda perlu menginstal driver tersebut juga.

  2. Nonaktifkan initrd dari kernel "Pengaturan umum> Sistem file RAM awal dan dukungan disk RAM (initramfs / initrd)" alias CONFIG_BLK_DEV_INITRD = n.

  3. Ubah konfigurasi GRUB, Anda tidak lagi membutuhkan init = dan realroot =, dan setup root = sehingga ia menunjuk ke perangkat sistem file root.

Saya pikir itu saja. Jangan lupa untuk menyimpan kernel cadangan, dan salinan Live CD yang dapat di-boot, jika terjadi sesuatu.

Hal-hal yang bisa salah: jika Anda dikompilasi di driver yang salah atau jika Anda mengkompilasi driver dasar sebagai modul, maka kernel tidak dapat membaca sistem file. Reboot dengan kernel baru, atau dengan Live CD dan kompilasi ulang kernel dengan driver yang benar.

Satu-satunya bagian yang sulit adalah mencari tahu driver mana yang relevan dengan perangkat keras Anda. Anda dapat menggunakan lspcidan lshwmembantu mengidentifikasi perangkat keras Anda. Jika Anda belum memiliki alat ini, maka emerge lshw pciutils.

Lie Ryan
sumber
+1 untuk menyebutkan modul bawaan vs modul dalam kompilasi kernel.
amphetamachine
lsmoddari kernel yang berjalan juga berguna.
LawrenceC
2

Ya, Anda membutuhkan initrd. Inilah alasannya:

Proses boot normal dimulai dengan bootloader, yang cukup tahu tentang sistem Anda untuk menemukan kernel dan menjalankannya. (GRUB2 cukup pintar untuk menemukan kernel yang terletak pada partisi LVM2 atau RAID, tetapi GRUB1 tidak, jadi biasanya Anda disarankan untuk membuat / boot sebagai partisi terpisah dengan tata letak yang disederhanakan.) Setelah dimuat, kernel perlu untuk dapat menemukan sistem file root, sehingga dapat memulai proses boot. Namun, LVM tidak dapat memulai tanpa dipicu oleh beberapa alat userspace, yang ada di sistem file root, yang tidak dapat dimuat tanpa alat LVM, yang ada di sistem file root ...;)

Untuk memutus siklus ini, initrd atau initramfs adalah sistem file terkompresi yang disimpan dengan kernel (baik di / boot, atau di dalam kernel itu sendiri), yang berisi cukup banyak sistem Linux untuk memulai layanan seperti LVM atau MD atau apa pun kamu ingin. Ini adalah sistem file sementara, dan hanya bertindak sebagai sistem file root Anda cukup lama untuk root yang sebenarnya untuk dimuat.

Sejauh benar-benar membuatnya, sebagian besar dokumentasi tentang topik ini sudah usang - lvm2create_initrd, misalnya, bahkan tidak berfungsi lagi di Gentoo. (Saya membuat hal yang sama beberapa bulan yang lalu, dan saya harus menulis ulang skrip sebelum mendapatkan initrd yang berfungsi.) Membuat initramfs Anda sendiri bisa menyenangkan, dan itu satu-satunya cara untuk mendapatkan boot yang benar-benar minimal. proses (dan pelajari seluk-beluk tentang bagaimana Linux melakukan booting dalam proses), tetapi ini banyak pekerjaan.

Jawaban singkatnya: gunakan Dracut. Ini adalah kerangka kerja baru yang dibuat untuk menghasilkan initramfs dengan cara yang sebagian besar otomatis, dan ini dalam portage. Dokumentasinya agak jarang, tetapi ada cukup di luar sana untuk mencari tahu, dan sejauh ini cara termudah untuk mendapatkan initramf yang solid, dan root LVM.

p-statis
sumber
2

Meskipun tidak mungkin untuk tidak menggunakan semacam initrd, adalah mungkin untuk tidak menggunakan file initrd yang terpisah. (Saya tidak pernah menggunakan genkernel jadi saya tidak bisa memberikan instruksi untuk itu).

Misalnya saya telah mengatur opsi:

CONFIG_INITRAMFS_SOURCE="/usr/src/initrd.contents"

Di mana /usr/src/initrd.contentsdalam kasus saya terlihat seperti (saya punya 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

Dan /usr/src/initadalah:

#!/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}
Maciej Piechotka
sumber
1

Ya itu.

Komplikasi yang timbul dari membuat dan menangani initrds diterjemahkan menjadi moot jika Anda menginstal dan menggunakan grub2. Wiki grub2 http://grub.enbug.org/LVMandRAID menjelaskan bagaimana Anda dapat memiliki / boot di lvm dengan tidak lebih dari lmm ​​insmod di grub.cfg, file konfigurasi grub, karenanya tidak perlu initrd.

grub2 sekarang di versi 1.98 tetapi masih di cabang percobaan di gentoo. Namun itu dapat dipasang di slot lain dan dapat digunakan dengan sempurna.

Nikmati!

chiguire
sumber
hei itu benar-benar terlihat hebat, saya harus mencoba!
phunehehe