क्या केवल पढ़ने के लिए रूट फाइल सिस्टम एम्बेडेड सेटअप के लिए एक अच्छा विचार है?


15

मुझे एक एम्बेडेड डिवाइस पर ऑपरेटिंग सिस्टम के रूप में लिनक्स चलाने का काम सौंपा गया है।

टारगेट में x86 प्रोसेसर है और इसमें स्टोरेज के लिए 8 जीबी कॉम्पैक्टफ्लेश डिवाइस है।

मैं कर्नेल छवि और क्रॉस संकलन उपकरण बनाने के लिए बिल्डरोट का उपयोग करने में कामयाब रहा। मैंने CF डिवाइस को एक छोटे से FAT विभाजन में विभाजित किया है, जहां कर्नेल छवि के साथ-साथ syslinuxबूट कॉन्फ़िगरेशन और एक ext3फाइल सिस्टम रहता है, जहां मैंने बिल्डरूट द्वारा उत्पन्न रूट फाइल सिस्टम को विघटित कर दिया है।

सिस्टम syslinuxनिर्देशिका को सफलतापूर्वक उपयोग करके रूट डायरेक्टरी को CF ext3 विभाजन में सेट किया जाता है जहाँ मेरा बिल्डरोट फ़ाइल सिस्टम स्थित है।

मेरा प्रश्न तत्काल (और अक्सर) बिजली हानि के चेहरे पर मजबूती की आवश्यकता के आसपास केंद्रित है, क्योंकि यह डिवाइस के पावर आउटेज के बाद सफलतापूर्वक बूट करने के लिए महत्वपूर्ण है। मैंने पढ़ा है कि रूट फाइल सिस्टम को पढ़ना केवल डेटा अखंडता सुनिश्चित करने का एक तरीका है। क्या यह मेरे लिए आगे बढ़ने का एक समझदार तरीका है?

मैंने एक ही चीज़ को प्राप्त करने के लिए रैम में रूट फाइल सिस्टम को लोड करने की संभावना के बारे में भी पढ़ा है लेकिन अभी तक यह नहीं पता है कि ऐसा कैसे करना है।

क्या इस लक्ष्य को प्राप्त करने का एक पसंदीदा तरीका है और यदि हां तो मेरे लिए आगे बढ़ने का सबसे अच्छा तरीका क्या है?

जवाबों:


11

नया उत्तर (2015-03-22)

( नोट: यह उत्तर पिछले की तुलना में सरल है, लेकिन अधिक सुरक्षित नहीं है। मेरा पहला उत्तर अधिक मजबूत है क्योंकि आप अनुमति झंडे से पहले एफएस माउंट विकल्पों द्वारा केवल पठन- पाठन को रख सकते हैं । इसलिए बिना लिखने की अनुमति के एक फाइल लिखने के लिए बाध्य करने से काम नहीं चलेगा। बिल्कुल भी।)

हां, डेबियन के तहत एक पैकेज है: एफएसप्रोटेक्ट ( होमपेज )।

यह लाइव सत्र परिवर्तनों को अनुमति देने के लिए aufs(डिफ़ॉल्ट रूप से, लेकिन दूसरे unionfsटूल का उपयोग कर सकता है ) लेकिन डिफ़ॉल्ट रूप से रैम में, इसलिए रिबूट में सब कुछ भूल गया है।

आप उन्हें बस चलाकर स्थापित कर सकते हैं:

apt-get install fsprotect

एक बार किया, ऑनलाइन डॉक्टर से:

उसके बाद:

  • संपादित करें /boot/grub/menu.lstया /etc/default/grub2या /etc/lilo.conf" fsprotect=1G" कर्नेल मापदंडों में जोड़ें ।
  • आवश्यकतानुसार 1G संशोधित करें।
  • परिवर्तन लागू करें (यानी चलाएँ update-grub)
  • संपादित करें /etc/default/fsprotectयदि आप फाइलसिस्टम की रक्षा करना चाहते हैं तो इसके अलावा /
  • रिबूट

आप grub बूटलोडर की सुरक्षा करना चाहते हैं या उसमें कोई भी बदलाव करने से मना कर सकते हैं।

