यदि फ़ाइल को स्थानांतरित करते समय फाइल सिस्टम असंगत हो सकता है?


13

मेरे पास एक ही विभाजन पर दो फ़ोल्डर हैं (EXT2) यदि मैं mv folder1/file folder2और कुछ रुकावट (जैसे बिजली की विफलता) होती है तो क्या फ़ाइल सिस्टम कभी असंगत हो सकता है?

क्या mvऑपरेशन परमाणु नहीं है?

अद्यतन: अभी तक आईआरसी पर मुझे निम्नलिखित दृष्टिकोण मिले:

  1. यह परमाणु है इसलिए विसंगतियां नहीं हो सकती हैं
  2. पहले आप नई dir में dir प्रविष्टि की प्रतिलिपि बनाते हैं और फिर पिछली dir पर प्रविष्टि को मिटा देते हैं, इसलिए आपके पास फ़ाइल को दो बार संदर्भित करने की असंगति हो सकती है, लेकिन Ref गिनती 1 है
  3. यह पहले पॉइंटर को मिटाता है और फिर पॉइंटर को कॉपी करता है इसलिए असंगतता यह है कि फाइल में संदर्भ 0 है

क्या कोई स्पष्ट कर सकता है?

जवाबों:


11

सबसे पहले, कुछ मिथकों को दूर करें।

यह परमाणु है इसलिए विसंगतियां नहीं हो सकती हैं

एक ही फाइल सिस्टम (यानी rename) सिस्टम कॉल के अंदर एक फाइल को ले जाना सॉफ्टवेयर पर्यावरण के संबंध में परमाणु है। एटोमैसी का मतलब है कि कोई भी प्रक्रिया जो फ़ाइल के लिए दिखती है, वह या तो इसे अपने पुराने स्थान पर देख लेगी या अपने नए स्थान पर; कोई भी प्रक्रिया यह नहीं देख पाएगी कि फ़ाइल की कोई अलग लिंक गणना है, या गंतव्य निर्देशिका में मौजूद होने के बाद फ़ाइल स्रोत निर्देशिका में मौजूद है, या यह कि स्रोत में अनुपस्थित होने के बाद फ़ाइल लक्ष्य निर्देशिका से अनुपस्थित है निर्देशिका।

हालाँकि, यदि सिस्टम बग, डिस्क त्रुटि या पावर लॉस के कारण क्रैश हो जाता है, तो इस बात की कोई गारंटी नहीं है कि फाइलसिस्टम सुसंगत स्थिति में बचा हुआ है, अकेले रहने दें कि यह चाल आधी-अधूरी नहीं रह गई है। लिनक्स सामान्य रूप से हार्डवेयर घटनाओं के संबंध में परमाणुता की गारंटी नहीं देता है।

पहले आप नई dir में dir प्रविष्टि की प्रतिलिपि बनाते हैं और फिर पिछली dir पर प्रविष्टि को मिटा देते हैं, इसलिए आपके पास फ़ाइल को दो बार संदर्भित करने की असंगति हो सकती है, लेकिन Ref गिनती 1 है

यह एक विशिष्ट कार्यान्वयन तकनीक को संदर्भित करता है। और भी हैं।

ऐसा होता है कि लिनक्स पर ext2 (कर्नेल 3.16 के रूप में) इस विशेष तकनीक का उपयोग करता है। हालाँकि, इसका मतलब यह नहीं है कि डिस्क सामग्री अनुक्रम [पुराने स्थान] → [दोनों स्थानों] → [नई जगह] से होकर गुजरती है, क्योंकि हार्डवेयर स्तर पर दो ऑपरेशन (नई प्रविष्टि, पुरानी प्रविष्टि को हटाएं) परमाणु नहीं हैं : उनमें से एक के लिए यह संभव है कि एक असंगत स्थिति में फाइल सिस्टम को छोड़कर। (उम्मीद है कि fsck इसे सुधार देगा।) इसके अलावा ब्लॉक लेयर फिर से लिख सकती है, इसलिए पहले हाफ को क्रैश से ठीक पहले डिस्क के लिए प्रतिबद्ध किया जा सकता है और दूसरा हाफ तब प्रदर्शन नहीं किया जाएगा।

