एक विभाजन पर उपनिर्देशिका से बूट लिनक्स सिस्टम?


11

मैं एक कंप्यूटर स्थापित करने का प्रयास करना चाहता हूं ताकि उसके पास एक ही फाइल सिस्टम में कई लिनक्स स्थापित हों। उदाहरण के लिए, filesytem 3 फ़ोल्डरों होगा: /Ubuntu_Precise, /Ubuntu_Oneiric, और /Ubuntu_Natty

(मुझे पता है कि आप BTRFS और सबवोल्यूम के साथ ऐसा कर सकते हैं, लेकिन मैं गति के लिए EXT4 का उपयोग करना चाहूंगा)।

मैंने एक बार BTRFS का उपयोग करके अलग-अलग डिस्ट्रो के कई इंस्टॉल किए, और उस काम को करने से, मुझे पता है कि ग्रब सिर्फ 'नॉनस्टैंडर्ड' रास्तों से vmlinuz और initrd छवि को बूट करने के साथ ठीक करता है। लेकिन जब मैं BTRFS बात कर रहा था, तो वहाँ था rootflags=subvol=@<subvolume_name>कि कर्नेल के रूप में कहा कि / फाइल सिस्टम में उपविभाजित माउंट। क्या कोई तर्क है कि आप कर्नेल को पारित कर सकते हैं जो इसे एक विभाजन के रूप में एक सबफ़ोल्डर माउंट करेगा / और फिर बूट करें?

मैं अन्य हिस्सों के लिए सोचता हूं, मैं काफी करीब हूं। मुझे पता है कि कैसे एक विशिष्ट माउंट में बांधने के लिए /etc/fstab। इसके अलावा, जब से मैंने BTRFS सबवूल्म्स में कई लिनक्स इंस्टाल के साथ अपना सिस्टम स्थापित किया है, तो मुझे VM में एक डिस्ट्रो स्थापित करने और फिर rsync का उपयोग करके इसे माइग्रेट करने के लिए उपयोग किया जाता है, इसलिए मैं इस बारे में चिंतित नहीं हूं कि मुझे क्या करने की आवश्यकता होगी सही कॉन्फ़िगरेशन प्राप्त करें, मैं केवल यह पता लगाने की कोशिश कर रहा हूं कि सही कॉन्फ़िगरेशन क्या होगा। एक बार मुझे पता है कि, मुझे सबफ़ोल्डर्स में माइग्रेशन करने और आसानी से पर्याप्त संपादन करने में सक्षम होना चाहिए।

मैं पहले से ही वर्चुअलाइजेशन और विभाजन के बारे में जानता हूं, लेकिन यह वह नहीं है जिसकी मुझे तलाश है। लक्ष्य कंप्यूटर में वर्चुअलाइजेशन करने के लिए पर्याप्त शक्ति नहीं होती है, और विभाजन मुक्त स्थान साझा नहीं करते हैं। मैं एक ऐसी प्रणाली स्थापित करना चाह रहा हूं जो दोहरे / ट्रिपल / क्वाड / आदि बूट्स लिनक्स डिस्ट्रोस का निर्माण करता है, लेकिन यह एक फाइल सिस्टम के साथ करता है, ताकि "मेरे पास खाली स्थान न हो, लेकिन यह गलत विभाजन में है!"

यदि किसी के पास सुझाव है कि मेरे प्रश्न या उसके शीर्षक को कैसे संपादित किया जाए, तो मैं स्पष्ट हूँ।


1
सिस्टम में AFAIK कुछ भी नहीं है। संभवतः आपको एक और बूटपार्मीटर जोड़ना होगा और अपने initramfs को संशोधित करने से पहले init को निष्पादित करने से पहले उपनिर्देशिका में चुरोट को संशोधित करना होगा
उलरिच डेंगल

@UlrichDangel वही है जो मैं प्रपोज़ करने जा रहा था। इसका उत्तर बनाओ!
निल्स

@ निल्स ठीक है, मैं सिर्फ एक जवाब, tbh प्रदान किया। मैं पहले एक लिखना नहीं चाहता था क्योंकि मैं पैच / स्क्रिप्ट प्रदान नहीं करना चाहता था
उलरिच डांगेल

जवाबों:


10

संक्षिप्त उत्तर - जहाँ तक मुझे पता है कि आपकी विशिष्ट आवश्यकताओं के लिए कोई भी कार्यशील समाधान नहीं है। आपको अपनी विशिष्ट आवश्यकताओं का समर्थन करने के लिए प्रत्येक वितरण के प्रत्येक initramfs को समायोजित करना होगा।