वहाँ से, अगर कुछ फ़ाइल को परिवर्तनों के विरुद्ध संरक्षित किया जाता है, तो नमूने के लिए

chmod ugo-w myfile

यदि आप नमूने के लिए उपयोग करते हैं vi myfileऔर कमांड के साथ उस पर लिखने की कोशिश करते हैं :w!, तो यह काम करेगा और आपका myfileपरिवर्तन हो गया। आप अनमोल प्राप्त करने के लिए रीबूट कर सकते हैं myfile

यह मेरे पहले समाधान के बाद भी संभव नहीं है:

पुराना (पहला) उत्तर:

हाँ, यह एक मजबूत समाधान है, लेकिन शक्तिशाली!

आर / ओ प्रयोज्य बनाना

आपको rw , जैसे /var, /etcऔर शायद में कुछ निर्देशिकाओं को माउंट करना होगा /home। यह aufs या Unionfs का उपयोग करके किया जा सकता है । मुझे यह पसंद है , एक और तरीका है , का उपयोग करना /dev/shmऔर mount --bind:

cp -a /var /dev/shm/
mount --bind /dev/shm/var /var

इससे पहले, आप उन सभी निर्देशिकाओं को स्थानांतरित कर सकते हैं, जिन्हें सामान्य ऑपरेशन में नहीं बदलना है static-var, सहानुभूति / संस्करण में बनाने की तुलना में:

mkdir /static-var
mkdir /static-var/cache
mkdir /static-var/lib
mv /var/lib/dpkg /static-var/lib/dpkg
ln -s /static-var/lib/dpkg /var/lib/dpkg
mv /var/cache/apt /static-var/cache/apt
ln -s /static-var/cache/apt /var/cache/apt
... # an so on

इसलिए जब आरओ में रिमाउंटिंग होती है, तो कॉपी करने /varमें /dev/shmबहुत ज्यादा जगह नहीं लगेगी क्योंकि ज्यादातर फाइलों को स्थानांतरित कर दिया जाता है /static-varऔर केवल सिम्लिंक को राम में कॉपी किया जाता है।

इस बारीक काम को करने का सबसे अच्छा तरीका है, एक पूर्ण शक्ति-चक्र बनाना, एक दिन का पूरा काम और बारी-बारी से एक कमांड चलाना जैसे:

find / -type f -o -type f -mtime -1

तो आप देखेंगे कि किन फाइलों को रीड-राइट विभाजन पर स्थित होना चाहिए।

लॉगिंग

जैसा कि इस होस्ट में कोई लेखन योग्य स्थिर मेमोरी मौजूद नहीं है, इतिहास और अन्य लॉग को संग्रहीत करने के लिए, आपको एक दूरस्थ syslogसर्वर को कॉन्फ़िगर करना होगा ।

echo >/etc/syslog.conf '*.* @mySyslogServer.localdomain'

इस तरह, यदि आपका सिस्टम किसी भी कारण से टूट जाता है, तो लॉग इन करने से पहले सब कुछ।

उन्नयन

जब कुछ mount --bindउपयोग में चल रहा हो , तो इस तरह के अपग्रेड को करने के लिए, जबकि सिस्टम उपयोग में है ( init 1डाउन-टाइम को कम करने के लिए, रनिंग की आवश्यकता को पूरा करें ), सरल तरीका यह है कि एक क्लीन रूट को फिर से बनाया जाए , जो अपग्रेड करने में सक्षम हो:

पठन-पाठन मोड में '/' को हटाने के बाद :

mount -o remount,rw /

for mpnt in /{,proc,sys,dev{,/pts}};do
    mount --bind $mnpt /$mnt$mpnt;
    done

chroot /mnt

apt-get update && apt-get dist-upgrade

exit

umount /mnt/{dev{/pts,},proc,sys,}

sync
mount -o remount,ro /

और अब:

shutdown -r now