संदर्भ गणना को कभी भी 1 से भिन्न नहीं माना जाएगा जब तक कि सिस्टम क्रैश नहीं करता (ऊपर देखें) लेकिन यह गारंटी सिस्टम क्रैश के लिए विस्तारित नहीं होती है।

यह पहले पॉइंटर को मिटाता है और फिर पॉइंटर को कॉपी करता है इसलिए असंगतता यह है कि फाइल में संदर्भ 0 है

एक बार फिर, यह एक विशेष कार्यान्वयन तकनीक को संदर्भित करता है। यदि सिस्टम क्रैश नहीं करता है, तो एक झूलने वाली फ़ाइल नहीं देखी जा सकती है, लेकिन यह कम से कम कुछ कॉन्फ़िगरेशन में सिस्टम क्रैश का एक संभावित परिणाम है।


अलेक्जेंडर लार्सन द्वारा एक ब्लॉग पोस्ट के अनुसार , ext2 सिस्टम क्रैश पर स्थिरता की कोई गारंटी नहीं देता है, लेकिन ext3 data=orderedमोड में करता है। (ध्यान दें कि यह ब्लॉग पोस्ट renameस्वयं के बारे में नहीं है, बल्कि किसी फ़ाइल पर लिखने और renameउस फ़ाइल पर कॉल करने के संयोजन के बारे में है ।)

Ext2, ext3 और ext4 फाइल सिस्टम के प्रमुख लेखक थियोडोर त्सो ने एक ही मुद्दे पर एक ब्लॉग पोस्ट लिखा । इस ब्लॉग पोस्ट में एटमॉसिटी (केवल सॉफ्टवेयर वातावरण के संबंध में) और स्थायित्व (जो क्रैश के संबंध में परमाणुता के साथ-साथ प्रतिबद्धता की गारंटी है, अर्थात यह जानते हुए कि ऑपरेशन किया गया है) पर चर्चा करता है। दुर्भाग्य से मैं अकेले दुर्घटनाओं के संबंध में परमाणु के बारे में जानकारी नहीं पा सकता हूं। हालांकि, ext4 के लिए दी गई स्थायित्व की गारंटी renameपरमाणु है। Ext4 के लिए कर्नेल प्रलेखन बताता है कि auto_da_allocविकल्प के साथ ext4 (जो आधुनिक कर्नेल में डिफ़ॉल्ट है), साथ ही ext4, writeइसके बाद के लिए एक स्थायित्व गारंटी प्रदान करता हैrename, जिसका अर्थ है कि renameहार्डवेयर क्रैश के संबंध में परमाणु है।

Btrfs के लिए, एक renameहै कि किसी मौजूदा फ़ाइल को अधिलेखित कर देता दुर्घटनाओं के संबंध में परमाणु होने की गारंटी है, लेकिन एक renameहै कि एक फ़ाइल अधिलेखित नहीं करता है न फ़ाइल या मौजूदा दोनों फ़ाइलों को हो सकती है।


सारांश में, आपके प्रश्न का उत्तर यह है कि न केवल ext2 पर क्रैश होने के संबंध में परमाणु के साथ एक फ़ाइल को स्थानांतरित नहीं किया जा रहा है, लेकिन यह फ़ाइल को एक सुसंगत स्थिति में छोड़ने की गारंटी भी नहीं है (हालांकि विफलताएं जो fsckदुर्लभ नहीं हैं) - बहुत ज्यादा कुछ भी नहीं है, यही वजह है कि बेहतर फाइल सिस्टम का आविष्कार किया गया है। Ext3, ext4 और btrfs सीमित गारंटी प्रदान करते हैं।


13

