यह initrd का उपयोग किए बिना LVM में रूट डालना संभव है?


12

मैंने अभी एक जेंटू बेस सिस्टम स्थापित किया है (जिसका अर्थ है कि मैं बूट कर सकता हूं और इसमें अभी लॉग इन कर सकता हूं)। मेरा रूट विभाजन एक LVM2 वर्चुअल ग्रुप (एक अलग /bootविभाजन के साथ) में है। बूट करने के लिए मुझे कर्नेल के नीचे के मापदंडों को पास करना होगा:

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

जाहिर तौर पर यह रूट करने से पहले कुछ करने के लिए एक प्रारंभिक रैमडिस्क का उपयोग कर रहा है (मुझे लगता है कि LVM चीजों को लोड करना है)। क्या कोई ऐसा तरीका है जिससे मैं इस कोड को कर्नेल में डाल सकता हूं ताकि किसी भी प्रकार की कोई आवश्यकता न हो? यदि नहीं, तो मैं अपने आप को initrd कैसे बना सकता हूँ?

यह जोड़ना उपयोगी हो सकता है कि मैंने कर्नेल को गैर-एलवीएम रूट के लिए संकलन करने की कोशिश की थी, बिना किसी बदलाव के और यह पूरी तरह से काम करता है। फिर मैंने LVM के तहत पूरी चीज़ डालने की कोशिश की और मशीन को बूट करने के लिए नहीं मिला (मुझे लगता है कि यह LVM सामान के साथ सौदा नहीं कर सकता)। तब मैंने विकल्प के genkernelसाथ उपकरण का उपयोग किया --lvmऔर यह काम कर रहा कर्नेल और initrd बनाता है जो मैं वर्तमान में उपयोग कर रहा हूं।

अब मैं genkernelअपने दम पर सबकुछ छोड़ना और करना चाहता हूं, अधिमानतः बिना initrd के ताकि मशीन कुछ तेजी से बूट हो जाए (मुझे वैसे भी लचीलेपन की आवश्यकता नहीं है)।


एक initrd बूट समय पर एक छोटा सा प्रभाव हो सकता है, लेकिन यह आपके सिस्टम के प्रदर्शन को प्रभावित नहीं करेगा क्योंकि यह ऊपर और ऊपर चल रहा है।
क्रिस्टोफ प्रोवोस्ट

ओह हां, मेरा वास्तव में बूट समय था, संपादित
phunehehe

जवाबों:


6

सरल उत्तर: नहीं। यदि आप LVM चाहते हैं तो आपको एक initrd चाहिए।

लेकिन जैसा कि दूसरों ने पहले कहा है: LVM आपके सिस्टम को धीमा नहीं करता है या किसी अन्य तरीके से कुछ भी बुरा नहीं करता है, वे आपको केवल एक वातावरण बनाने की अनुमति देते हैं जो आपके कर्नेल को लोड करने और अपना काम करने की अनुमति देता है।

Initrd आपके कर्नेल को लोड करने की अनुमति देता है: यदि आपका कर्नेल LVM ड्राइव पर है तो पूरे LVM वातावरण को बाइनरी से पहले स्थापित करना होगा जिसमें कर्नेल लोड हो सकता है।

की जाँच करें initrd पर विकिपीडिया प्रविष्टि जो बताता है कि initrd करता है और यही कारण है कि आप इसकी आवश्यकता है।

एक और नोट: मैं आपकी बातों को खुद करने की चाह में देखता हूं, लेकिन आप अपने हाथों को जिन्नबर्न से भी गंदा कर सकते हैं। सभी का उपयोग करें और आप मूल रूप से सब कुछ सेट कर सकते हैं जैसे कि आप उपकरण के समर्थन के बिना पूरी तरह से अपनी कर्नेल का निर्माण करेंगे, जीनकबर्न सिर्फ मेक bzImage जोड़ता है, मॉड्यूल बनाता है और आपके लिए मॉड्यूल_स्थापना लाइनें बनाता है और उस स्वादिष्ट initrd सामान को बनाता है।

आप स्पष्ट रूप से initrd का निर्माण कर सकते हैं क्योंकि यह initramfs के लिए या यहाँ initrd के लिए उल्लिखित है


अच्छी तरह से पुष्टि के लिए धन्यवाद, लेकिन आप भाग को याद करते हैं "यदि नहीं, तो मैं खुद को कैसे बना सकता हूं?"
फुनेहे से

कुछ जानकारी जोड़ी और मेरे दूसरे उत्तर को इस में मिला दिया।
कैंट

