Dd कभी-कभी डेटा के लिखे जाने तक प्रतीक्षा नहीं करता है?


20

कभी-कभी, जब मैं एक फ्लैश ड्राइव पर चित्र लिखता हूं, तो यह होता है:

$ sudo dd if=install57.fs of=/dev/sdc
573440+0 records in
573440+0 records out
293601280 bytes (294 MB) copied, 0.549231 s, 535 MB/s

मूल रूप से, लिनक्स सब कुछ कैश करता है, कुछ भी नहीं लिखता है, और ddबाहर निकलता है। टाइप करने के बाद sync, यह डेटा लिखना शुरू करता है (फ्लैश ड्राइव एलईडी ब्लिंकिंग शुरू होता है)।

ऐसा क्यों होता है?


3
क्या आप सुनिश्चित हैं कि /dev/sdcआपके सिस्टम पर एक वास्तविक डिवाइस है और आप किसी फ़ाइल पर नहीं लिख रहे हैं /dev/sdc? एक है ls --color /dev- /dev/sdcयह एक डिवाइस हो पीला होना चाहिए।
LawrenceC

जवाबों:


21

इसके बजाय इसका उपयोग करें:

sudo dd if=install57.fs of=/dev/sdc conv=fsync

यह fsync()हर write()सिस्टम कॉल के बाद कॉल करता है। यह ddकुछ भी कैश नहीं करने के लिए मजबूर करता है। Fsync के मैनपेज का यह हिस्सा देखें ( man 2 fsync):

fsync() transfers ("flushes") all modified in-core data of (i.e., modified buffer cache 
pages for) the file referred to by the file descriptor fd to the disk device (or other 
permanent storage device) where that file resides. The call blocks until the device reports 
that the transfer has completed. It also flushes metadata information associated with the 
file (see stat(2)).

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


1
मुझे पसंद है कि आपका जवाब और मेरा कवर लगभग पूरी तरह से अलग दृष्टिकोण है। अच्छा लगा, १।
क्रिस इंएमॉन्टनॉन

1
@ChrisInEdmonton dito +1
अराजकता

इस प्रश्न में सभी उत्तर अच्छे हैं।
फ्रांसिस्को तपिया

@chaos बस स्पष्ट करने के लिए: यह गुठली डिफ़ॉल्ट व्यवहार है। -क्या आपका मतलब है कि conv=fsyncऐसे उपकरणों को ब्लॉक करने के लिए लिखते समय डिफ़ॉल्ट है जो ddकुछ भी कैश नहीं करता है? इसके लिए एक अच्छे उत्तर की तलाश में: unix.stackexchange.com/questions/312687/…
जोनाथन

10

यह इसलिए होता है क्योंकि लिनक्स, और अधिकांश अन्य ऑपरेटिंग सिस्टम, कैश दोनों पढ़ते हैं और लिखते हैं। ज्यादातर मामलों में, यह आपके ऑपरेटिंग सिस्टम को अधिक उत्तरदायी बनाता है।

यदि आप सुनिश्चित करना चाहते हैं कि कैश्ड डेटा लिखा गया है, तो आप उपयोग करना चाहते हैं sync, जैसा कि आप जानते हैं। लिनक्स एक महत्वपूर्ण संख्या में सेटिंग्स को उजागर करता है जिसे आप ट्यून भी कर सकते हैं। यह लेख कुछ सेटिंग्स का एक अच्छा अवलोकन देता है। आप vm.dirty_background_bytes को 0 पर सेट कर सकते हैं, उदाहरण के लिए, फ़्लनर थ्रेड्स को कर्नेल को तुरंत बंद करना सुनिश्चित करने के लिए।


7

सिंक (8) - लिनक्स मैन पेज :

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

नोट: unmount(या बेदखल) स्वचालित रूप से कॉल करता है syncजो इसे सामान्य फाइलसिस्टम उपयोग में "छुपाता है"।

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