किसी भी फ़ाइल सिस्टम पर नाम बदलने की प्रक्रिया बहुत तेज़ है, इसलिए इसे बाधित होने की संभावना नहीं है, लेकिन शास्त्रीय फाइल सिस्टम पर यह निश्चित रूप से बाधित हो सकता है - यदि यह गंतव्य लिंक पहले बनाता है, तो यह एक फ़ाइल पर दो लिंक छोड़ सकता है - जो कानूनी है, लेकिन फ़ाइल को लगता है कि इसमें केवल एक ही है, जो बाद में हटाए जाने पर समस्या पैदा कर सकता है। दूसरी ओर, यदि यह पहले स्रोत लिंक को हटा देता है, तो फ़ाइल खो सकती है। रनिंग fsck आमतौर पर या तो स्थिति का पता लगाएगा और सही करेगा, हालांकि यदि फ़ाइल खो जाती है तो उसे वांछित स्थान के बजाय एक मनमाने नाम के साथ "खोए हुए + पाया" निर्देशिका में रखा जाएगा - और अगर इसमें दो लिंक हैं तो लिंक की गिनती बस होगी अद्यतन किया जाए, तो फ़ाइल दो स्थानों पर मौजूद होगी यदि फाइल सिस्टम इस का समर्थन करता है।

यदि आपको बिजली की विफलता के सामना करने के लिए एक फाइल सिस्टम की जरूरत है, तो आपको एक जर्नलिंग फाइल सिस्टम का उपयोग करना चाहिए , जैसे कि NTFS, EXT3, या XFS। अधिकांश आधुनिक प्रणालियां डिफ़ॉल्ट रूप से एक जर्नलिंग फाइलसिस्टम का उपयोग करेंगी, हालांकि आपको पता होना चाहिए कि एफएटी एक जर्नलिंग फाइलसिस्टम नहीं है यदि आप इसे बाहरी ड्राइव के लिए उपयोग करते हैं।

एक जर्नलिंग फाइलसिस्टम "डबल एंट्री" सिस्टम का उपयोग करता है - यह जर्नल फाइल को इस तथ्य को लिखता है कि यह इसे स्थानांतरित करने का इरादा रखता है, फिर इस कदम को करता है। जब स्टार्टअप पर फाइलसिस्टम की जाँच की जाती है, अगर इसे बाधित किया गया था, तो यह ध्यान देगा कि यह कदम पूरा नहीं हुआ था और इसे फिर से करें।

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


जब लोग नाम बदलने के ऑपरेशन के परमाणु होने की बात करते हैं, तो उनका मतलब है कि इसे सिस्टम पर किसी अन्य प्रक्रिया द्वारा मध्य-संक्रमण नहीं देखा जा सकता है, और इसे उदाहरण के mvसाथ कमांड को बाधित करते हुए आधा-पूरा नहीं छोड़ा जा सकता है ^C। प्रत्येक निर्देशिका के लिए लिखने की शारीरिक प्रक्रिया, जिसका भंडारण स्थान डिस्क पर व्यापक रूप से अलग-अलग स्थानों में हो सकता है, संभवतः हार्डवेयर स्तर पर वास्तव में परमाणु ऑपरेशन नहीं हो सकता है।


पूर्णता के लिए, मैं यह नोट करूंगा कि गंतव्य निर्देशिका में नई कड़ी बनाने और पुराने एक में इसे हटाने के अलावा कुछ आकस्मिक I / O संचालन भी हैं, जो संभवतः दोनों निर्देशिकाओं के माइम को अपडेट करते हुए संभवत: विस्तारित हो रहे हैं गंतव्य निर्देशिका का आबंटन आकार, ..लिंक को बदलना और अगर फ़ाइल निर्देशिका है तो मूल निर्देशिकाओं की लिंक मायने रखती है। इसके अलावा, मुझे यकीन नहीं है कि फ़ाइल का एटम स्वयं प्रभावित होता है।


एक पत्रिका एटमिटी राइट पावर विफलताओं की गारंटी नहीं देती है। मुझे लगता है कि ext3 और ext4 ऐसा गारंटी देते हैं renameजो परमाणु है, लेकिन btrfs विकि के अनुसार नहीं है (मेरा उत्तर देखें)। एक पत्रिका के बिना परमाणुता की गारंटी करना भी संभव है (मुझे लिनक्स पर उदाहरणों का पता नहीं है लेकिन कुछ हो सकता है)। क्या आपके पास ext2 के बारे में विश्वसनीय जानकारी है?
गिल्स एसओ- बुराई को रोकें '10

