تم إعداد ترجمة لهذه المقالة خصيصًا لطلاب دورة Linux Administrator .
نتعامل مع قدرة systemd على تشغيل الحاويات لاستعادة نظام الملفات الجذر للنظام التالف.
طالما توجد أنظمة GNU / Linux ، سيحتاج مسؤولو النظام إلى التعافي من التلف الذي لحق بنظام الملفات الجذر أو تغييرات التكوين غير المقصودة أو المواقف الأخرى التي تمنع النظام من التحميل إلى حالة "طبيعية".عادةً ما تقدم توزيعات Linux خيارًا واحدًا أو أكثر من خيارات القائمة في وقت التمهيد (على سبيل المثال ، في قائمة GRUB) التي يمكن استخدامها لإصلاح نظام تالف ؛ غالبًا ما يقومون بتمهيد النظام في وضع المستخدم المفرد مع إيقاف تشغيل معظم خدمات النظام. في أسوأ الحالات ، يمكن للمستخدم تغيير سطر أوامر kernel في أداة تحميل التشغيل لاستخدام shell القياسي كعملية init (PID 1). هذه الطريقة هي الأكثر تعقيدًا وحافلة بالصعوبات التي يمكن أن تؤدي إلى ضياع الوقت والإحباط ، بينما يحتاج النظام إلى استعادته.
الأهم من ذلك ، تفترض كل هذه الطرق أن النظام التالف يحتوي على نوع ما من وحدة التحكم المادية ، ولكن هذا لم يعد يمكن الاعتماد عليه في عصر الحوسبة السحابية. بدون وحدة تحكم فعلية ، لا يوجد سوى عدد قليل من الخيارات (إذا كانت لا تزال متوفرة) للتأثير على عملية التمهيد بهذه الطريقة. حتى الأجهزة المادية يمكن أن تتحول إلى أجهزة مدمجة صغيرة لا تحتوي على وحدة تحكم سهلة الاستخدام ، والعثور على الكبلات الصحيحة ومحولات المنافذ التسلسلية وإعداد المحاكي الطرفي ، وغالبًا ما يكون كل شيء لاستخدام وحدة التحكم على منفذ تسلسلي في حالات الطوارئ معقدًا تمامًا.
عندما يتوفر نظام آخر (من نفس البنية والتكوين المشابه بشكل عام) ، تتمثل الطريقة العامة لتبسيط عملية الاسترداد في إزالة أجهزة التخزين من النظام التالف وتوصيلها بنظام العمل كأجهزة ثانوية. في الأنظمة المادية ، يكون ذلك عادةً واضحًا ، ويمكن أن تدعم معظم منصات الحوسبة السحابية هذا أيضًا ، لأنها تتيح لك تحميل حجم الجذر للمثيل التالف في مثيل آخر.
بعد توصيل نظام الملفات الجذر بنظام آخر ، يتم حل مشكلة تلف نظام الملفات باستخدام
fsck وأدوات أخرى. يمكن أن يكون استكشاف أخطاء أخطاء التكوين أو الحزم التالفة أو مشكلات أخرى أكثر صعوبة لأنها تتطلب منك تحميل نظام الملفات والعثور على ملفات التكوين أو قواعد البيانات الصحيحة وتعديلها.
باستخدام systemd
قبل ظهور
systemd ، كانت طريقة إصلاح التكوينات في الممارسة العملية هي تحرير ملفات التكوين باستخدام محرر نصوص. العثور على الملفات الضرورية وفهم محتوياتها هي مهمة منفصلة تتجاوز نطاق هذه المقالة.
عندما يستخدم نظام GNU / Linux
systemd ، يتم إجراء العديد من تغييرات التكوين على أفضل وجه باستخدام الأدوات التي يوفرها - على سبيل المثال ، يتطلب تمكين أو تعطيل الخدمات إنشاء روابط رمزية أو حذفها في أماكن مختلفة.
تُستخدم أداة
systemctl لإجراء هذه التغييرات ، لكن استخدامها يتطلب أن يعمل مثيل
systemd والاستماع للطلبات (عبر D-Bus). عندما يتم تثبيت نظام الملفات الجذر كنظام ملفات إضافي على كمبيوتر آخر ، لا يمكن استخدام مثيل systemd صالح لإجراء هذه التغييرات.
التشغيل اليدوي للنظام systemd للنظام المستهدف غير عملي أيضًا ، لأنه مصمم كعملية PID 1 للتحكم في جميع العمليات الأخرى ، والتي قد تتعارض مع مثيل قيد التشغيل بالفعل في النظام المستخدم للتصحيح.
لحسن الحظ ، لدى
systemd القدرة على تشغيل الحاويات - أنظمة GNU / Linux المُغلفة بالكامل مع PID 1 والبيئة الخاصة بهم ، والتي تستخدم وظائف مختلفة في مساحة الاسم التي تقدمها kernel Linux. على عكس الأدوات مثل Docker و Rocket ، لا يتطلب
systemd صورة حاوية لتشغيل الحاوية ؛ يمكنه تشغيله بامتيازات الجذر في أي مكان في نظام الملفات الحالي. يتم ذلك باستخدام
أداة systemd-nspawn ، التي ستنشئ مساحات أسماء النظام الضرورية وتبدأ العملية الأولية في الحاوية ثم توفر وحدة التحكم. على عكس
chroot ، الذي يغير فقط الجذر المرئي لنظام الملفات ، سيكون لهذا النوع من الحاوية مساحة اسم نظام ملفات منفصلة ، وأنظمة ملفات مناسبة مثبتة في
/ dev ، و
/ run / / proc ، بالإضافة إلى مساحة اسم عملية منفصلة و IPC. تفضل بزيارة
مورد systemd-nspawn الرئيسي لمعرفة المزيد حول ميزاته.
مثال لشرح كيف يعمل هذا
في هذا المثال ، يتم توصيل جهاز تخزين يحتوي على نظام ملفات الجذر للنظام التالف بنظام تشغيل ، حيث يظهر كـ
/ dev / vdc . سيختلف اسم الجهاز حسب عدد أجهزة التخزين الحالية ونوع الجهاز والطريقة المستخدمة لتوصيله بالنظام. يمكن لنظام الملفات الجذر استخدام جهاز التخزين بأكمله أو الإقامة في قسم داخل الجهاز ؛ نظرًا لأن التكوين الأكثر شيوعًا (البسيط) يضع نظام الملفات الجذر في القسم الأول من الجهاز ، فسيتم استخدام
/ dev / vdc1 في هذا المثال.
تأكد من استبدال اسم الجهاز في الأوامر أدناه باسم الجهاز الصحيح لنظامك .
يمكن أن يكون نظام ملفات الجذر التالف أكثر تعقيدًا من نظام ملفات منفصل على الجهاز ؛ يمكن أن يكون وحدة تخزين في LVM أو على مجموعة من الأجهزة المدمجة في مجموعة RAID. في هذه الحالات ، يجب عليك إكمال الخطوات اللازمة لإنشاء وتفعيل جهاز منطقي يحتوي على نظام الملفات قبل أن يكون متاحًا للتركيب. مرة أخرى ، هذه الخطوات هي خارج نطاق هذه المقالة.
الاستعدادات اللازمة
أولاً ، تأكد من تثبيت أداة systemd-nspawn - معظم توزيعات جنو / لينكس لا تثبيتها افتراضيًا. يتم توفيرها بواسطة حزمة systemd-container في معظم التوزيعات ، لذلك استخدم مدير الحزمة لتوزيعك لتثبيتها. تم اختبار الإرشادات الواردة في هذا المثال باستخدام Debian 9 ، ولكن يجب أن تعمل بشكل مشابه على أي توزيع غنو / لينكس حديث.
من شبه المؤكد أن استخدام الأوامر أدناه سوف يتطلب امتيازات الجذر ، لذلك ستحتاج إما إلى تسجيل الدخول كجذر ، أو استخدام sudo للحصول على صدفة بامتيازات الجذر ، أو إضافة بادئة sudo إلى كل أمر.
فحص وتثبيت نظام الملفات
استخدم أولاً fsck للتحقق من هياكل ومحتويات نظام الملفات الهدف:
$ fsck /dev/vdc1
إذا وجد أي مشاكل في نظام الملفات ، فقم بالإجابة على الأسئلة وفقًا لإصلاحها. في حالة تلف نظام الملفات بشكل خطير ، لا يمكن إصلاحه ، وفي هذه الحالة سيكون عليك البحث عن طرق أخرى لاستخراج محتوياته.
قم الآن بإنشاء دليل مؤقت وقم بتنزيل نظام الملفات الهدف فيه:
$ mkdir /tmp/target-rescue $ mount /dev/vdc1 /tmp/target-rescue
عندما يتم تثبيت نظام الملفات ، قم بتشغيل الحاوية به كنظام ملفات الجذر:
$ systemd-nspawn --directory /tmp/target-rescue --boot -- --unit rescue.target
وسيطات سطر الأوامر لبدء الحاوية:
- --directory / tmp / target-rescue يوفر المسار لنظام ملفات جذر الحاوية.
- - يبحث التمهيد عن برنامج تهيئة مناسب في نظام الملفات الجذر للحاوية ويبدأ تشغيله ، ويمرر المعلمات إليه من سطر الأوامر. في هذا المثال ، يستخدم النظام الهدف أيضًا systemd كـ PID 1 للعملية ، وبالتالي فإن باقي المعلمات مخصصة لذلك. إذا كان النظام الهدف الذي تستعيده يستخدم أداة أخرى مثل المعرف الشخصي 1 للعملية ، فأنت بحاجة إلى تكوين الإعدادات وفقًا لذلك.
- - يفصل معلمات systemd-nspawn عن تلك المخصصة لمعرف PID 1 لعملية الحاوية.
- - unit rescue.target يخبر systemd في الحاوية اسم الهدف الذي يجب أن يحاول تحقيقه أثناء عملية التمهيد. لتبسيط عمليات الاسترداد على النظام المستهدف ، قم بتمهيدها في وضع "الاسترداد" ، بدلاً من وضع المستخدم العادي العادي.
إذا سارت الأمور على ما يرام ، فسترى مخرجات تبدو مثل هذا:
Spawning container target-rescue on /tmp/target-rescue. Press ^] three times within 1s to kill container. systemd 232 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN) Detected virtualization systemd-nspawn. Detected architecture arm. Welcome to Debian GNU/Linux 9 (Stretch)! Set hostname to <test>. Failed to install release agent, ignoring: No such file or directory [ OK ] Reached target Swap. [ OK ] Listening on Journal Socket (/dev/log). [ OK ] Started Dispatch Password Requests to Console Directory Watch. [ OK ] Reached target Encrypted Volumes. [ OK ] Created slice System Slice. Mounting POSIX Message Queue File System... [ OK ] Listening on Journal Socket. Starting Set the console keyboard layout... Starting Restore / save the current clock... Starting Journal Service... Starting Remount Root and Kernel File Systems... [ OK ] Mounted POSIX Message Queue File System. [ OK ] Started Journal Service. [ OK ] Started Remount Root and Kernel File Systems. Starting Flush Journal to Persistent Storage... [ OK ] Started Restore / save the current clock. [ OK ] Started Flush Journal to Persistent Storage. [ OK ] Started Set the console keyboard layout. [ OK ] Reached target Local File Systems (Pre). [ OK ] Reached target Local File Systems. Starting Create Volatile Files and Directories... [ OK ] Started Create Volatile Files and Directories. [ OK ] Reached target System Time Synchronized. Starting Update UTMP about System Boot/Shutdown... [ OK ] Started Update UTMP about System Boot/Shutdown. [ OK ] Reached target System Initialization. [ OK ] Started Rescue Shell. [ OK ] Reached target Rescue Mode. Starting Update UTMP about System Runlevel Changes... [ OK ] Started Update UTMP about System Runlevel Changes. You are in rescue mode. After logging in, type "journalctl -xb" to view system logs, "systemctl reboot" to reboot, "systemctl default" or ^D to boot into default mode. Give root password for maintenance (or press Control-D to continue):
في هذا الإخراج ، يمكنك رؤية بدء تشغيل
systemd كعملية أولية في الحاوية وتحديد أنه يتم تشغيله داخل الحاوية بحيث يمكنه ضبط سلوكه وفقًا لذلك. لإحضار الحاوية إلى حالة صالحة للعمل ، يتم تشغيل ملفات وحدة مختلفة ، ثم يتم طلب كلمة مرور الجذر للنظام الهدف. يمكنك إدخال كلمة مرور الجذر هنا إذا كنت تريد طلب قشرة بامتيازات الجذر ، أو يمكنك الضغط على
Ctrl + D لمتابعة عملية بدء التشغيل ، والتي ستعرض موجه تسجيل الدخول إلى وحدة التحكم المعتادة.
عند إجراء التغييرات اللازمة على النظام المستهدف ، اضغط على
Ctrl +] ثلاث مرات على التوالي ؛ سيؤدي هذا إلى إغلاق الحاوية وإعادتك إلى الغلاف الأصلي. من هناك ، يمكنك إجراء عملية التنظيف عن طريق إلغاء تثبيت نظام ملفات النظام الهدف وحذف الدليل المؤقت:
$ umount /tmp/target-rescue $ rmdir /tmp/target-rescue
هذا كل شئ! يمكنك الآن إزالة أجهزة التخزين في النظام المستهدف وإعادتها مرة أخرى.
جاءت فكرة استخدام
systemd-nspawn بهذه الطريقة ، خاصةً
الخيار -boot ، من
سؤال تم نشره على StackExchange. بفضل Shibumi و kirbyfan64sos على الإجابات المفيدة على هذا السؤال!المزيد من موارد لينكس