পার্টিশনের সাব-ডিরেক্টরি থেকে বুট লিনাক্স সিস্টেম?


11

আমি একটি কম্পিউটার সেট আপ করার চেষ্টা করতে চাই যাতে এটিতে একই ফাইল সিস্টেমে একাধিক লিনাক্স ইনস্টল থাকে। উদাহরণস্বরূপ, filesytem 3 ফোল্ডার প্রয়োগ করা হবে: /Ubuntu_Precise, /Ubuntu_Oneiric, এবং /Ubuntu_Natty

(আমি জানি আপনি এটি বিটিআরএফএস এবং সাবভলিউম দিয়ে করতে পারেন তবে আমি গতির জন্য EXT4 ব্যবহার করতে চাই)।

আমি একবার বিটিআরএফএস ব্যবহার করে বিভিন্ন ডিস্ট্রোজের একাধিক ইনস্টল সেটআপ করেছি এবং এই কাজটি করা থেকে আমি জানি গ্রুব 'নন-স্ট্যান্ডার্ড' পাথ থেকে ভিএমলিনুজ এবং ইআরআরডি ইমেজটি বুট করার মাধ্যমে ঠিকঠাক কাজ করে। তবে আমি যখন বিটিআরএফএস কাজটি করছিলাম, সেখানে rootflags=subvol=@<subvolume_name>কার্নেলটি ফাইল-সিস্টেম হিসাবে / সাব-ভলিউমটি মাউন্ট করতে বলেছিল। এমন কোনও যুক্তি রয়েছে যে আপনি কার্নেলটি পাস করতে পারবেন যা এটি / এবং তারপরে বুট হিসাবে একটি পার্টিশনে সাবফোল্ডারটিকে মাউন্ট করতে পারে?

আমি অন্য অংশগুলির জন্য মনে করি, আমি মোটামুটি কাছাকাছি। আমি জানি কিভাবে কীভাবে একটি বাঁধাই মাউন্ট নির্দিষ্ট করতে হয় /etc/fstab। এছাড়াও, আমি যখন বিটিআরএফএস সাবভলিউমগুলিতে একাধিক লিনাক্স ইনস্টল করে আমার সিস্টেম সেটআপ করেছি তখন থেকে আমি কোনও ভিএম-তে একটি ডিস্ট্রো ইনস্টল করতে এবং তারপর আরএসসিএনসি ব্যবহার করে এটি স্থানান্তরিত করতে অভ্যস্ত, সুতরাং আমার কী করতে হবে তা নিয়ে আমি খুব বেশি চিন্তিত নই not সঠিক কনফিগারেশন পান, আমি সঠিক কনফিগারেশনটি কী হবে তা সন্ধান করার চেষ্টা করছি। আমি একবার এটি জানতে পারলে আমার সাবফোল্ডারগুলিতে মাইগ্রেশন করতে এবং ফাইল সম্পাদনা সহজেই করা উচিত।

আমি ভার্চুয়ালাইজেশন এবং পার্টিশন সম্পর্কে ইতিমধ্যে জানি, তবে এটি আমি খুঁজছি না। লক্ষ্যযুক্ত কম্পিউটারে ভার্চুয়ালাইজেশন করার মতো পর্যাপ্ত শক্তি নেই এবং পার্টিশনগুলি খালি স্থান ভাগ করে না। আমি একটি সিস্টেম স্থাপন করতে দেখছি যা দ্বৈত / ট্রিপল / কোয়াড / ইত্যাদি বুটগুলি লিনাক্স ডিস্ট্রোস করে, তবে এটি একটি ফাইল সিস্টেমের সাথে এটি করে, যাতে "আমার কাছে ফাঁকা স্থান নেই, তবে এটি ভুল বিভাজনে!"

কারও কাছে যদি আমার প্রশ্নটি সম্পাদনা করতে হয় বা এর শিরোনাম আরও পরিষ্কার হয় তবে আমি সব কানেই আছি।


1
সিস্টেমে এএফআইএকি কিছুই নেই। আপনার সম্ভবত যা করতে হবে তা হ'ল আর একটি বুটপ্যারামিটার যুক্ত করুন এবং ইআর এক্সিকিউট করার আগে সাব-ডিরেক্টরীতে ক্রোতে আপনার ইআরআরামগুলি সংশোধন করতে হবে
উলিরিচ ড্যাঞ্জেল

