İnitrd kullanmadan LVM'ye kök koymak mümkün müdür?


12

Sadece bir Gentoo temel sistemi kurdum (yani önyükleme yapabilir, giriş yapabilir ve onunla şimdi bir şeyler yapabilirim). Kök bölümüm bir LVM2 sanal grubunda (ayrı bir /bootbölümle). Önyükleme için aşağıdaki parametreleri çekirdeğe geçirmem gerekiyor:

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

Görünüşe göre kök monte etmeden önce bir şey yapmak için bir ilk ramdisk kullanıyor (Sanırım LVM şeyler yükleme). Hiçbir initrd gerekli böylece bu kodu çekirdeğin içine koymak bir yolu var mı? Değilse, initrd'i kendim nasıl yapabilirim?

İnitrd olmadan LVM olmayan kök için çekirdeği derlemeyi denediğimi eklemek yararlı olabilir ve mükemmel çalıştı. Sonra her şeyi LVM altına koymaya çalıştım ve makineyi önyükleme yapamadım (sanırım LVM şeyleriyle başa çıkamıyor). Sonra genkernelaracı --lvmseçeneği ile kullandım ve şu anda kullanmakta olduğum çalışma çekirdeği ve initrd oluşturur.

Şimdi atlamak genkernelve her şeyi kendi başıma yapmak istiyorum , tercihen initrd olmadan, makine biraz daha hızlı açılır (zaten esnekliğe ihtiyacım yok).


Bir initrd, önyükleme süreleri üzerinde küçük bir etkiye sahip olabilir, ancak sistem çalışır duruma geldikten sonra sisteminizin performansını etkilemez.
Kristof Provost

oh evet, aslında önyükleme zamanı demek istedim, düzenlenmiş
phunehehe

Yanıtlar:


6

Basit cevap: Hayır. LVM istiyorsanız bir initrd'e ihtiyacınız var.

Ancak diğerlerinin daha önce söylediği gibi: LVM'ler sisteminizi yavaşlatmaz veya başka bir şekilde kötü bir şey yapmaz, sadece çekirdeğinizin yüklenmesine ve işini yapmasına izin veren bir ortam oluşturmanıza izin verir.

İnitrd, çekirdeğinizin yüklenmesine izin verir: Çekirdeğiniz bir LVM sürücü üzerindeyse, çekirdeği içeren ikili dosya yüklenmeden önce tüm LVM ortamının oluşturulması gerekir.

İnitrd'in ne yaptığını ve neden ihtiyacınız olduğunu açıklayan initrd Wikipedia Girişine göz atın .

Başka bir not: Bir şeyleri kendiniz yapmak istediğinizi görüyorum, ancak genkernel ile bile ellerinizi kirletebilirsiniz. Genkernel --menuconfig all komutunu kullanın ve temel olarak her şeyi çekirdeğinizi araç desteği olmadan tamamen oluşturacakmış gibi ayarlayabilirsiniz, genkernel sadece bzImage yapmak, modüller yapmak ve modules_install satırlarını sizin için yapar ve bu kötü initrd şeylerini yapar.

İnitram'ı burada initramf'ler için veya burada initrd için ana hatlarıyla açıklandığı gibi kendiniz oluşturabilirsiniz .


Onay için teşekkürler, ama "Değilse, initrd'i kendim nasıl yapabilirim?"
phunehehe

Biraz bilgi ekledim ve diğer cevabımı buna ekledim.
tante

8
Küçük bir düzeltme: initrd çekirdeği yüklemek için kullanılmaz : çekirdek önyükleyici tarafından yüklenir (GRUB, LILO, her neyse); initrd, ilk kök dosya sistemini sağlayan bir tür ram diskidir. Sistemi gerçekten çalışır hale getirmek için gerekli tüm ikili dosyaları (örn. Çekirdek modülleri, kullanıcı alanı destek programları) içermelidir. Bu nedenle bir LVM kökü için gereklidir: LVM alt sisteminin başlatılması gerekir ve başlatılması, yalnızca çekirdek önyükleme parametreleriyle rahatlıkla yapılamayacak kadar karmaşıktır; böylece linuxrcinitrd içindeki komut dosyası bu görevi yerine getirir.
Riccardo Murri

Tabii ki haklısın, ifadelerime biraz özensiz davrandım.
tante

2
Yanıtta oldukça büyük bir hata olduğu için oylanamıyor (initrd, çekirdeğin yüklenmesine izin vermiyor).
wzzrd

5

edit: sadece LVM üzerinde önyükleme yapmaya çalıştığınızı fark ettim, asla bir LVM kurmadım, onlara hiç ihtiyaç duymadım, bu yüzden muhtemelen buradaki yaklaşım işe yaramayabilir

