सबसे पहले, कुछ मिथकों को दूर करें।
यह परमाणु है इसलिए विसंगतियां नहीं हो सकती हैं
एक ही फाइल सिस्टम (यानी 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 सीमित गारंटी प्रदान करते हैं।
rename
जो परमाणु है, लेकिन btrfs विकि के अनुसार नहीं है (मेरा उत्तर देखें)। एक पत्रिका के बिना परमाणुता की गारंटी करना भी संभव है (मुझे लिनक्स पर उदाहरणों का पता नहीं है लेकिन कुछ हो सकता है)। क्या आपके पास ext2 के बारे में विश्वसनीय जानकारी है?