@ অলিরিচডাঙ্গেল যা আমি প্রপোজ করতে যাচ্ছিলাম। এটি একটি উত্তর করুন!
নীল

@ নীল ঠিক আছে আমি সবেমাত্র একটি উত্তর সরবরাহ করেছি, টিবিএইচ। আমি প্যাচ / স্ক্রিপ্টটি সরবরাহ করতে চাইনি বলে আমি প্রথমে একটি লিখতে
চাইনি

উত্তর:


10

সংক্ষিপ্ত উত্তর - আপনার নির্দিষ্ট প্রয়োজনীয়তার জন্য বাক্সের কার্যক্ষম সমাধানের বাইরে আমি জানি না। আপনার নির্দিষ্ট প্রয়োজনগুলিকে সমর্থন করতে আপনাকে প্রতিটি বিতরণের প্রতিটি ইআরআরএনএম সমন্বিত করতে হবে।

দীর্ঘ উত্তর - হ্যাঁ এটা সম্ভব। আজকাল বেশিরভাগ লিনাক্স ডিস্ট্রিবিউশনে একটি initramfs ব্যবহার করা হয় যা বুটলোডার দ্বারা মেমরিতে লোড করা হবে এবং তারপরে কার্নেল দ্বারা প্যাক করা হবে না। সেখানে এটি চলবে /sbin/initযা প্রাথমিক ইউজারস্পেস সেট আপ করার জন্য দায়ী (ইউদেব চালানো, মডিউল লোড করা, প্লাইমাউথ শুরু করা, ক্রিপ্টো পাসফ্রেজ জিজ্ঞাসা করা, নেটওয়ার্ক মাউন্টগুলির জন্য নেটওয়ার্ক স্থাপন, ... আপনি নাম দিন)) যেমন আপনি নিজের স্ক্রিপ্টগুলি চালনা করতে পারেন এবং কাস্টম বুট পারমাটারগুলি মূল্যায়ন করতে পারেন।

দেবিয়ান জন্য উদাহরণ

আপনি যদি ডেবিয়ান ব্যবহার করছেন (উবুন্টুর সাথে একই হওয়া উচিত) আপনি স্ক্রিপ্ট স্থাপন করতে সক্ষম হবেন /etc/initramfs-tools/scripts/init-bottom/যা ইন-টি শুরু হওয়ার আগেই কার্যকর করা হবে। স্ক্রিপ্ট সম্পর্কে আরও তথ্যের জন্য, বিভিন্ন ডিরেক্টরি এবং বিন্যাসে ম্যান ই্রাম্রামফস-সরঞ্জামগুলিতে নজর রাখা হয়েছে । আপনাকে 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শুরু / সম্পাদন করতে initramfs স্ক্রিপ্টে কোনটি ব্যবহৃত হয় তা ধারণাটি হ'ল রুট ডিভাইসটি ইতিমধ্যে init-bootomপর্যায়ে মাউন্ট করা থাকলে আপনি কেবলমাত্র লক্ষ্য ডিরেক্টরিটি ঠিক করতে / পরিবর্তন করতে পারবেন।

এই স্ক্রিপ্টটি ব্যবহার করতে কেবল একটি নতুন বুট প্যারামিটার যুক্ত করুন, স্ক্রিপ্টটি অনুলিপি করুন, এটিকে এক্সিকিউটেবল করে তুলুন, আপনার initramf গুলি পুনরায় জেনারেট করুন এবং আপনার লিনাক্স বিতরণের জন্য একটি বুট প্যারামিটার যুক্ত করুন, যেমন rootdir=/Ubuntu_Precise


আপনি সম্ভবত আসল রুটটিকে ওএস রুটের একটি সাবডিরের সাথে আবদ্ধ করতে চান যাতে আপনি যে বুট করেন তার থেকে অন্য ওএস ফাইলগুলি দেখতে পাবেন।
psusi

@psusi আপনি এটি fstab এর মাধ্যমে করতে পারেন বা mount /dev/rootdevice /mountpointসিস্টেমটি চলার পরে সরাসরি করতে পারেন
উলরিচ ড্যাঙ্গেল