8
एक मामूली सुधार: initrd का उपयोग कर्नेल को लोड करने के लिए नहीं किया जाता है : कर्नेल को बूटलोडर (GRUB, LILO, जो भी हो) द्वारा लोड किया जाता है; initrd एक तरह की ram-disk है जो शुरुआती रूट फाइलसिस्टम प्रदान करती है। इसमें सभी बायनेरिज़ (जैसे, कर्नेल मॉड्यूल, यूज़रस्पेस सपोर्ट प्रोग्राम) होने चाहिए जो वास्तव में सिस्टम को चालू करने के लिए आवश्यक हों। यह एक LVM रूट के लिए आवश्यक है: LVM सबसिस्टम को इनिशियलाइज़ करने की आवश्यकता है और इसका इनिशियलाइज़ेशन बहुत ही कॉर्नेल बूट पैरामीटर के साथ आसानी से किया जा सकता है; इस प्रकार, linuxrcinitrd की स्क्रिप्ट इस कार्य को करती है।
रिकार्डो मुर्री

आप निश्चित रूप से सही हैं, मैं कुछ हद तक अपने phrasing के साथ सुस्त था।
tante

2
उत्तर में बहुत बड़ी गलती के कारण उत्थान नहीं किया जा सकता (initrd कर्नेल को लोड करने की अनुमति नहीं देता है)।
wzzrd

5

संपादित करें: बस एहसास हुआ कि आप एलवीएम पर बूट करने की कोशिश कर रहे हैं, मैंने कभी एलवीएम सेटअप नहीं किया है, कभी भी उनकी आवश्यकता नहीं है, इसलिए शायद यहां का दृष्टिकोण काम नहीं कर सकता है

