जब तक डिस्क भरा नहीं है तब तक `टार` को` dd` में बंद क्यों नहीं करता?


18

मेरे पास एक एकल डिस्क छवि का एक टार संग्रह है। इस टार फाइल के अंदर की इमेज लगभग 4GB की है। मैं पाइप के उत्पादन tar xfमें ddएक एसडी कार्ड के लिए डिस्क छवि लिखने के लिए। जब तक कार्ड भरा नहीं होता तब तक डिस्कंपंप कभी नहीं रुकता। यहाँ मेरा शेल सत्र है:

$ ls -l disk.img.tgz
-rw-r--r-- 1 confus confus 192M Okt  5 00:53

$ tar -tvf disk.img.tgz
-rw-r--r-- root/root 4294968320 2018-10-05 00:52 disk.img

$ lsblk -lb /dev/sdc
NAME MAJ:MIN RM        SIZE RO TYPE MOUNTPOINT
sdc    8:32   1 16022241280  0 disk

$ tar zxf disk.img.tgz -O | sudo dd status=progress conv=sync bs=1M of=/dev/sdc
[sudo] password for user: 
15992881152 bytes (16 GB, 15 GiB) copied, 212 s, 75,4 MB/s 
dd: error writing '/dev/sdc': No space left on device
0+15281 records in
15280+0 records out
16022241280 bytes (16 GB, 15 GiB) copied, 217,67 s, 73,6 MB/s

क्यों? हिट करने के बाद रुक जाना चाहिए 16GB कार्ट में 4GB की इमेज लिखी है और कभी भी स्पेस से बाहर न भागें!


क्या आपके पास इसे चलाने ddऔर इसे किसी अन्य फ़ाइल में लिखने का प्रयास करने के लिए डिस्क स्थान है ? tar zxf disk.img.tgz -O | dd status=progress conv=sync bs=1M of=/path/to/some/file/on/disk? यदि हां, तो क्या आपको मूल फ़ाइल की एक सटीक प्रतिलिपि मिलती है?
एंडी डाल्टन

2
आपके पास क्यों है conv=sync? क्या आप conv=fsyncशायद उपयोग करने का मतलब ?
राल्फ रौनकवादी

क्या आप निश्चित हैं कि फ़ाइल का सही आकार है? मुझे पता है कि gzip में केवल 32 बिट्स होती हैं जिसमें फाइल साइज को स्टोर करना होता है, इसलिए यह 4GB से अधिक की फाइलों का साइज गलत हो जाता है। मुझे यकीन नहीं है अगर टार एक समान सीमा है।
डेविड कॉनरेड

जवाबों:


50

यह इसलिए है क्योंकि आप इसे गलत कर रहे हैं।

आप उपयोग कर रहे हैं, bs=1Mलेकिन स्टड, पाइप से पढ़ना, छोटे रीड होंगे। वास्तव में, dd के अनुसार, आपको एक पूर्ण पढ़ने को नहीं मिला।

और फिर आपके पास conv=syncकौन सा पूरक अधूरा है जो शून्य से पढ़ता है।

0+15281 records in
15280+0 records out

dd0 पूर्ण और 15281 अधूरे पठन को प्राप्त किया, और 15280 पूर्ण खंड (conv = सिंक शून्य भरा) लिखा। इसलिए आउटपुट इनपुट की तुलना में बहुत बड़ा है, जब तक आपको कोई जगह नहीं मिलती है।

   sync   pad  every  input  block  with  NULs to ibs-size; when used with
          block or unblock, pad with spaces rather than NULs

इसे हल करने के लिए, आप हटा सकते हैं conv=syncऔर जोड़ सकते हैं iflag=fullblock


उदाहरण के लिए, विचार करें yes, जो डिफ़ॉल्ट रूप से अनंत "y \ ny \ ny \ n" से बाहर निकलता है।