लंबे उत्तर - हाँ यह संभव है। आजकल अधिकांश लिनक्स वितरण एक इनट्रामेफ़्स का उपयोग करते हैं जो कि बूटलोडर द्वारा मेमोरी में लोड किया जाएगा और फिर कर्नेल द्वारा अनपैक किया जाएगा। वहाँ यह चलेगा /sbin/initजो शुरुआती उपयोगकर्तास्थान (रनिंग udev, लोडिंग मॉड्यूल, प्लायमाउथ शुरू करने, क्रिप्टो पासफ़्रेज़ के लिए पूछना, नेटवर्क माउंट के लिए नेटवर्क स्थापित करने के लिए ज़िम्मेदार है, ... आप इसे नाम देते हैं)। जैसा कि आप अपनी स्क्रिप्ट चला सकते हैं और कस्टम बूट परमाटर्स का मूल्यांकन कर सकते हैं।

डेबियन के लिए उदाहरण

यदि आप डेबियन का उपयोग कर रहे हैं (उबंटू के साथ भी ऐसा ही होना चाहिए) तो आपको एक स्क्रिप्ट लगाने में सक्षम होना चाहिए, /etc/initramfs-tools/scripts/init-bottom/जिसमें init शुरू होने से पहले निष्पादित किया जाएगा। स्क्रिप्ट के बारे में अधिक जानकारी के लिए, अलग-अलग निर्देशिकाओं और लेआउट में आदमी initramfs-tools पर एक नज़र है । आपको rootmntलक्ष्य निर्देशिका को समायोजित और जोड़ना होगा।

नमूना (अप्रयुक्त) स्क्रिप्ट जिसे /etc/initramfs-tools/scripts/local-bottom/00-myrootया तो स्थापित किया जाना चाहिए /usr/share/initramfs-tools/scripts/init-top/00-myroot:

#!/bin/sh -e

PREREQS=""

prereqs() { echo "$PREREQS"; }

case "$1" in
  prereqs)
  prereqs
  exit 0
;;
esac

for opt in $(cat /proc/cmdline); do
  case $opt in
    rootdir=*)
      new_mntdir="${opt#rootdir=}"
      ;;
    esac
done

if [ -n "$new_mntdir" ] ; then
  echo rootmnt="$rootmnt/$new_mntdir" >> /conf/param.conf
fi

विचार को समायोजित करना है rootmnt जो initवास्तविक init को शुरू / निष्पादित करने के लिए initramfs स्क्रिप्ट में उपयोग किया जाता है । जैसा कि रूट डिवाइस पहले से ही init-bootomस्टेज में मुहिम चला रहा है, आप टारगेट डायरेक्टरी को एडजस्ट / बदल सकते हैं।

इस स्क्रिप्ट का उपयोग करने के लिए, बस एक नया बूट पैरामीटर जोड़ें, स्क्रिप्ट की प्रतिलिपि बनाएँ, इसे निष्पादन योग्य बनाएं, अपने initramfs को पुन: बनाएँ और अपने लिनक्स वितरण के लिए बूट पैरामीटर जोड़ें, जैसे rootdir=/Ubuntu_Precise


आप संभवतया वास्तविक रूट को ओ एस रूट की उप-श्रेणी में बांधना चाहते हैं ताकि आप एक बूट से अन्य ओएस फ़ाइलों को देख सकें।
psusi

@psusi आप इसे fstab के माध्यम से कर सकते हैं या mount /dev/rootdevice /mountpointसिस्टम के चलने के बाद सीधे कर सकते हैं
उलरिक डांगेल

मुझे आश्चर्य है कि कब बदला? आप एक ही ब्लॉक डिवाइस को फिर से माउंट करने में सक्षम नहीं थे; आपको एक EBUSY मिलेगा।
psusi

1
@psusi निश्चित नहीं है, लेकिन शायद बाइंड माउंट्स की शुरुआत के साथ
उलरिच डेंगल

@UlrichDangel (बहुत) विस्तृत जवाब के लिए धन्यवाद!
अजेन्डले

3