ভাবছি কখন বদলেছে? আপনি একই ব্লক ডিভাইসটি আবার মাউন্ট করতে সক্ষম হবেন না; আপনি একটি EBUSY পেতে হবে।
psusi

1
@ পিপুসি নিশ্চিত নন তবে সম্ভবত বাঁধার মাউন্টগুলির প্রবর্তনের সাথে
উলরিচ ড্যাঙ্গেল

@ আলরিচডাঙ্গেল (খুব) বিস্তারিত উত্তরের জন্য ধন্যবাদ!
আজেন্ডালে

3

এখানে দুটি উপায় যা উবুন্টু বায়োনিক (এবং সম্ভবত অন্য কোথাও) এ কাজ করে। আমি মন্তব্য করার মতো যথেষ্ট প্রতিনিধি নেই, তবে, বায়োনিক: / usr / share / initramfs-tools / init / usr এর জন্য / etc / fstab এ ডান মাউন্টরুট কল করার পরে এবং *-নীচে স্ক্রিপ্টগুলি কল করার আগে দেখেছি, সুতরাং একটি ডিআইটি- নীচের স্ক্রিপ্ট (এখানে অন্য উত্তরে প্রস্তাবিত হিসাবে) "খুব দেরী"। পরিবর্তে আমি এই সুপারিশ:

#!/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 / sdb1 ফাইল সিস্টেমে রয়েছে বলে কয়েকটি পরিবর্তন প্রয়োজন (আমি মূল এবং লুপ ওএস উভয়ের জন্য বর্তমান জিএনইউ / ডেবিয়ান সিড / অস্থির ব্যবহার করছি)।

/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 দ্বারা env তে সেট করা আছে, সুতরাং:

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

লুপটি "নিজেই" ভলিউমটি মাউন্ট করার অনুমতি দেয়, ডিফল্ট স্ক্রিপ্ট প্রবাহটি mount /dev/sdb1 /rootআমরা কেবলমাত্র ডি / ডি / এসডিবি 1 কে আর ডাব্লু হিসাবে পুনঃসমাউন্ট করি যদি এটি রো হয় তবে সর্বদা একটি যুক্ত করুন 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

লুপ এফেক্ট পারফরম্যান্স বা বর্জ্য সংস্থান ব্যবহার করে কতটা জানেন না, আমি ভাবছি যে এক্সট 4 এর উপরে এক্সট 4 মাউন্ট করা কোনও ফাইল সিস্টেমের ব্যর্থতার সম্ভাবনার দ্বিগুণ কিনা, তবে অনুমান করুন যে কিছু টিউনআপ করা যেতে পারে। লুপ, কম হ্যাকিশ ব্যবহারের আরও ভাল উপায় থাকতে পারে তবে দয়া করে আমাকে জানান কারণ আমি খুঁজে পাইনি।


0

এটি কোনও উত্তর নয় তবে আমি উলরিচের উত্তর এবং মন্তব্য সম্পর্কে কিছু বক্তব্য স্পষ্ট করতে চাই (আমি উপরে মন্তব্য করতে পারি না)।

অ্যালরিচের প্রস্তাব দেওয়া সমাধান "কাজ" করতে পারে (এখনও অপেশিত ) তবে তারপরে আপনি একটি অ-পুনঃসমাংশযোগ্য ফাইল সিস্টেম পাবেন । ওয়ার্কআরাউন্ড (আইএমএইচও কুরুচিপূর্ণ) হিসাবে আপনি ক্রুটিংয়ের আগে fs টি rw হিসাবে মাউন্ট করতে পারেন ( এখানে প্রস্তাবিত হিসাবে ) তবে ভাঙা এনআইডি স্ক্রিপ্টগুলি সম্পর্কে সতর্কতা অবলম্বন করুন। আমার ধারণা, এই কাজের আরও পার্শ্ব প্রতিক্রিয়া রয়েছে (যেমন ভাঙা এফএস রিওমাউন্ট করার চেষ্টা করছে এবং ব্যর্থ হচ্ছে)।

আমি ext4 এর সাথে কার্নেল ৩.২ ব্যবহার করছি এবং ক্রুটের অভ্যন্তরে ইতিমধ্যে মাউন্ট করা ডেভ মাউন্ট করছি যা ইবুসির মন্তব্য হিসাবে EBUSY দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.