লাইভসিডি বুট না করে কীভাবে রুট ফাইল সিস্টেম সঙ্কুচিত করবেন


93

রুট ফাইল সিস্টেমের অধীনে ডেটা ডেডিকেটেড মাউন্ট পয়েন্টগুলিতে সরাতে আমি নিজেকে একটি সিস্টেমের পার্টিশনগুলি পুনরায় সাজানোর প্রয়োজন বলে মনে করি। ভলিউমগুলি সমস্ত এলভিএম-এ রয়েছে, সুতরাং এটি তুলনামূলকভাবে সহজ: নতুন ভলিউম তৈরি করুন, তাদের মধ্যে ডেটা স্থানান্তর করুন, রুট ফাইল সিস্টেমটি সঙ্কুচিত করুন, এবং তারপর নতুন ভলিউমগুলি যথাযথ পয়েন্টগুলিতে মাউন্ট করুন।

রুট ফাইল সিস্টেমটি সঙ্কুচিত করে ইস্যুটি পদক্ষেপ 3। জড়িত ফাইল সিস্টেমগুলি ext4, তাই অনলাইনে পুনরায় আকার দেওয়া সমর্থনযোগ্য; যাইহোক, মাউন্ট করা অবস্থায়, ফাইল সিস্টেমগুলি কেবল বাড়ানো যায়। পার্টিশন সঙ্কুচিত করার জন্য এটি আনমাউন্ট করা দরকার, যা অবশ্যই স্বাভাবিক ক্রিয়ায় মূল বিভাজনের পক্ষে সম্ভব নয়।

ওয়েবের চারপাশের উত্তরগুলি লাইভসিডি বা অন্যান্য উদ্ধার মিডিয়া বুট করার জন্য, সঙ্কুচিত ক্রিয়াকলাপটি করার পরে, ইনস্টল করা সিস্টেমে আবার বুট করার আশেপাশে ঘোরে। তবে, প্রশ্নে থাকা সিস্টেমটি দূরবর্তী, এবং আমার কেবল এসএসএইচের মাধ্যমে অ্যাক্সেস রয়েছে। আমি রিবুট করতে পারি, তবে একটি উদ্ধার ডিস্ক বুট করা এবং কনসোল থেকে অপারেশন করা সম্ভব নয়।

রিমোট শেল অ্যাক্সেস বজায় রেখে আমি কীভাবে রুট ফাইল সিস্টেমটি আনমাউন্ট করতে পারি?


অস্থায়ীভাবে কোনও আলাদা সার্ভারে রুট ফাইল সিস্টেমটি মাউন্ট করার কোনও সুযোগ? উদাহরণস্বরূপ, অন্য কোনও ভিএম স্পিন করুন এবং এতে এই ডিস্কের ভলিউম উপস্থাপন করবেন?
স্টিভ

সার্ভার শারীরিক, তাই না।
টম হান্ট

4
Tmpfs এ এবং pivot_rootসেখানে root এখানে উদাহরণস্বরূপ dreamlayers.blogspot.co.uk/2012/10/running-linux-from-ram.html - এটি মুশকিল তবে এটি চেষ্টা করার জন্য যদি আপনার কাছে একটি পরীক্ষার বাক্স থাকে তবে বিবেচনা করার মতো।
স্টিভ

1
এখানে আরেকটি উদাহরণ, যেখানে এসএসএসের
স্টিভ 21