$ yes
y
y
y
^C
$ yes | hexdump -C
00000000  79 0a 79 0a 79 0a 79 0a  79 0a 79 0a 79 0a 79 0a  |y.y.y.y.y.y.y.y.|
*

इसके साथ dd bs=1M conv=syncऐसा दिखता है:

$ yes | dd bs=1M conv=sync | hexdump -C
00000000  79 0a 79 0a 79 0a 79 0a  79 0a 79 0a 79 0a 79 0a  |y.y.y.y.y.y.y.y.|
*
0001e000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00100000  79 0a 79 0a 79 0a 79 0a  79 0a 79 0a 79 0a 79 0a  |y.y.y.y.y.y.y.y.|
*
00112000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*

तो यह "y \ ny \ ny \ n" (0x00000 - 0x1e000, 122880 बाइट्स) का एक अपूर्ण ब्लॉक हो जाता है, फिर शेष 1M को zeroes (0x01e000 - 0x100000, 925696 बाइट्स) के रूप में लिखता है। ज्यादातर मामलों में, आप ऐसा नहीं चाहते हैं। परिणाम किसी भी तरह से यादृच्छिक है क्योंकि आपके पास कोई वास्तविक नियंत्रण नहीं है कि प्रत्येक पढ़ा हुआ अधूरा कैसे होगा। यहाँ की तरह दूसरी रीड अब 122880 बाइट्स नहीं बल्कि 73728 बाइट्स है।

dd conv=syncशायद ही कभी उपयोगी होता है और यहां तक ​​कि उन मामलों में भी जब यह स्वागत योग्य होगा, जैसे कि जब आपको पढ़ने में त्रुटि मिलती है, तो चीजें इसके बारे में बहुत गलत हो जाएंगी।


इस मामले में, ddकमांड strace(लिनक्स को मानकर) चलाने से पता चलता है कि पाइप से प्रत्येक शॉर्ट रीड को 1 एमबी लिखने के बाद पूरा किया गया था।
एंड्रयू हेनले

2
@AndrewHenle को इसके लिए स्ट्रेस की भी ज़रूरत नहीं है, बस आउटपुट को देखना होगा। जोड़ा गया एक चित्र
ठंढकूट

इससे यह भी पता चलता है कि ddकमान मौलिक रूप से क्यों टूटी और अनुपयोगी है। यह व्यक्तिगत readएस और writeएस में संचालित करने के लिए निर्दिष्ट है , लेकिन उन कार्यों को ऐसे निर्दिष्ट किया जाता है कि वे हमेशा कम पढ़े या लिख ​​सकते हैं, और यह एक त्रुटि नहीं है। परिणामस्वरूप, ddअनिर्दिष्ट व्यवहार पर निर्भर करता है।
आर ..

बहुत शैक्षिक उत्तर के लिए धन्यवाद। जैसा कि किसी और ने सुझाव दिया कि मैं एक गधा था और कई विकल्पों को मिलाया dd, लेकिन इससे मुझे आपसे कुछ सीखने को मिला। मैं अभी भी पूरी तरह से निश्चित नहीं हूं कि क्या और कब ddसमाप्त होगा। मुझे लगता है, यह होगा, लेकिन क्योंकि यह वास्तव में 1 भाग वास्तविक डेटा और 9 भाग शून्य लिख रहा था, यह 40G लिखने के बाद बंद हो गया होगा। क्या वो सही है?
con-f-use

@R .., यह डिवाइस डिवाइस ड्राइवर्स के लिए बहुत उपयोगी है जो रीड और राइट के ब्लॉक साइज की देखभाल करता है। मुझे कुछ टेप ड्राइव का उपयोग करना याद है जो इसके बारे में परवाह करते हैं। हालांकि इस मामले में, यह स्पष्ट रूप से आवश्यक नहीं है, एक डिस्क पर सीधे रीडायरेक्ट कर सकता है (लाइव प्रगति रिपोर्ट प्राप्त नहीं कर रहा है, हालांकि)
ilkkachu
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.