कमांड dd में 'तलाश' तर्क


20

क्या कोई मुझे समझा सकता है कि निम्नलिखित पंक्तियों में क्या हो रहा है?

dd if=/dev/urandom bs=4096 seek=7 count=2 of=file_with_holes

विशेष रूप से भाग स्पष्ट नहीं है

मैन पेज कहते हैं:

 seek=BLOCKS
              skip BLOCKS obs-sized blocks at start of output

अवलोकन-आकार ब्लॉक क्या है?

जवाबों:


22

ddएक इनपुट फ़ाइल से आउटपुट फ़ाइल में डेटा के ब्लॉक कॉपी करने के लिए डिज़ाइन किया गया है । ddब्लॉक आकार के विकल्प के रूप में इस से, कर रहे हैं आदमी पेज :

ibs=expr
    Specify the input block size, in bytes, by expr (default is 512).
obs=expr
    Specify the output block size, in bytes, by expr (default is 512).
bs=expr
    Set both input and output block sizes to expr bytes, superseding ibs= and obs=.

dd seekविकल्प यूनिक्स के समान है lseek()सिस्टम कॉल 1 । यह फ़ाइल के भीतर रीड / राइट पॉइंटर को मूव करता है। से आदमी पेज :

seek=n
    Skip n blocks (using the specified output block size) from the beginning of the output file before copying. 

UNIX में साधारण फ़ाइलों में सुविधाजनक संपत्ति होती है जिसे आपको शुरुआत में पढ़ना या लिखना नहीं होता है; आप कहीं भी तलाश कर सकते हैं और पढ़ना या लिखना शुरू कर सकते हैं। तो bs=4096 seek=7आउटपुट फाइल की शुरुआत से 7 * 4096 बाइट्स की स्थिति में जाने का मतलब है और वहां से लिखना शुरू करें। यह 0 और 7 * 4096 बाइट्स के बीच फ़ाइल के भाग को नहीं लिखेगा।

साधारण फ़ाइलों के क्षेत्र जो कभी भी नहीं लिखे जाते हैं उन्हें अंतर्निहित फाइल सिस्टम द्वारा आवंटित नहीं किया जाता है। इन क्षेत्रों को छेद कहा जाता है और फाइलों को विरल फाइलें कहा जाता है । आपके उदाहरण में, file_with_holesशुरुआत में 7 * 4096-बाइट छेद होगा। (h / t @frostschutz यह इंगित करने के लिए कि ddडिफ़ॉल्ट रूप से आउटपुट फ़ाइल को काट देता है।)

इन असिंचित क्षेत्रों को पढ़ना ठीक है; आपको जीरो का एक गुच्छा मिलता है।

[1] जब ddलिखा गया था, तो अनुरूप प्रणाली कॉल थी seek()