2
রুট এলভিএমটি যদি যথেষ্ট ছোট হয় তবে আপনি এটির জন্য অন্য একটি এলভিএমের ক্লোন করতে পারেন এবং এটি ব্যবহারের জন্য গ্রুতে বুট ইটারি (টেম্পল ডিফল্ট) তৈরি করতে পারেন এবং তারপরে এটি থেকে বুট করুন (এটি আপনার "লাইভ সিস্টেম"
বানায়

উত্তর:


169

এই সমস্যাটি সমাধান করার জন্য, http://www.ivarch.com/blogs/oss/2007/01/resize-a-live-root-fs-a-howto.shtml এ দেওয়া তথ্যটি ছিল গুরুত্বপূর্ণ। তবে, গাইডটি আরএইচএল-এর একটি খুব পুরানো সংস্করণের জন্য এবং বিভিন্ন তথ্য অপ্রচলিত ছিল।

নীচের নির্দেশাবলী CentOS 7 এর সাথে কাজ করার জন্য তৈরি করা হয়েছে তবে এটি সিস্টেমড চলমান যে কোনও ডিস্ট্রোতে সহজেই স্থানান্তরযোগ্য হবে। সমস্ত কমান্ড রুট হিসাবে চালিত হয়।

  1. সিস্টেমটি একটি স্থিতিশীল অবস্থায় রয়েছে তা নিশ্চিত করুন

    এটি নিশ্চিত করুন যে অন্য কেউ এটি ব্যবহার করছে না এবং গুরুত্বপূর্ণ কিছু চলছে না। বাইরের সংযোগগুলি যাতে মাঝখানে জিনিসকে ব্যাহত না করে তা নিশ্চিত করার জন্য, httpd বা ftpd এর মতো পরিষেবা সরবরাহকারী ইউনিটগুলি বন্ধ করা সম্ভবত একটি ভাল ধারণা।

    systemctl stop httpd
    systemctl stop nfs-server
    # and so on....
    
  2. সমস্ত অব্যবহৃত ফাইল সিস্টেম আনমাউন্ট করুন

    umount -a
    

    এটি নিজেই মূল লক্ষ্য এবং বিভিন্ন অস্থায়ী / সিস্টেম এফএস এর জন্য 'টার্গেট ব্যস্ত' সতর্কতাগুলি মুদ্রণ করবে। এগুলি মুহুর্তের জন্য উপেক্ষা করা যেতে পারে। গুরুত্বপূর্ণটি হ'ল রুট ফাইল সিস্টেমটি বাদে কোনও অনস্ক্রিয় ফাইল সিস্টেম মাউন্ট করা যায় না। এটি যাচাই করুন:

    # mount alone provides the info, but column makes it possible to read
    mount | column -t
    

    যদি আপনি দেখতে পান যে কোনও অন-ডিস্ক ফাইল সিস্টেম এখনও মাউন্ট করা আছে, তবে এমন কিছু এখনও চলছে যা হওয়া উচিত নয়। এটি কী ব্যবহার করছে তা পরীক্ষা করুন fuser:

    # if necessary:
    yum install psmisc
    # then:
    fuser -vm <mountpoint>
    systemctl stop <whatever>
    umount -a
    # repeat as required...
    
  3. অস্থায়ী মূল তৈরি করুন

    mkdir /tmp/tmproot
    mount -t tmpfs none /tmp/tmproot
    mkdir /tmp/tmproot/{proc,sys,dev,run,usr,var,tmp,oldroot}
    cp -ax /{bin,etc,mnt,sbin,lib,lib64} /tmp/tmproot/
    cp -ax /usr/{bin,sbin,lib,lib64} /tmp/tmproot/usr/
    cp -ax /var/{account,empty,lib,local,lock,nis,opt,preserve,run,spool,tmp,yp} /tmp/tmproot/var/
    

    এটি একটি খুব ন্যূনতম রুট সিস্টেম তৈরি করে, যা (অন্যান্য জিনিসের মধ্যে) ম্যানপেজ ভিউ (না /usr/share), ব্যবহারকারী-স্তরের কাস্টমাইজেশন (না /rootবা /home) এবং এর বাইরেও ব্রেক করে। এটি ইচ্ছাকৃত, কারণ এটি প্রয়োজনের তুলনায় আর জুরি-র্যাজড রুট সিস্টেমে না থাকার জন্য উত্সাহ দেয়।

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

  4. মূলটি মূল

    mount --make-rprivate / # necessary for pivot_root to work
    pivot_root /tmp/tmproot /tmp/tmproot/oldroot
    for i in dev proc sys run; do mount --move /oldroot/$i /$i; done
    

    সিস্টেমেড ডিফল্টরূপে (যেমন হিসাবে mount --make-shared) সাবট্রি ভাগ করে নেওয়ার অনুমতি দেয় এবং এর ফলে pivot_rootব্যর্থ হয়। সুতরাং, আমরা এটি বিশ্বব্যাপী বন্ধ করে দিয়েছি mount --make-rprivate /। সিস্টেম এবং অস্থায়ী ফাইল সিস্টেমগুলি নতুন রুটে পাইকারিভাবে সরানো হয়। এটি এটিকে আদৌ কার্যকর করার জন্য প্রয়োজনীয়; সিস্টেমেডের সাথে যোগাযোগের জন্য সকেটগুলি, অন্যান্য জিনিসের মধ্যেই বাস করে /runএবং তাই চলমান প্রক্রিয়াগুলি এটি বন্ধ করে দেওয়ার কোনও উপায় নেই।

  5. দূরবর্তী অ্যাক্সেস পরিবর্তন থেকে বেঁচে আছে তা নিশ্চিত করুন

    systemctl restart sshd
    systemctl status sshd
    

    Sshd পুনরায় আরম্ভ করার পরে, অন্য টার্মিনালটি খোলার মাধ্যমে এবং ssh এর মাধ্যমে আবার মেশিনে সংযুক্ত হয়ে আপনি প্রবেশ করতে পারবেন তা নিশ্চিত করুন। যদি আপনি না পারেন তবে এগিয়ে যাওয়ার আগে সমস্যাটি ঠিক করুন।

    একবার যাচাই হয়ে গেলে আপনি আবার সংযোগ করতে পারবেন, আপনি বর্তমানে ব্যবহৃত শেলটি থেকে প্রস্থান করুন এবং পুনরায় সংযোগ স্থাপন করুন। এটি বাকী কাঁটাচামচটি sshdপ্রস্থান করার অনুমতি দেয় এবং এটি নিশ্চিত করে যে নতুনটি ধরে নেই /oldroot

  6. এখনও পুরানো শিকড় ব্যবহার করে সবকিছু বন্ধ করুন

    fuser -vm /oldroot
    

    এটি পুরানো রুট ডিরেক্টরিতে থাকা প্রক্রিয়াগুলির তালিকা মুদ্রণ করবে। আমার সিস্টেমে এটি দেখতে এমন দেখাচ্ছে:

                 USER        PID ACCESS COMMAND
    /oldroot:    root     kernel mount /oldroot
                 root          1 ...e. systemd
                 root        549 ...e. systemd-journal
                 root        563 ...e. lvmetad
                 root        581 f..e. systemd-udevd
                 root        700 F..e. auditd
                 root        723 ...e. NetworkManager
                 root        727 ...e. irqbalance
                 root        730 F..e. tuned
                 root        736 ...e. smartd
                 root        737 F..e. rsyslogd
                 root        741 ...e. abrtd
                 chrony      742 ...e. chronyd
                 root        743 ...e. abrt-watch-log
                 libstoragemgmt    745 ...e. lsmd
                 root        746 ...e. systemd-logind
                 dbus        747 ...e. dbus-daemon
                 root        753 ..ce. atd
                 root        754 ...e. crond
                 root        770 ...e. agetty
                 polkitd     782 ...e. polkitd
                 root       1682 F.ce. master
                 postfix    1714 ..ce. qmgr
                 postfix   12658 ..ce. pickup
    

    আনমাউন্ট করার আগে আপনাকে এই প্রক্রিয়াগুলির প্রত্যেকটির সাথে ডিল করতে হবে /oldroot। নিষ্ঠুর শক্তি পদ্ধতির kill $PIDপ্রতিটি জন্য কেবল , কিন্তু এটি জিনিসগুলি ভাঙ্গতে পারে। আরও মৃদুভাবে এটি করতে:

    systemctl | grep running
    

    এটি চলমান পরিষেবাদির একটি তালিকা তৈরি করে। আপনার এগুলি হোল্ডিং প্রক্রিয়াগুলির তালিকার সাথে সম্পর্কিত করতে সক্ষম হওয়া উচিত /oldroot, তারপরে systemctl restartতাদের প্রতিটিটির জন্য জারি করুন। কিছু পরিষেবা অস্থায়ী মূলের মধ্যে আসতে অস্বীকার করবে এবং একটি ব্যর্থ অবস্থায় প্রবেশ করবে; এগুলি মুহুর্তের জন্য সত্যিই কিছু যায় আসে না।

    আপনি যে আকারটি নতুন আকারে পরিবর্তন করতে চান তা যদি একটি এলভিএম ড্রাইভ হয় তবে আপনার তৈরি অন্যান্য তালিকাগুলি না দেখালেও আপনাকে চলমান কিছু পরিষেবা পুনরায় চালু করতেও পারে fuser -vm /oldroot। যদি আপনি দেখতে পান যে আপনি ধাপ 7 এর অধীনে একটি এলভিএম ড্রাইভের আকার পরিবর্তন করতে অক্ষম, চেষ্টা করুন systemctl restart systemd-udevd

    কিছু প্রক্রিয়া সহজ মাধ্যমে মোকাবেলা করা যাবে না systemctl restart। আমার জন্য এগুলি অন্তর্ভুক্ত রয়েছে auditd(যা দিয়ে হত্যা করা পছন্দ করে না systemctl, এবং কেবল একটি চেয়েছিল kill -15)। এগুলি স্বতন্ত্রভাবে মোকাবেলা করা যেতে পারে।

    আপনি যে শেষ প্রক্রিয়াটি দেখতে পাবেন তা সাধারণত systemdনিজেই। এই জন্য, চালান systemctl daemon-reexec

    আপনার কাজ শেষ হয়ে গেলে, টেবিলটি দেখতে এমন হওয়া উচিত:

                 USER        PID ACCESS COMMAND
    /oldroot:    root     kernel mount /oldroot
    
  7. পুরানো রুট আনমাউন্ট করুন

    umount /oldroot
    

    এই মুহুর্তে, আপনার প্রয়োজন মতো ম্যানিপুলেশনগুলি পরিচালনা করতে পারেন। মূল প্রশ্নটির জন্য একটি সরল resize2fsপ্রার্থনা প্রয়োজন , তবে আপনি এখানে যা চান তা করতে পারেন; অন্য একটি ব্যবহারের ক্ষেত্রে মূল ফাইল সিস্টেমটি একটি সাধারণ পার্টিশন থেকে LVM / RAID / যা কিছুতেই স্থানান্তর করা হয়।

  8. মূলটিকে পিভট করুন

    mount <blockdev> /oldroot
    mount --make-rprivate / # again
    pivot_root /oldroot /oldroot/tmp/tmproot
    for i in dev proc sys run; do mount --move /tmp/tmproot/$i /$i; done
    

    এটি চতুর্থ ধাপের সরল বিপরীত।

  9. অস্থায়ী মূলের নিষ্পত্তি করুন

    5 এবং 6 ধাপ পুনরায় পুনরুদ্ধার করুন, /tmp/tmprootস্থানে ব্যবহার না করে /oldroot। তারপর:

    umount /tmp/tmproot
    rmdir /tmp/tmproot
    

    যেহেতু এটি একটি টিএমপিএফস, এই মুহুর্তে অস্থায়ী মূলটি ইথারের মধ্যে দ্রবীভূত হয়, আর কখনও দেখা যায় না।

  10. জিনিসগুলিকে তাদের জায়গায় ফিরিয়ে দিন

    আবার ফাইল সিস্টেমগুলি:

    mount -a
    

    এই মুহুর্তে, আপনার কাছে আপডেট করা উচিত /etc/fstabএবং grub.cfgকোন সমন্বয় অনুযায়ী সুযোগ ধাপ 7 সময় তৈরি।

    যে কোনও ব্যর্থ পরিষেবা পুনরায় চালু করুন:

    systemctl | grep failed
    systemctl restart <whatever>
    

    ভাগ করা সাবট্রিজগুলিকে আবার অনুমতি দিন:

    mount --make-rshared /
    

    বন্ধ হওয়া পরিষেবা ইউনিটগুলি শুরু করুন - আপনি এই একক কমান্ডটি ব্যবহার করতে পারেন:

    systemctl isolate default.target
    

এবং তুমি করে ফেলেছ.

অ্যান্ড্রু উডকে অনেক ধন্যবাদ, যারা এই বিএইচইএল 4 এ বিবর্তন করেছিলেন এবং স্টিভ, যিনি আমাকে পূর্বের লিঙ্কটি সরবরাহ করেছিলেন।


11
দুর্দান্ত উত্তর। প্রায় জাদুকরী, এবং খুব পরিষ্কার এবং সোজা। এটি কোনও সমস্যা ছাড়াই ডেবিয়ান ভিপিএসের সাথে ব্যবহার করুন ( umount /oldroot/bootof মঞ্চে সবেমাত্র অবশ্যই ছিল )। আমি আপনার উত্তরটি অন্য এসই প্রশ্নের সাথে সংযুক্ত করছি যার কোনও তিরস্কার বা নেতিবাচক উত্তর ছিল না।
vaab

3
এবং সমাধান হয়েছে, বিষয়টি @vaab এর ইঙ্গিত অনুসারে ছিল; আপনার অবশ্যই আপনার umount /oldroot/bootআগেumount /oldroot
টোবিরপ্লেসড

3
মূল বিষয়টি হ'ল কোনও শারীরিক কনসোলের প্রয়োজন ছাড়াই মূল ফাইল সিস্টেমটি আনমাউন্ট এবং পরিচালনা করতে হবে। আমি যতদূর জানি, সেই বিভাগটি আনমাউন্ট করার সময় কোনও সার্ভিস খোলা রাখার উপায় নেই যা একটি পার্টিশন থেকে পড়ে। যদি আপনার পরিষেবাটি রুট এফএসের স্পর্শ না করে তবে আপনি mount --moveএটি টিএমপিএফ ব্যবহার করে এটি উন্মুক্ত রাখতে পারবেন , তবে এটি অসমর্থিত।
টম হান্ট

2
আর ডিমনটি পুনরায় চালু করতে আপনার ওএস সুবিধাগুলি ব্যবহার করতে হবে। আমি কখনই আপস্টার্ট ব্যবহার করি নি, তবে উইকি.উবুন্টু / ফাউন্ডেশনটিয়াম / স্পেসস /… পরামর্শ দেয় যে telinit uআপনি যা চান তা করতে পারে।
টম হান্ট

3
আমি প্রবেশ করলাম একটি অতিরিক্ত কুঁচকে: / tmp আমার সিস্টেমে একটি /oldroot/tmpর‌্যামডিস্ক /oldroot, সুতরাং আমি একটি র‌্যামডিস্ক মাউন্ট দিয়ে শেষ করেছি , যা আমাকে আনমাউন্টিং থেকে বিরত করেছে , তবে প্রদর্শিত fuserবা lsofআউটপুট প্রদর্শন করে না । সিস্টেমে তাকিয়ে থাকার জন্য কিছুক্ষণ তাকিয়েছিল ...
ক্রিস কিচিং

7

আপনি যদি নিশ্চিত হন যে আপনি কী করছেন - সুতরাং এটি পরীক্ষা-নিরীক্ষা না করে আপনি ইআরআরডি তে নকশা করতে পারেন যা অ ইন্টারেক্টিভ এবং দ্রুত উপায়।

এখানে একটি ডেবিয়ান ভিত্তিক সিস্টেমে রয়েছে।

কোডটি দেখুন: https://github.com/szepeviktor/debian-server-tools/blob/master/debian-resizefs.sh

এর আরও একটি উদাহরণ রয়েছে: https://github.com/szepeviktor/debian-server-tools/blob/master/debian-convers-ext3-ext4.sh


উত্তর দেওয়ার সময় আপনার উত্তরটি হ'ল কেন তা সম্পর্কে কিছুটা ব্যাখ্যা দেওয়া ভাল ।
স্টিফেন রাউচ

1
এটি একটি দৃ approach় পদ্ধতির। ইন্টারঅ্যাকটিভভাবে প্রয়োজনীয় হেরফেরগুলি করার জন্য আমার পছন্দ; তবে এটি সম্ভবত দ্রুততর। উত্তরে নিজেই আরও কিছু বিবরণ সম্পাদনা করা ভাল হতে পারে, বা অন্যান্য প্ল্যাটফর্মগুলি বিবেচনা করা (মনে হচ্ছে এই সাধারণ পদ্ধতিটি এখনও ড্র্যাকট বা মকিনিটকপিও বা অন্য কোনও অস্পষ্টভাবে আধুনিক ইন্ট্রামফ জেনারেটরের সাথে কাজ করবে)।
টম হান্ট

দুঃখিত @ স্টিফেন-রাউচ আমি এই ধারণাটি কার্যকর করেই দেখিয়েছিলাম।
জাজেপ ভিক্টর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.