आपके उत्तर के लिए धन्यवाद। मैं इसे पूरी तरह से नहीं समझता क्योंकि मेरे लिनक्स कौशल इस समय महान नहीं हैं। हालांकि यह अभी भी बहुत उपयोगी है और मुझे अनुसंधान के लिए कुछ और क्षेत्र देता है।
गणितज्ञ

उत्तर संपादित किया गया! नया समाधान और समझाया अलग!
एफ। होरी

यह सवाल का जवाब नहीं देता है, यह एक डेबियन आधारित प्रणाली के लिए एक महान जवाब है, लेकिन बिल्डरोट डेबियन आधारित नहीं है।
लवशा

@LovesTha पुराने (पहले) उत्तर पर एक नज़र है ! यह कम डेबियन आधारित है और यू किसी भी तरह के वितरण / स्थापना के लिए सिद्धांत और समान तंत्र को समझ सकता है। (भले ही अपग्रेडिंग सेक्शन में डेबियन कमांड दिखे, यू मैनुअल अपग्रेड या किसी अन्य डिस्टर्ब बेस्ड अपग्रेड के लिए भी ऐसा ही कर सकता था।)
एफ। होरी

आपका पुराना उत्तर केवल लिनक्स सिस्टम को पढ़ने के बारे में एक सामान्य प्रश्न का एक शानदार उत्तर होगा। एक बार जब मैंने अपने बिल्डरोट के रीड बनाने की अपनी खोज पूरी कर ली, तो मुझे उम्मीद है कि मैं वापस आऊंगा और यहां विशिष्ट प्रश्न पर एक शानदार विस्तृत जवाब दूंगा। बिल्डरोट में पहले से ही / var के अस्थायी बिट्स / tmp है जो एक अस्थायी है। / आदि कार्यक्रमों के लिए एक खरोंच स्थान के रूप में इस्तेमाल नहीं किया जाना चाहिए, इसलिए इसे विशेष रूप से नियंत्रित करने की आवश्यकता नहीं होनी चाहिए।
लवशा

3

मेरे पास केवल और हालिया बिल्डरोट (2014-02) का उपयोग करने का अनुभव है। उस संस्करण में आप कॉन्फ़िगर फ़ाइल में 'रिमाउंट रूट फाइलसिस्टम रीड-राइट डुइंग बूट' को अक्षम कर सकते हैं:

BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW सेट नहीं है

मैंने एक ऐसी छवि बनाने में कामयाबी हासिल की है जो सिर्फ इसके ext4 / विभाजन का उपयोग करती है क्योंकि केवल पढ़ने के लिए सिस्टम की शक्ति को अनप्लग करने से कोई नुकसान नहीं होता है। यह बहुत अच्छा काम करता है, इसलिए यदि आपको अपने फाइलसिस्टम को लिखने की आवश्यकता नहीं है, तो शायद ऊपर बताए गए की तुलना में यह कहीं अधिक सरल उपाय है (जो कि डेबियन प्रणाली के लिए अधिक या कम लागू होता है क्योंकि यह उपयुक्त-प्राप्त को संदर्भित करता है)।


उत्तर के लिए धन्यवाद - हालांकि अंत में मैंने डेटा स्थिरता के लिए CF ड्राइव पर सिंक विकल्प के साथ सिर्फ एक-दो निर्देशिकाओं को बढ़ते हुए एक इनट्रामाफ़्स सेटअप के लिए चुना। इसने समय के लिए मुझे बहुत अच्छी तरह से सेवा दी है।
गणितज्ञ

इसे जोड़ने के लिए: पुराने बिल्डरोट संस्करणों का उपयोग करते हुए, जांच करें /etc/inittabकि क्या /होता है। यदि हां, तो इसे अपनी आवश्यकताओं में बदलें।
अवनु

यह उत्तर इसे करने के लिए 'बिल्डरोट तरीका' का एक महत्वपूर्ण टुकड़ा है। अधिक जटिल प्रणालियों को काम करने के लिए स्वीकृत उत्तर में अधिकांश सलाह की आवश्यकता होगी। संभावना है कि सभी को करने की आवश्यकता होगी, कुछ अतिरिक्त सिम्बलिंक / tmp (tempfs) और सब कुछ काम करता है।
लवशा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.