दिलचस्प है, मेरा आदमी पेज इस पर गुस्सा कर रहा है - `bs = BYTES एक बार में BYTES बाइट्स तक पढ़े और लिखें '
ग्रीम

मैंने UNIX पर "तलाश" नहीं देखी है, हो सकता है कि "लसेक" मुझे लगता है।
1

1
बस ध्यान देने के लिए, मैं एक ड्राइव डिवाइस ( dd if=/dev/zero bs=512 count=2 seek=8388607998 of=/dev/sddएक्सैम्पल:) लेने की कोशिश कर रहा था , लेकिन वे 'फाइलें' / डिस्क्रिप्टर खोजने योग्य नहीं हैं:dd: /dev/sdd: cannot seek: Invalid argument 0+0 records in 0+0 records out 0 bytes copied, 0.00765396 s, 0.0 kB/s
पिसिस

1
@Pysis डिस्क डिवाइस आमतौर पर खोजी हैं, लेकिन हो सकता है कि कुछ मुद्दे बहुत बड़े उपकरणों के साथ हों। (बाइट्स में) आपका / देव / sdd कितना बड़ा है?
मार्क प्लॉटनिक

1
शायद मेरे पास पहले है और याद नहीं कर सकता। मैं 4TB डिस्क के अंत में बैकअप GPT सेक्टर या 2 को एक्सेस करने की कोशिश कर रहा हूं।
पिसिस

6

अन्य जवाबों ने इसे पहले ही समझाया, लेकिन अगर आपको कोई संदेह है, तो आप देख सकते हैं कि क्या ddहोता है strace

$ strace dd if=/dev/urandom bs=4096 seek=7 count=2 of=file_with_holes
# output is shortened considerably
open("/dev/urandom", O_RDONLY)          = 0
open("file_with_holes", O_RDWR|O_CREAT, 0666) = 1
ftruncate(1, 28672)                     = 0
lseek(1, 28672, SEEK_CUR)               = 28672
read(0, "\244\212\222v\25\342\346\226\237\211\23\252\303\360\201\346@\351\6c.HF$Umt\362;E\233\261"..., 4096) = 4096
write(1, "\244\212\222v\25\342\346\226\237\211\23\252\303\360\201\346@\351\6c.HF$Umt\362;E\233\261"..., 4096) = 4096
read(0, "~\212q\224\256\241\277\344V\204\204h\312\25pw9\34\270WM\267\274~\236\313|{\v\6i\22"..., 4096) = 4096
write(1, "~\212q\224\256\241\277\344V\204\204h\312\25pw9\34\270WM\267\274~\236\313|{\v\6i\22"..., 4096) = 4096
close(0)                                = 0
close(1)                                = 0
write(2, "2+0 records in\n2+0 records out\n", 312+0 records in
2+0 records out
) = 31
write(2, "8192 bytes (8.2 kB) copied", 268192 bytes (8.2 kB) copied) = 26
write(2, ", 0.00104527 s, 7.8 MB/s\n", 25, 0.00104527 s, 7.8 MB/s
) = 25
+++ exited with 0 +++

यह /dev/urandomपढ़ने ( if=/dev/urandom) के file_with_holesलिए खुलता है , बनाने / लिखने के लिए खुलता है ( of=file_with_holes)।

फिर यह = बाइट्स ( ) file_with_holesको काट देता है । ट्रंकट का अर्थ है कि उस स्थिति के खो जाने के बाद फ़ाइल सामग्री। ( इस कदम से बचने के लिए जोड़ें )। फिर यह बाइट्स करना चाहता है ।4096*728672bs=4096 seek=7conv=notrunc28672

फिर यह 4096बाइट्स ( bs=4096जैसा कि इस्तेमाल किया जाता है ibs) से /dev/urandom, 4096बाइट्स ( bs=4096जैसा कि obs) लिखता है file_with_holes, उसके बाद एक और रीड और राइट ( count=2) लिखता है ।

फिर यह बंद हो जाता है /dev/urandom, बंद हो जाता है file_with_holes, और प्रिंट करता है कि यह कॉपी 2*4096= 8192बाइट्स। अंत में यह त्रुटि के बिना बाहर निकलता है (0)।


5

obsआउटपुट ब्लॉक आकार है और ibsइनपुट ब्लॉक आकार है। यदि आप इसके bsबिना निर्दिष्ट करते हैं ibsया obsइसका उपयोग दोनों के लिए किया जाता है।

तो आपकी तलाश 4096 या 28672 बाइट्स के 7 ब्लॉक आपके आउटपुट की शुरुआत में होगी। फिर आप आउटपुट में इस बिंदु पर इनपुट की शुरुआत से 4096 या 8192 बाइट्स के 2 ब्लॉक कॉपी करेंगे।


1

सीक आउटपुट फ़ाइल को "फुलाएगा"। सीक = 7 का अर्थ है कि आउटपुट फ़ाइल की शुरुआत में, आउटपुट ब्लॉक आकार के साथ 7 "खाली" ब्लॉक = अवलोकन = 4096bytes डाला जाएगा। यह बहुत बड़ी फ़ाइलों को जल्दी से बनाने का एक तरीका है।


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