यहाँ दो तरीके हैं जो उबंटू बायोनिक (और संभवतः अन्यत्र) में काम करते हैं। मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है, लेकिन, बायोनिक: / usr / share / initramfs-tools / init / etc / fstab में / देखने के लिए / ठीक से आरोह-अवरोह के बाद और कॉल करने से पहले * -bottom स्क्रिप्ट को कॉल करता है, इसलिए एक init- जोड़ना नीचे की पटकथा (जैसा कि यहां एक और जवाब में दिया गया है) "बहुत देर हो चुकी है"। इसके बजाय मैं ये सलाह देता हूं:

#!/bin/bash -f
#copyleft 2018 greg mott

#set a subdirectory as root (so multiple installs don't need partitions)
#these work in ubuntu bionic, might need tweaking to work elsewhere
#1st choice:  tweak initramfs-tools/scripts/local
#   pro:  $sub becomes root directly, nothing gets any chance to see the partition root
#   con:  requires the subdirectory's initramfs/initrd to be tweaked and rebuilt
#2nd choice:  specify this scriptfile as init= on the kernel commandline
#   pro:  no need to rebuild initramfs
#   con:  requires bin/bash in the partition root executable by $sub/vmlinux (ie $sub same or newer than partition root)
#   con:  if the partition root etc/fstab mounts /usr, the $sub initramfs will mount the partition root /usr
#   con:  additional initramfs scripts might also look in the partition root rather than $sub

#for either choice copy /etc/grub.d/40_custom to /etc/grub.d/07_custom and add one or more menuentries that specify subroot:
#menuentry "subroot foo" {
#     echo "subroot foo"
#              sub=/foo
#             uuid=22e7c84a-a416-43e9-ae9d-ee0119fc3894         #use your partition's uuid
#     search --no-floppy --fs-uuid --set=root $uuid
#            linux $sub/vmlinuz ro root=UUID=$uuid subroot=$sub
#     echo "initrd $sub/initrd.img"
#           initrd $sub/initrd.img      #works in recent releases where the /initrd.img softlink is relative
#}

#for the 2nd choice, in addition to subroot= on the kernel commandline also specify:
#   init=/path/to/script        #pathname from partition root to this scriptfile (chmod 744)

#for the 1st choice, the tweak for bionic:/usr/share/initramfs-tools/scripts/local is replace:
#          mount ${roflag} ${FSTYPE:+-t ${FSTYPE} }${ROOTFLAGS} ${ROOT} ${rootmnt}
#          mountroot_status="$?"
#with:
#          set -x
#          karg=" $(cat<proc/cmdline) " m=${karg#* subroot=}
#          [ "$m" = "$karg" ]||subroot=${m%% *}                                         #extract subroot from kernel commandline
#          [ $subroot ]&&part=part||part=$rootmnt                                       #no subroot, just mount partition as root
#          mkdir part
#          mount ${roflag} ${FSTYPE:+-t ${FSTYPE} }${ROOTFLAGS} ${ROOT} $part&&         #mount partition
#             if [ "$subroot" ]
#             then mount --bind part/$subroot $rootmnt&&                                #mount subroot
#                  umount part                       #&&sleep 15                        #unmount partition root (uncomment &&sleep for time to watch)
#             fi
#          mountroot_status="$?"
#          [ $mountroot_status = 0 ]||sleep 90                                          #if error pause to see it
#          set +x
#once you've edited /usr/share/initramfs-tools/scripts/local, update-initramfs -u will rebuild for the current kernel,
#and it will automatically build into every new initrd/initramfs installed thereafter