यहाँ एक मूल नियम है जो आपको initrd-less कर्नेल बनाने के लिए करने की आवश्यकता है (मेमोरी से, मुझे ठीक से याद नहीं था):

  1. अपने कर्नेल को पुन: संयोजित करें, कर्नेल में निर्मित करना सुनिश्चित करें (महत्वपूर्ण: मॉड्यूल के रूप में नहीं!)।

    1. मदरबोर्ड ड्राइवर और हार्डड्राइव ड्राइवर (दोनों अंडर Device Drivers)
    2. फाइल सिस्टम ड्राइवर के लिए /, /etc/*और /lib/modules/*(नीचे File systems)

    असल में, कर्नेल को रूट फाइल सिस्टम को माउंट करने में सक्षम होना चाहिए, / etc / fstab को पढ़ना, अन्य ड्राइवर मॉड्यूल लोड करना (यदि आवश्यक हो), और शेष बूटिंग प्रक्रिया को पूरा करने के लिए अन्य गैर-रूट फाइल सिस्टम को माउंट करें। यदि आपके पास एक अधिक शामिल बूटिंग प्रक्रिया है, जैसे नेटवर्क बूटिंग तो आपको उन ड्राइवरों में भी निर्माण करने की आवश्यकता है।

  2. कर्नेल से initrd अक्षम करें "सामान्य सेटअप> आरंभिक RAM फ़ाइल सिस्टम और RAM डिस्क (initramfs / initrd) समर्थन" उर्फ ​​CONFIG_BLK_DEV_INITRD = n।

  3. GRUB कॉन्फिगर करें, आपको अब init = और realroot = और setup root = की आवश्यकता नहीं है, इसलिए यह रूट फाइलसिस्टम डिवाइस की ओर इशारा करता है।

मेरी राय में बस इतना ही। यदि कुछ होता है, तो बैकअप कर्नेल, और बूट करने योग्य लाइव सीडी की एक अच्छी प्रतिलिपि रखने के लिए मत भूलना।

जो चीजें गलत हो सकती हैं: यदि आप गलत ड्राइवरों में संकलित हैं या यदि आप बुनियादी ड्राइवरों को मॉड्यूल के रूप में संकलित करते हैं, तो कर्नेल फाइल सिस्टम को नहीं पढ़ सकता है। एक ताजा कर्नेल के साथ रिबूट करें, या लाइव सीडी के साथ और सही ड्राइवरों के साथ एक कर्नेल को फिर से जोड़ें।

एकमात्र कठिन हिस्सा यह पता लगा रहा है कि कौन सा ड्राइवर आपके हार्डवेयर के लिए प्रासंगिक है। आप उपयोग कर सकते हैं lspciऔर lshwअपने हार्डवेयर की पहचान करने में मदद कर सकते हैं । यदि आपके पास ये उपकरण पहले से नहीं हैं, तो emerge lshw pciutils


कर्नेल संकलन में बिल्ट-इन बनाम मॉड्यूल का उल्लेख करने के लिए +1।
amphetamachine

lsmodएक रनिंग कर्नेल से भी उपयोगी है।
लॉरेंस

2

हां, आपको एक initrd की आवश्यकता है। यहाँ पर क्यों:

सामान्य बूट प्रक्रिया बूटलोडर से शुरू होती है, जो कर्नेल को खोजने और उसे चलाने के लिए आपके सिस्टम के बारे में पर्याप्त जानती है। (GRUB2 एक कर्नेल को खोजने के लिए पर्याप्त स्मार्ट है जो LVM2 या RAID विभाजन पर स्थित है, लेकिन GRUB1 नहीं है, इसलिए आमतौर पर यह अनुशंसा की जाती है कि आप सरलीकृत लेआउट के साथ एक अलग विभाजन के रूप में बूट / बूट करें।) एक बार लोड होने के बाद, कर्नेल की आवश्यकता होती है। रूट फाइल सिस्टम को खोजने में सक्षम होने के लिए, इसलिए यह बूट प्रक्रिया शुरू कर सकता है। हालाँकि, LVM कुछ उपयोक्ता टूल के ट्रिगर किए बिना शुरू नहीं हो सकता है, जो रूट फाइलसिस्टम पर मौजूद है, जिसे LVM टूल्स के बिना लोड नहीं किया जा सकता है, जो रूट फाइलसिस्टम पर मौजूद है ...);

इस चक्र को तोड़ने के लिए, एक initrd या initramfs एक संपीड़ित फाइल सिस्टम है जो कर्नेल (या तो / बूट में, या कर्नेल के अंदर ही) के साथ संग्रहीत होता है, जिसमें LVM या MD जैसी सेवाएँ शुरू करने के लिए बस एक लिनक्स सिस्टम होता है या जो भी हो तुम्हें चाहिए। यह एक अस्थायी फाइल सिस्टम है, और केवल आपके रूट फाइलसिस्टम के रूप में कार्य करता है ताकि वास्तविक रूट लोड हो सके।

जहाँ तक वास्तव में एक बनाने के लिए, विषय पर अधिकांश दस्तावेज़ीकरण बहुत ही आश्चर्यजनक रूप से अप्रचलित है - lvm2create_initrd, उदाहरण के लिए, अब Gentoo पर भी काम नहीं करता है। (कुछ महीने पहले मैंने एक ही चीज़ की स्थापना की थी, और इससे पहले कि मुझे इस पर काम करने का मौका मिला, मैं स्क्रिप्ट को फिर से लिखना चाहता हूं।) अपने खुद के इनट्रामर्फ्स बनाना मज़ेदार हो सकता है, और यह एक बिल्कुल न्यूनतम बूट पाने का एकमात्र तरीका है प्रक्रिया (और इन्स को सीखें और इस बारे में बहिष्कार करें कि लिनक्स कैसे प्रक्रिया में है), लेकिन यह बहुत काम का है।

संक्षिप्त उत्तर: Drakut का उपयोग करें। यह एक नया ढाँचा है जो अधिकतर स्वचालित तरीके से इनट्राम्राम्स बनाने के लिए बनाया जा रहा है, और यह पोर्टेज में है। दस्तावेज़ीकरण थोड़ा विरल है, लेकिन चीजों को समझने के लिए वहाँ से बाहर पर्याप्त है, और यह एक ठोस इनट्रामर्फ्स पाने के लिए सबसे आसान तरीका है, और एक एलवीएम रूट है।


2

हालांकि कुछ प्रकार की initrd का उपयोग नहीं करना संभव नहीं है, अलग initrd फ़ाइलों का उपयोग नहीं करना संभव है। (मैंने कभी जीनकबर्न का उपयोग नहीं किया है इसलिए मैं इसके लिए निर्देश नहीं दे सकता)।

उदाहरण के लिए मेरे पास विकल्प है:

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 बनाने और संभालने से उत्पन्न होने वाली जटिलताओं को ग्रब 2 को स्थापित करने और उपयोग करने पर म्यूट किया जाता है। Grub2 wiki http://grub.enbug.org/LVMandRAID का वर्णन है कि आप किस तरह से grub.cfg में एक insmod lvm के अलावा lvm पर अपने / बूट कर सकते हैं, ग्रब कॉन्फ़िगरेशन फ़ाइल, इसलिए initrd की कोई आवश्यकता नहीं है।

grub2 अब संस्करण 1.98 पर है लेकिन फिर भी जेंटू में प्रयोगात्मक शाखा में है। हालाँकि इसे दूसरे स्लॉट में इंस्टॉल किया जा सकता है और यह पूरी तरह से प्रयोग करने योग्य है।

का आनंद लें!


हे कि वास्तव में बहुत अच्छा लग रहा है, मैं बाहर की कोशिश करने के लिए मिल गया है!
फुन्नेहे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.