दुर्भाग्य डेव जवाब गलत है:
(लिनक्स विशिष्ट बनाम पोर्टेबल व्यवहार अतिरिक्त जानकारी पुनः के साथ अद्यतन)।
सभी POSIX सिस्टम में टिकाऊ संग्रहण भी नहीं हो सकता है। और यदि वे करते हैं, तो सिस्टम सिस्टम दुर्घटना के बाद भी इसे "अनुमति" होनी चाहिए। उन प्रणालियों के लिए एक नो-ऑप fsync() समझ में आता है, और ऐसे fsync() को POSIX के तहत स्पष्ट रूप से अनुमति दी जाती है। पुरानी निर्देशिका, नई निर्देशिका, दोनों, या किसी अन्य स्थान में फ़ाइल को पुनर्प्राप्त करने योग्य भी कानूनी है। POSIX सिस्टम क्रैश या फ़ाइल सिस्टम रिकवरी के लिए कोई गारंटी नहीं देता है।
असली सवाल किया जाना चाहिए:
सिस्टम जो POSIX एपीआई के माध्यम से समर्थन करने वाले पर एक टिकाऊ नाम बदलने कैसे करना है?
आप एक fsync() दोनों पर क्या करने की जरूरत है, स्रोत और गंतव्य निर्देशिका, क्योंकि कम से कम उन fsync() रों क्या करना चाहिए रहे हैं जारी रहती है स्रोत या गंतव्य निर्देशिका की तरह दिखना चाहिए कैसे है।
क्या एक fsync (destdirfd) भी स्रोत निर्देशिका fsync अंतर्निहित है? सामान्य रूप में
- POSIX: नहीं, कुछ भी नहीं मतलब है कि
- ext3/4: मुझे यकीन है कि अगर दोनों परिवर्तन स्रोत के लिए और गंतव्य निर्देशिका पत्रिका में एक ही लेन-देन में समाप्त नहीं कर रहा हूँ। यदि वे करते हैं, तो वे दोनों एक साथ प्रतिबद्ध हो जाते हैं।
या मैं दोनों निर्देशिका में एक शक्ति चक्र ("गिरावट") के बाद दिखा फ़ाइल है, यानी यह एक durably परमाणु कदम आपरेशन की गारंटी करने के असंभव है के साथ खत्म हो सकता है?
- सामान्य में POSIX: कितना fsync() आप न्यूनतम जरूरत पर निर्भर करता है: कोई गारंटी है, लेकिन आप fsync करने के लिए() दोनों निर्देशिका है, जो परमाणु-टिकाऊ नहीं हो सकता है
- ext3/4 चाहिए रहे हैं माउंट विकल्प। जैसे अगर "dirsync" के साथ घुड़सवार है तो आपको उन दो fsync() एस में से किसी की आवश्यकता नहीं है। सबसे अधिक आपको fsync() एस दोनों की आवश्यकता है, लेकिन मुझे यकीन है कि एक पर्याप्त है (परमाणु-टिकाऊ)।
यदि मैं गंतव्य निर्देशिका के बजाय स्रोत निर्देशिका fsync करता हूं, तो क्या यह गंतव्य निर्देशिका को पूरी तरह से fsync करेगा?
- POSIX: कोई
- ext3/4: मैं वास्तव में दोनों एक ही लेन-देन में समाप्त विश्वास करते हैं, तो यह कोई फर्क नहीं पड़ता उनमें से जो आप fsync()
- पुराने कर्नेल ext3: (यदि वे एक ही लेनदेन में नहीं हैं) कुछ गैर-इष्टतम कार्यान्वयन ने fsync() पर बहुत अधिक समन्वय किया है, मुझे यकीन है कि यह पहले से आए प्रत्येक लेनदेन को प्रतिबद्ध करता है। और हां, एक सामान्य कार्यान्वयन पहले इसे गंतव्य से लिंक करेगा और फिर इसे स्रोत से हटा देगा। तो fsync (srcdirfd) गंतव्य के fsync() को भी ट्रिगर करेगा।
- ext4/नवीनतम ext3: अगर वे एक ही लेन-देन में नहीं हैं, तो आप पूरी तरह से उन्हें स्वतंत्र रूप से सिंक करने के लिए (ताकि दोनों)
वहाँ किसी भी उपयोगी संबंधित परीक्षण/डिबगिंग/शिक्षा टूल हैं सक्षम हो सकता है (गलती इंजेक्टर, आत्मनिरीक्षण उपकरण, नकली फाइल सिस्टम, आदि)?
वास्तविक क्रैश के लिए, नहीं। वैसे, एक असली दुर्घटना कर्नेल के दृष्टिकोण से परे चला जाता है। हार्डवेयर फाइल सिस्टम को दूषित कर सकता है (और सबकुछ लिखने में असफल) लिख सकता है। Ext4 इसके खिलाफ बेहतर तैयार है, क्योंकि यह डिफ़ॉल्ट रूप से लेखन बैरी (माउंट विकल्प) सक्षम करता है (ext3 नहीं करता है) और जर्नल चेकसम (एक माउंट विकल्प भी) के साथ भ्रष्टाचार का पता लगा सकता है।
और सीखने के लिए: पता लगाएं कि दोनों परिवर्तन जर्नल में किसी तरह से जुड़े हुए हैं या नहीं! :- पी
यहां तर्क बहुत गलत है। - नाम के "परमाणु" (उदाहरण के लिए, "न्यूपैथ" को संदर्भित करता है, जिसके अंतर्गत पुरानी फ़ाइल (यदि कोई थी) या नामित फ़ाइल होनी चाहिए, जिसमें कोई भी स्थिति नहीं है (जैसा कि अन्य प्रक्रियाओं द्वारा देखा गया है) । –
रॉबर्ट ने इसे इंगित किया, नाम बदलने के लिए नया इनोड असाइन करने के संबंध में नाम "परमाणु" है, चाहे नया इनोड पॉइंटिक्स द्वारा परिभाषित किया गया हो या नहीं। – ArekBulski