subroot(){ karg=" $(cat<proc/cmdline) " m=${karg#* subroot=}
           [ "$m" = "$karg" ]||subroot=${m%% *}                 #extract subroot from kernel commandline
           [ $subroot ]||return 0                               #no subroot, just proceed in partition root
           while read -r m r m
           do for m in $M x                                     #build list of what's already mounted
              do    [[ $r = $m* ]]&&break                       #exclude subtrees (eg dev/**)
              done||[[ $r = /   ]]||M=$M\ $r                    #exclude /
           done<proc/mounts
           (set -x;mount --bind $subroot mnt)||{ set -x         #mount subroot
                                                 sleep 30          #if not found pause to see error
                                                 return 0;}        #then reincarnate as partition root init
           for m in $M
           do (set -x;mount -n --move $m mnt$m)||return         #move listed mounts to subroot
           done
           set -x
           cd           mnt&&
           pivot_root . mnt&&                                   #subroot becomes root
           umount -l    mnt&&                                   #unmount partition root
          #sleep 15        &&                                   #so far so good?  uncomment for time to look
           exec chroot . init "$@"                              #reincarnate as subroot init
}
subroot "$@"&&exec init "$@"||exec bash                         #land in a shell if moves or pivot fail

इसने मेरे लिए एक इलाज का काम किया
paultop6

1

विभाजन तालिका के साथ खिलवाड़ किए बिना अलग-अलग लिनक्स बूट करना अलग-अलग उद्देश्यों के लिए दिलचस्प है, एक साझा फाइलसिस्टम का एक वैकल्पिक समाधान लूप वॉल्यूम का उपयोग करना है, यहां कुछ बदलावों की आवश्यकता है जो आपको एक / डेबियन लूप फ़ाइल / वॉल्यूम को / dev / sdd1 फ़ाइल सिस्टम में दिखाते हैं। (मैं मुख्य और लूप ओएस दोनों के लिए वर्तमान जीएनयू / डेबियन फुट / अस्थिर का उपयोग कर रहा हूं)।

/etc/grub.d/40_custom: # outside from loop volume
menuentry 'label' --class gnu-linux --class gnu --class os {
    ...
    loopback loop (hd2,msdos1)/debian
    linux   (loop)/boot/vmlinuz root=/dev/sdb1 loop=/debian ro
    initrd  (loop)/boot/initrd
}

लिनक्स कमांड लाइन के रूप में ग्रब में परिभाषित तर्क initrd / init द्वारा एनवी करने के लिए सेट किए गए हैं, इसलिए:

ROOT=/dev/sdb1
rootmnt=/root
loop=/debian 

लूप "स्वयं" पर वॉल्यूम को माउंट करने की अनुमति देता है, डिफ़ॉल्ट स्क्रिप्ट प्रवाह mount /dev/sdb1 /rootहम केवल वैकल्पिक रूप से / dev / sdb1 को rw के रूप में रिम ​​करते हैं यदि यह आरओ था तो हमेशा एक संलग्न करें mount -o loop /root/debian /root

/etc/initramfs-tools/scripts/local-bottom/loop: # inside the loop volume
#!/bin/sh

[ "$1" = "prereqs" ] && echo && exit 0

if [ -n "${loop}" ]; then
        if [ "${readonly}" = "y" ]; then
                roflag=-r
                mount -o remount,rw ${ROOT} ${rootmnt}
        else
                roflag=-w
        fi
        mount ${roflag} -o loop ${rootmnt}${loop} ${rootmnt}
fi

इनट्राम में कुछ मॉड्यूल को प्री-लोड करने की भी आवश्यकता है (फिर अपडेट-इनट्रैमफोर्स चलाना न भूलें)

/etc/initramfs-tools/modules: # inside the loop volume
...
loop
ext4

लूप प्रभाव प्रदर्शन या अपशिष्ट संसाधनों का उपयोग करने का पता नहीं है, मैं सोच रहा था कि ext4 बढ़ते 4 एक फाइल सिस्टम विफलता की संभावनाओं को दोगुना कर देता है, लेकिन लगता है कि कुछ ट्यूनअप किया जा सकता है। हो सकता है कि लूप, कम हैकिश का उपयोग करने का एक बेहतर तरीका हो, अगर वहाँ कृपया मुझे बताएं क्योंकि मुझे नहीं मिला है।


0

यह एक उत्तर नहीं है, लेकिन मैं उलरिच के उत्तर और टिप्पणियों के बारे में कुछ बिंदु स्पष्ट करना चाहता हूं (मैं ऊपर टिप्पणी नहीं कर सकता)।

Ulrich का प्रस्ताव "काम" हो सकता है (अभी तक अप्रकाशित ) लेकिन फिर आपको एक गैर-उल्लेखनीय फाइल सिस्टम मिलेगा । एक वर्कअराउंड (IMHO बदसूरत) के रूप में आप chrooting ( जैसा कि यहाँ सुझाव दिया गया है ) से पहले rs के रूप में fs माउंट कर सकते हैं, लेकिन टूटी हुई स्क्रिप्ट के बारे में सावधान रहें। मुझे लगता है कि इस वर्कअराउंड के अधिक साइड इफेक्ट्स हैं (जैसे टूटे हुए एफएस आरओ और असफल होने की कोशिश करते हैं)।

मैं कर्नेल 3.2 का उपयोग कर रहा हूँ ext4 के साथ और चौराहे के अंदर पहले से ही माउंट किए गए देव को माउंट कर रहा हूं क्योंकि अभी भी मानुषी ने टिप्पणी के रूप में EBUSY दिया है।

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