@ क्या आपको इस बारे में कोई जानकारी है कि बिना किसी पत्रिका के सैद्धांतिक रूप से इसकी गारंटी कैसे दी जा सकती है? मेरा मतलब है, बुनियादी स्तर पर, हम दो अलग-अलग फ़ाइलों को लिखने के लिए सिंक्रनाइज़ करने के बारे में बात कर रहे हैं, यह गारंटी देने के लिए कि आपको कभी भी परिणाम नहीं मिलता है कि उनमें से केवल एक ही प्रदर्शन किया गया था।
रैंडम 832

लॉग-संरचित फ़ाइल सिस्टम उपयोग में नहीं आने वाले ब्लॉक को अधिलेखित करके निरंतरता बनाए रखता है। यह फ्लैश मीडिया के लिए अच्छी तरह से अनुकूल है जहां मौजूदा डेटा को अधिलेखित करना महंगा है। लॉग वास्तव में एक पत्रिका की तरह नहीं है क्योंकि बढ़ते समय कुछ भी नहीं दोहराया जाता है - हालांकि आप कह सकते हैं कि संपूर्ण फाइलसिस्टम पत्रिका है (इसके अलावा कि बढ़ते हुए कभी भी पूरी चीज को स्मृति में फिर से शामिल नहीं करता है क्योंकि यह बहुत धीमा होगा)। विकिपीडिया में LogFS का वर्णन एक अच्छा अवलोकन है।
गाइल्स का SO- बुराई पर रोक '10

1

यह सवाल सुपर यूजर पर थोड़े अलग तरीके से पूछा गया है। mvकमांड पर विकिपीडिया पेज भी इसे अच्छी तरह से समझाता है :

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

लिनक्स का नाम बदलकर syscall है और इसलिए फ़ाइल को एक परमाणु के रूप में नामांकित किया जाएगा, अर्थात अबाधित, ऑपरेशन। तो नहीं, फ़ाइल सिस्टम आपके द्वारा वर्णित स्थिति में असंगत नहीं हो सकता है।


2
नाम एसईएस एक ओएस अमूर्त कॉल है? हार्डवेयर के बाद से, मैं हमेशा संचालन की एक श्रृंखला को बाधित करने में सक्षम हो सकता हूं, क्योंकि नाम बदलने की एक श्रृंखला होनी चाहिए
graphtheory92

नहीं, यह ओएस एब्स्ट्रैक्शन नहीं है, लेकिन मैंने सोचा कि "इसलिए कहा कि यह बहुत संभावना नहीं है कि फाइल सिस्टम असंगत हो जाएगा ..." चीजों को अत्यधिक जटिल बना देगा। हालांकि मैं आप से सहमत हूं।
बेंजामिन बी

2
इस उत्तर पत्ते मुझे सोच क्योंrename सिस्टम कॉल फाइल सिस्टम असंगत स्थिति एक बिजली की विफलता नहीं है, भले ही में किया जा रहा में परिणाम नहीं कर सकते हैं। मैंने महसूस किया कि यह @ graphtheory92 के प्रश्न का मूल था।
टान्नर स्वेट

1
@ graphtheory92: यदि सिस्टम कॉल परमाणु है, तो इसका मतलब यह बिल्कुल नहीं है कि परिणामस्वरूप डिस्क ऑपरेशन (या डिस्क संचालन की एक श्रृंखला!) भी परमाणु होगा। ------ मैं कल्पना कर सकता हूं कि किसी फ़ाइल को स्थानांतरित करके (हार्ड लिंक गिनती 1) और पावर, हार्ड डिस्क कनेक्शन को काटने या कर्नेल को सही समय पर क्रैश करने से आप दो हार्ड लिंक (मूल और नए एक के साथ समाप्त हो सकते हैं) ) हार्ड लिंक गिनती के साथ फाइल में अभी भी 1. ------ मुझे लगता है कि समस्या के दो मूल समाधान हैं: ए) सॉफ्टवेयर - एफएस जर्नलिंग जो स्वचालित रूप से असंगत राज्यों से पुनर्प्राप्त कर सकता है। b) HW समर्थित लेनदेन।
पाबौक

2
अन्य प्रक्रियाओं द्वारा अवलोकन के संबंध में आपके द्वारा निर्दिष्ट परमाणु की गारंटी है। सिस्टम क्रैश होने पर यह होल्ड नहीं होता है।
गिल्स एसओ- बुराई को रोकें '10
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.