आप switch_root पर pivot_root का उपयोग कब करेंगे?


19

मैं nfs के बजाय ceph पर सिस्टम को नेटबूट करने के लिए लिनक्स इनिट प्रक्रिया को बेहतर ढंग से समझना चाहता हूं।

इस प्रक्रिया में मैं स्विचिंग रूट के दो रूपों में आया हूँ। एक को switch_root कहा जाता है, और दूसरे को pivot_root कहा जाता है। ये स्क्रिप्ट pxe बूट प्रक्रिया का उपयोग करके tftp के माध्यम से प्राप्त मेमोरी फाइल सिस्टम (initramfs) से चलाए जा रहे हैं।

आप एक दूसरे पर कब इस्तेमाल करेंगे? मैंने देखा है दोनों जड़ में रखा कुछ init स्क्रिप्ट का इस्तेमाल किया।

जवाबों:


16

मुझे यहां एक अद्भुत व्याख्या मिली । हालाँकि, मुझे उत्तर में जो कुछ समझ में आया उसे एक छोटे प्रारूप में रखने की कोशिश करता हूँ।

छोटा संस्करण

  1. जबकि सिस्टम बूट करता है, इसे शुरुआती उपयोगकर्ता स्थान की आवश्यकता होती है। यह initramfs या initrd का उपयोग करके प्राप्त किया जा सकता है।
  2. initrd को ramdisk में लोड किया गया है जो कि एक वास्तविक फ़ाइल सिस्टम है
  3. initramfs है नहीं एक फाइल सिस्टम
  4. के लिए initrd pivot_root इस्तेमाल किया जाता है और के लिए initramfs switch_root प्रयोग किया जाता है।

लंबा संस्करण

अब, मैंने जो कुछ ऊपर रखा था, उसके विस्तृत विवरण के लिए।

जबकि एक initramfs और एक initrd दोनों एक ही उद्देश्य से काम करते हैं, 2 अंतर हैं। सबसे स्पष्ट अंतर यह है कि एक initrd को एक रैमडिस्क में लोड किया गया है। इसमें एक वास्तविक फाइलसिस्टम (आमतौर पर ext2) होता है, जो रैमडिस्क में लगा होता है। दूसरी ओर, एक इनट्रामाफ़्स एक फाइलसिस्टम नहीं है। यह बस एक (संपीड़ित) cpio संग्रह (प्रकार newc) है जो एक tmpfs में अनपैक्ड है। यह एक initramfs को थोडा अधिक अनुकूलित और कर्नेल बूट प्रक्रिया में थोड़ी देर पहले लोड करने में सक्षम बनाने का एक साइड-इफ़ेक्ट है। इसके अलावा, स्मृति में initramfs का आकार छोटा होता है, क्योंकि कर्नेल tmpfs के आकार को वास्तव में लोड करने के लिए अनुकूलित कर सकता है, बजाय पूर्वनिर्धारित रैमडिस्क आकारों पर निर्भर होने के,

एक और साइड-इफ़ेक्ट अंतर भी है: रूट डिवाइस (और उस पर स्विच करना) कैसे संभाला जाता है। चूँकि एक initrd एक वास्तविक फाइल सिस्टम है जो रैम में अनपैक किया गया है, रूट डिवाइस को वास्तव में रैमडिस्क होना चाहिए। एक initramfs के लिए, एक कर्नेल "rootfs" होता है, जो कि titfs हो जाता है, जो initramfs को अनपैक कर दिया जाता है (यदि कर्नेल एक initramfs को लोड करता है; यदि नहीं, तो रूटफ़ बस रूट = कर्नेल बूट पैरामीटर के माध्यम से निर्दिष्ट फ़ाइलें हैं), लेकिन यह अंतरिम रूटफ़्स रूट = बूट पैरामीटर के रूप में निर्दिष्ट नहीं किया जाना चाहिए (और ऐसा करने का कोई तरीका नहीं होगा, क्योंकि इसमें कोई उपकरण संलग्न नहीं है)। इसका मतलब यह है कि आप अभी भी अपने असली रूट डिवाइस को कर्नेल में इनट्रामाफ़्स का उपयोग करते हुए पास कर सकते हैं। एक initrd के साथ, आपको यह प्रोसेस करना होगा कि असली रूट डिवाइस क्या है। इसके अलावा, "असली" के बाद से रूट डिवाइस initrd के साथ रैमडिस्क है, कर्नेल को वास्तव में रूट डिवाइस को एक वास्तविक डिवाइस (रैमडिस्क) से दूसरे (आपकी असली जड़) तक स्वाइप करना है। Initramfs के मामले में, initramfs स्थान (tmpfs) एक वास्तविक उपकरण नहीं है, इसलिए कर्नेल वास्तविक उपकरणों को स्विच नहीं करता है। इस प्रकार, जबकि कमांड pivot_root का उपयोग initrd के साथ किया जाता है, एक initramfs के लिए एक अलग कमांड का उपयोग किया जाता है। बिजीबॉक्स इसे पूरा करने के लिए switch_root प्रदान करता है, जबकि klibc new_root प्रदान करता है। एक initramfs के लिए एक अलग कमांड का उपयोग किया जाना है। बिजीबॉक्स इसे पूरा करने के लिए switch_root प्रदान करता है, जबकि klibc new_root प्रदान करता है। एक initramfs के लिए एक अलग कमांड का उपयोग किया जाना है। बिजीबॉक्स इसे पूरा करने के लिए switch_root प्रदान करता है, जबकि klibc new_root प्रदान करता है।


2
मैं pivot_rootinitramfs के लिए अतीत में उपयोग किया switch_rootथा, उस समय मौजूद नहीं था। switch_rootलगता है कि एक सुविधा विधि है pivot_rootजो कुछ और सफाई भी करता है /proc /sysऔर आगे बढ़ता है और /devआदि और न केवल जड़ ही
डैनियल एल्डर

2
आप initramfs रूटफुट पर pivot_root का उपयोग नहीं कर सकते, आपको अमान्य तर्क मिलेगा। आप केवल वास्तविक फाइल सिस्टम को पिवट कर सकते हैं।
TiCPU

@TiCPU तब लिनक्स जल्दी उपयोगकर्ता स्थान से कैसे बाहर निकलेगा?
मेला

प्रदान किया गया समाधान गलत प्रतीत होता है। लिनुस खुद कहते हैं कि pivot_root () या chroot () केवल वर्तमान प्रक्रियाओं के संदर्भ को बदल देगा /। इसलिए मेरी समझ से यह कोई भी रास्ता हो सकता है और इसका वास्तविक "डिस्क" से कोई लेना-देना नहीं है।
एरिकबवर्क

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