Bir initrd daha az çekirdek oluşturmak için yapmanız gereken temel kurallar (bellekten, tam olarak hatırlamıyorum):

  1. Çekirdeğinizi yeniden derleyin, çekirdeğin içine yerleştirdiğinizden emin olun (ÖNEMLİ: modül olarak değil!):

    1. anakart sürücüsü ve sabit sürücü sürücüsü (her ikisi de altında Device Drivers)
    2. dosya sistemi sürücüsü için /, /etc/*ve /lib/modules/*(altında File systems)

    Temel olarak, çekirdeğin kök dosya sistemini bağlayabilmesi, / etc / fstab dosyasını okuyabilmesi, diğer sürücü modüllerini yükleyebilmesi (gerekirse) ve diğer önyükleme dışı dosya sistemlerini önyükleme işleminin geri kalanını tamamlayabilmesi gerekir. Daha fazla önyükleme süreciniz varsa, örneğin ağ önyüklemesi varsa, bu sürücülerde de yerleşik olmanız gerekir.

  2. İnitrd öğesini "Genel kurulum> Başlangıç ​​RAM dosya sistemleri ve RAM disk (initramfs / initrd) desteği" aka CONFIG_BLK_DEV_INITRD = n.

  3. GRUB yapılandırmasını değiştirin, artık init = ve realroot = ve setup root = 'e ihtiyacınız yoktur, böylece kök dosya sistemi cihazına işaret eder.

Sanırım hepsi bu kadar. Bir şey olması durumunda yedekleme çekirdeğini ve önyüklenebilir bir Canlı CD'nin iyi bir kopyasını saklamayı unutmayın.

Yanlış gidebilecek şeyler: yanlış sürücüleri derlediyseniz veya temel sürücüleri bir modül olarak derlerseniz, çekirdek dosya sistemini okuyamaz. Yeni bir çekirdekle veya Canlı CD ile yeniden başlatın ve bir çekirdeği doğru sürücülerle yeniden derleyin.

Tek zor kısım, hangi sürücünün donanımınızla ilgili olduğunu bulmaktır. Donanımınızı tanımlamanıza yardımcı olması için lspcive öğelerini kullanabilirsiniz lshw. Bu araçlara sahip değilseniz, o zaman emerge lshw pciutils.


Çekirdek derlemede yerleşik ve modülden bahsetmek için +1.
amfetamin

lsmodçalışan bir çekirdekten de yararlıdır.
LawrenceC

2

Evet, bir initrd'e ihtiyacınız var. İşte nedeni:

Normal önyükleme işlemi, çekirdeği bulmak ve çalıştırmak için sisteminiz hakkında yeterli bilgiye sahip önyükleyici ile başlar. (GRUB2, LVM2 veya RAID bölümünde bulunan bir çekirdeği bulabilecek kadar akıllıdır, ancak GRUB1 değildir, bu nedenle genellikle basitleştirilmiş bir düzene sahip ayrı bir bölüm olarak oluşturmanız / önyüklemeniz önerilir.) Çekirdek yüklendiğinde, çekirdek gerekir Kök dosya sistemini bulabilmek için önyükleme işlemini başlatabilir. Bununla birlikte, LVM, kök dosya sisteminde bulunan ve kök dosya sisteminde bulunan LVM araçları olmadan yüklenemeyen bazı kullanıcı alanı araçları tarafından tetiklenmeden başlayamaz ...;)

Bu döngüyü kırmak için, bir initrd veya initramfs, LVM veya MD gibi hizmetleri başlatmak için yeterli bir Linux sistemi içeren çekirdeğe (ya / boot'a ya da çekirdeğin içine) depolanan sıkıştırılmış bir dosya sistemidir. İstediğiniz. Bu geçici bir dosya sistemidir ve yalnızca gerçek kökün yüklenmesi için yeterince uzun bir süre boyunca kök dosya sisteminiz gibi davranır.

Aslında, konuyla ilgili çoğu belge şaşırtıcı derecede eski - örneğin, lvm2create_initrd, artık Gentoo üzerinde bile çalışmıyor. (Aynı şeyi birkaç ay önce ayarladım ve ondan çalışan bir initrd almadan önce senaryoyu yeniden yazmak zorunda kaldım.) Kendi initramf'lerinizi oluşturmak eğlenceli olabilir ve kesinlikle minimal bir önyükleme almanın tek yolu budur süreç (ve Linux'un süreçte nasıl önyüklendiğine dair bilgi ve çıkışları öğrenin), ancak çok fazla iş var.

Kısa cevap: Dracut kullanın. Bu, çoğunlukla otomatik bir şekilde bir initramfs oluşturmak için oluşturulan yeni bir çerçevedir ve portage'dadır. Dokümantasyon biraz seyrek, ancak işleri anlamaya yetecek kadar var ve sağlam bir initramfs ve bir LVM kökü elde etmenin en kolay yolu.


2

Bir çeşit initrd kullanmak mümkün olmasa da, ayrı initrd dosyaları kullanmak mümkün değildir. (Ben hiç genkernel kullanmadım, bu yüzden bunun için talimat veremem).

Örneğin seçeneği ayarladım:

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

/usr/src/initrd.contentsBenim durumumda nereye benziyor (LVM + smokin + fbsplash var):

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

Ve /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

Evet öyle.

İnitrds oluşturma ve işlemeden kaynaklanan komplikasyonlar grub2'yi kurar ve kullanırsanız tartışılır. Grub2 wiki http://grub.enbug.org/LVMandRAID , grub yapılandırma dosyası grub.cfg'de insmod lvm'den başka bir şey olmadan lvm'de / boot'ınızı nasıl yapabileceğinizi açıklar, dolayısıyla bir initrd'ye gerek yoktur.

grub2 şimdi 1.98 sürümünde ama yine de gentoo deneysel dalında. Ancak başka bir yuvaya takılabilir ve mükemmel bir şekilde kullanılabilir.

Zevk almak!


hey gerçekten harika görünüyor, denemek zorundayım!
phunehehe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.