ডিডি বনাম বিড়াল - আজকাল ডিডি কি প্রাসঙ্গিক?


122

আমি সম্প্রতি উপলব্ধি করেছি যে আমরা catযতটা ব্যবহার করতে পারি ddএবং এটি আসলে তুলনায় দ্রুতdd

আমি জানি যে ddটেপগুলি মোকাবেলায় দরকারী ছিল যেখানে ব্লক আকারটি কেবল পারফরম্যান্সের সাথে নয়, যথার্থতার ক্ষেত্রেও গুরুত্বপূর্ণ ছিল। যদিও এই দিনগুলিতে এমন পরিস্থিতি রয়েছে যেখানে ddকিছু catকরতে পারে না? (এখানে আমি তুলনামূলকভাবে 20% পারফরম্যান্সের পার্থক্য বিবেচনা করব))

কংক্রিট উদাহরণ ভাল হবে!


1
একটি দৃ concrete় উদাহরণের জন্য এই তাই প্রশ্ন দেখুন ।
ক্যামে

উত্তর:


156

উপস্থিতিতে, ddএটি একটি আইবিএম অপারেটিং সিস্টেমের একটি সরঞ্জাম যা তার বিদেশী উপস্থিতি ধরে রাখে (এটির প্যারামিটারটি পাসিং), যা খুব কম ব্যবহার করা কিছু ফাংশন সম্পাদন করে (যেমন ইবিসিডিক থেকে এএসসিআইআই রূপান্তর বা এন্ডিয়ানসনেস রিভার্সাল ... আজকাল সাধারণ প্রয়োজন নয়)।

আমি ভাবতাম যে ddএকই ডিস্কে (বাফারিংয়ের আরও দক্ষ ব্যবহারের কারণে) বড় বড় ব্লকগুলি অনুলিপি করার জন্য এটি দ্রুত ছিল, তবে এটি সত্য নয় , কমপক্ষে আজকের লিনাক্স সিস্টেমে।

আমার মনে ddহয় টেপগুলির সাথে ডিল করার সময় কয়েকটি অপশন কার্যকর রয়েছে, যেখানে পাঠাগুলি সত্যিই ব্লকগুলিতে সঞ্চালিত হয় (ডিস্ক ড্রাইভাররা যেভাবে টেপ চালকরা স্টোরেজ মিডিয়ামে ব্লকগুলি আড়াল করে না)। তবে আমি সুনির্দিষ্ট জানি না।

একটি জিনিস এটি ddকরতে পারে যা অন্য কোনও পসিক্স সরঞ্জাম দ্বারা (সহজেই) করা যায় না কোনও স্ট্রিমের প্রথম এন বাইট গ্রহণ করছে । অনেক সিস্টেমের সাথে এটা করতে পারেন head -c 42, কিন্তু head -cযখন সাধারণ, POSIX নেই (এবং যেমন OpenBSD আজ পাওয়া যায় না)। ( tail -cএটি পসিক্স head -c) (বর্তমান জিএনইউ কোর্টিলগুলি সঠিক গণনাটি পড়ে head -cতবে ফ্রিবিএসডি এবং নেটবিএসডি স্টিডিও ব্যবহার করে))

আরো সাধারণভাবে, ddঅন্তর্নিহিত ফাইল API যা ইউনিক্স সরঞ্জাম মধ্যে অদ্বিতীয় একটি ইন্টারফেস দেয়: শুধুমাত্র ddকরতে ওভাররাইট বা অগ্রভাগ ছাঁটিয়া একটি ফাইল যেকোনো সময়ে বা চাইতে একটি ফাইলের মধ্যে। (এটির ddঅনন্য ক্ষমতা এবং এটি একটি বৃহত; ddঅন্য সরঞ্জামগুলি যে কাজগুলি করতে পারে তার জন্য অদ্ভুতভাবে যথেষ্ট পরিচিত))

  • বেশিরভাগ ইউনিক্স সরঞ্জামগুলি তাদের আউটপুট ফাইলটি ওভাররাইট করে, অর্থাৎ এর সামগ্রীগুলি মুছে ফেলে এবং এটি স্ক্র্যাচ থেকে শুরু করে। আপনি যখন >শেলটিতে পুনর্নির্দেশটি ব্যবহার করেন তখন এটিই ঘটে ।
  • আপনি >>শেলটিতে পুনর্নির্দেশ সহ বা এর সাথে কোনও ফাইলের বিষয়বস্তুগুলিতে সংযোজন করতে পারেন tee -a
  • আপনি যদি কোনও নির্দিষ্ট পয়েন্টের পরে সমস্ত ডেটা সরিয়ে কোনও ফাইলকে ছোট করতে চান truncateতবে এটি ফাংশনের মাধ্যমে অন্তর্নিহিত কার্নেল এবং সি এপিআই দ্বারা সমর্থিত তবে এগুলি ব্যতীতdd কোনও কমান্ড লাইন সরঞ্জাম দ্বারা উন্মুক্ত নয় :

    dd if=/dev/null of=/file/to/truncate seek=1 bs=123456  # truncate file to 123456 bytes
    
  • যদি আপনি কোনও ফাইলের মাঝখানে ডেটা ওভাররাইট করতে চান তবে আবার, আন্ডারলিং এপিআইতে ট্রানকাটিং ছাড়াই লেখার জন্য ফাইলটি খোলার মাধ্যমে (এবং lseekপ্রয়োজনে কাঙ্ক্ষিত অবস্থানে যাওয়ার আহ্বান জানিয়ে ) এটি সম্ভব, তবে কেবল ddফাইল ছাড়াই খুলতে পারবেন ছিন্ন বা সংযোজন, অথবা চাইতে শেল (থেকে আরো জটিল উদাহরণ )।

    # zero out the second kB block in the file (i.e. bytes 1024 to 2047)
    dd if=/dev/zero of=/path/to/file bs=1024 seek=1 count=1 conv=notrunc
    

সুতরাং… একটি সিস্টেম সরঞ্জাম হিসাবে, ddবেশ অনেকটা অকেজো। একটি পাঠ্য (বা বাইনারি ফাইল) প্রক্রিয়াকরণ সরঞ্জাম হিসাবে, এটি বেশ মূল্যবান!


গৃহীত হয়েছে কারণ আমি মনে করি এটি অন্যান্য উত্তরগুলির সংক্ষেপ ব্যাখ্যা করে ( truncএবং এর seekথেকে ব্যবহারযোগ্য dd) us
kizzx2

2
আরও একটি বিশেষ ব্যবহার: ddস্টিডিও বাফারিংয়ের কারণে অপঠিত ডেটা সম্ভাব্যরূপে ধ্বংস না করেই নন-সেকাইযোগ্য ফাইল বর্ণনাকারীর কাছ থেকে বাইনারি ডেটা পড়তে পারে। উদাহরণের জন্য এখানে দেখুন: etalabs.net/sh_tricks.html
আর .. 2

2
@ আর ..: হ্যাঁ জিএনইউ কোর্টিলস 6..১০ এ head -c Nকল করে readএবং কখনই এন ছাড়িয়ে যায় না নেটবিএসডি ৫.১-তে, head -cকল করে getc। ফ্রিবিএসডি 7.4 এ head -cকল করুন fread
গিলস

1
কোরিউটিলসও ddশেল স্ক্রিপ্টিংয়ের জন্য O_DIRECT (ইত্যাদি) প্রকাশ করে, যা আমার কাছেও অনন্য বলে মনে হয়।
ডার্বোবার্ট

1
কোরেটিলস truncateফাইলগুলি ছাঁটাই বা প্রসারিত করতে দেয়, ফলে এর অন্য ব্যবহার মুছে ফেলা হয় dd
ডিসকলেস

22

ddকমান্ড বিকল্প বিড়াল মিটমাট করতে সক্ষম নয় প্রচুর অন্তর্ভুক্ত করা হয়েছে। সম্ভবত আপনার ব্যবহারের ক্ষেত্রে বিড়াল একটি কার্যক্ষম বিকল্প, তবে এটি কোনও ডিডি প্রতিস্থাপন নয়।

একটি উদাহরণ ব্যবহার ddকরা হবে কোনও কিছু অংশ অনুলিপি করতে তবে পুরো জিনিসটি নয়। সম্ভবত আপনি কোনও আইসো চিত্রের মাঝামাঝি থেকে কিছু বিট বা ডিভাইসটির পরিচিত অবস্থানের ভিত্তিতে হার্ড ড্রাইভ থেকে পার্টিশন টেবিলটি বের করতে চান। সঙ্গে ddআপনি শুরু নির্দিষ্ট করতে পারেন থামান এবং পরিমাণের বিকল্পগুলি যে এই কর্মের অনুমতি।

ddসূক্ষ্ম দানযুক্ত ডেটা ম্যানিপুলেশনের জন্য এই অপশনগুলি অনিবার্য করে তোলে যেখানে cat* কেবলমাত্র পুরো ফাইল বস্তু, ডিভাইস বা স্ট্রিমগুলিতে কাজ করতে পারে।

* মন্তব্যগুলিতে গিলস দ্বারা উল্লিখিত হিসাবে, কোনও কিছুর catঅংশ বিচ্ছিন্ন করার জন্য অন্যান্য সরঞ্জামগুলির সাথে একত্রিত করা সম্ভব , তবে catএখনও পুরো বস্তুটিতে এটি পরিচালনা করে।


5
ddআসলে নিম্ন-স্তরের ডিভাইসগুলির সাথে কোনও সম্পর্ক নেই, এটি /devঅন্যদের মতো প্রবেশেরও প্রয়োজন needs আপনি একটি সম্পূর্ণ পার্টিশন cat, বা এর একটি অংশের সাথে অনুলিপি করতে পারেন tail +c $(($start+1)) | head -c $count
গিলস

16
অবশ্যই. ;-) এবং যখন আমি cat | head | tailশেষ কয়েকটি এমবি আনতে একটি 1.6TB ডিস্ক চিত্রটি খাওয়ান তখন ডিস্ক স্পিন আপ পৃথিবীর নিকটে চাঁদকে স্তন্যপান করবে।
কালেব

2
@ গিলস দুঃখিত, আমার স্বীকৃতি দেওয়ার অর্থ এই ছিল যে আমার "নিম্ন স্তরের" শব্দটি ব্যবহার খুব ভাল রচনা নয়, যদিও আমি ডিভাইসগুলিতে নয়, ডিভাইসগুলিতে ডেটা উল্লেখ করছি। "নিম্ন স্তরের ডেটা ম্যানিপুলেটিং" এর চেয়ে সম্ভবত "সূক্ষ্ম সুরযুক্ত ডেটা ম্যানিপুলেশন" ভাল।
কালেব

21

কেউ এখনও উল্লেখ করেন নি যে আপনি বিচ্ছিন্ন ফাইলগুলি তৈরি করতে ডিডি ব্যবহার করতে পারেন , যদিও truncateএকই উদ্দেশ্যে ব্যবহার করা যেতে পারে।

dd if=/dev/zero of=sparse-file bs=1 count=1 seek=10GB

এটি প্রায় তাত্ক্ষণিক এবং একটি স্বেচ্ছাসেবী বড় ফাইল তৈরি করে যা উদাহরণস্বরূপ লুপব্যাক ফাইল হিসাবে ব্যবহার করা যেতে পারে:

loop=`losetup --show -f sparse-file`
mkfs.ext4 $loop
mkdir myloop
mount $loop myloop

সুন্দর জিনিসটি এটি প্রাথমিকভাবে কেবলমাত্র ডিস্কস্পেসের একটি ব্লক ব্যবহার করে এবং তারপরে কেবল প্রয়োজন অনুসারে বৃদ্ধি পায় (10 জিবি ফাইলের এক্সট 4 ফর্ম্যাটিংটি আমার সিস্টেমে 291 এমবি খরচ করে)। ব্যবহার করুন du- দেখুন কত ডিস্ক স্থান আসলে ব্যবহার করা হয় lsপ্রতিবেদন কেবলমাত্র সর্বাধিক মাপ ফাইলে হত্তয়া পারে।


4
ls -lsআপনাকে বিরল আকার দেখায়।
jmtd

2
আপনার কমান্ড ফাইলটিতে একটি অকেজো বাইট লিখেছেন। dd of=sparse-file bs=1 count=0 seek=10Gসমান হবে truncate -s 10GB sparse-file। Confusingly যথেষ্ট, truncateএবং ddসঠিক বিপরীত ব্যাখ্যা আছে GBবনাম G...
frostschutz

5
@ ফ্রস্টসচুটজ man ddবলেছেন: MB =1000*1000, M =1024*1024এবং আরও অনেক কিছু। এবং man truncateবলে: MB 1000*1000, M 1024*1024সুতরাং কোনও পার্থক্য নেই। আমি উভয় ddএবং truncateজিএনইউ কোর্টিল ব্যবহার করি । আপনারও তাই করা উচিত! :-)
এরিক

@ এরিক: সংশোধন করার জন্য ধন্যবাদ। যদি এটি সম্প্রতি পরিবর্তন না করা হয় তবে আমি অবশ্যই এটি অন্য কোনও কিছুর সাথে বিভ্রান্ত করেছি।
frostschutz

10

কিছু দিয়ে হার্ড-ড্রাইভের নির্দিষ্ট বিভাগগুলিকে ওভাররাইড করা একটি সাধারণ উদাহরণ। উদাহরণস্বরূপ আপনি এই কমান্ডটি ব্যবহার করে আপনার এমবিআরটি মুছতে চান:

dd if=/dev/zero of=/dev/sda bs=446 count=1

এছাড়াও আপনি এটি দিয়ে খালি ফাইল তৈরি করতে পারেন (লুপ ডিস্ক চিত্রগুলির জন্য বলুন):

dd if=/dev/zero of=10mb.file bs=1024k count=10

একদিকে যেমন দ্বিতীয় কমান্ডটি 10MB ব্যবহার করা সবচেয়ে দ্রুততম উপায়
কেভিন এম

3
@ কেভিন: আরও দ্রুত head -c? একটি মাপদণ্ড শেয়ার করুন !
গিলস

9

ddহার্ড ড্রাইভ বা অন্যান্য স্টোরেজ ডিভাইস ( dd if=/dev/sda of=boot_sector.bin bs=512 count=1) এর বুট সেক্টর ব্যাক আপ করার জন্য এবং পরে এটি ( dd if=boot_sector.bin of=/dev/sda) পুনরায় লেখার জন্য খুব দরকারী । এটি এনক্রিপ্ট করা ভলিউমের শিরোনামগুলির ব্যাক আপ করার জন্য একইভাবে কার্যকর।

catএটি করতে মোড় পেতে সক্ষম হতে পারে তবে আমি এটি পুনর্লিখনের অংশে বিশ্বাস করব না। catনির্দিষ্ট পরিমাণ বাইট পড়তে / লিখতে অসুবিধা হয় ।


5

আমি সম্প্রতি আমার লিনাক্সিংয়ের ইতিহাসে প্রথমবারের মতো কয়েকটি মাল্টিপল -100-এর-জিবি পার্টিশন ক্লোন করার কারণ পেয়েছিলাম (সিএফ cp -arবা rsyncযা আমাকে বেশ কয়েকবার ভালভাবে পরিবেশন করেছে)। অবশ্যই আমি dd' অবশ্যই পরিণত হয়েছিলাম সবাই জানেন যে আপনি যা ব্যবহার করেন ... এবং অভিনয়টি দেখে হতবাক হয়ে গেলেন । শীঘ্রই কিছুটা গুগল আমাকে নিয়ে গেল ddrescue, যা আমি এখন কয়েকবার ব্যবহার করেছি এবং দুর্দান্তভাবে কাজ করি (ডিডির চেয়ে অনেক দ্রুত)।


1
ddrescueদুর্দান্ত, বিশেষত ব্যর্থ ডিস্কগুলির বাইরে ডেটা পাওয়ার জন্য।
ryenus

5

আমি কয়েক বছরের সাথে যুক্ত হয়েছি এমন কিছু ডিডি কৌশলগুলি এখানে রয়েছে ...

বন্ধুত্বপূর্ণ tty বা অ-ইন্টারেক্টিভ মোড ব্যাশে কাটা এবং আটকান

আপনি যদি EF / ^ D / ^ F সনাক্ত না করে এমন অবস্থায় থাকেন তবে আপনি কোনও হোস্টে টেক্সট ফাইলগুলি স্থানান্তর করতে ডিডি ব্যবহার করতে পারেন। যেহেতু এটি স্বয়ংক্রিয়ভাবে নির্দিষ্ট পরিমাণ বাইটের পরে পড়া বন্ধ করবে।

আমি এটি গত বছরের মতো সম্প্রতি একটি সুরক্ষা মহড়ার সময় ব্যবহার করেছি যেখানে আমরা একটি রিমোট হোস্টে নন-টিটি শেল পেতে সক্ষম হয়েছি এবং ফাইলগুলিতে স্থানান্তর করার প্রয়োজন ছিল।

বাস্তবে, এমনকি আমি বেস 64 কে এনকোড করে এবং একটি ধীর, তবে নির্ভরযোগ্য খাঁটি-ব্যাশ বেস 64 ডিকোডিং স্ক্রিপ্ট ব্যবহার করে কয়েক বাইনারি ফাইল করেছিলাম।

dd of=textfile.txt bs=1 count=<size_of_data_in_paste_buffer>

একটি দুর্দান্ত শীতল কৌশলটি হ'ল ডিডি চলার সময়, আপনি যদি এটি ইউএসআর 1 সিগন্যাল প্রেরণ করেন তবে এটি বর্তমান অবস্থা নির্গত করবে (প্রতি সেকেন্ডে বাইটস পড়বে, বাইটস পড়বে))

ইউনিভার্সাল থ্রুপুট স্থিতি ফিল্টার

আমি stdout মাধ্যমে ডেটা নির্গত যে কোনও প্রোগ্রামের জন্য খাঁটি বাশ অগ্রগতি ফিল্টার হিসাবে কাজ করার জন্য এটি লিখেছিলাম। (দ্রষ্টব্য: স্ট্যান্ডআউটের মাধ্যমে বেশ কিছু খুব সহজেই ডেটা নিঃসরণ করবে - এমন প্রোগ্রামগুলির জন্য যা তারা ফাইল নাম হিসাবে / dev / stdout ব্যবহার করে আপনার উপর বাধা না দেয় তবে আপনি প্রতারণা করতে পারেন But তবে ধারণাটি মূলত, প্রতিবার এক্স পাওয়ার সাথে সাথে বাইটের পরিমাণ, মুদ্রণের হ্যাশ চিহ্নগুলি (পুরানো স্কুল এফটিপির মতো যখন আপনি হ্যাশ মোড চালু করেছিলেন)

(দ্রষ্টব্য) অগ্রগতি ফাইল জিনিসটি খোঁড়া, এটি বেশিরভাগই ধারণার প্রমাণ ছিল। আমি যদি এটি পুনরায় redd করি তবে আমি কেবল একটি ভেরিয়েবল ব্যবহার করব।

 dd bs=$BLKSZ of=${TMPFILE} 2>&1 \
                | grep --line-buffered -E '[[:digit:]]* bytes' \
                | awk '{ print $1 }' >> ${PROGRESS} &

 while [[ $(pidof dd) -gt 1 ]]; do

        # PROTIP: You can sleep partial seconds
        sleep .5

        # Force dd to update us on it's progress (which gets
        # redirected to $PROGRESS file.    
        pkill -USR1 dd
        local BYTES_THIS_CYCLE=$(tail -1 $PROGRESS)
        local XFER_BLKS=$(((BYTES_THIS_CYCLE-BYTES_LAST_CYCLE)/BLKSZ))

        if [ $XFER_BLKS -gt 0 ]; then
                printf "#%0.s" $(seq 0 $XFER_BLKS)
                BYTES_LAST_CYCLE=$BYTES_THIS_CYCLE
        fi
done

অনামী শেল ফাইলহ্যান্ডলগুলি ব্যবহার করে স্লাইস এবং ডাইস ফাইল

আংশিক ফাইলের ডেটা সংরক্ষণ করার জন্য কোনও টিএমপি ফাইল ব্যবহার না করে - আপনি কীভাবে কোনও অজ্ঞাতনামা ফাইলহ্যান্ডেলের মাধ্যমে ট্যার ইনপুট সরবরাহ করে ত্রুটি ছাড়াই নিষ্ক্রিয় করতে পারেন এমন একটি স্বাক্ষরযুক্ত টার ফাইল থাকতে পারে তার একটি অত্যন্ত সিউডো কোড উদাহরণ।

generate_hash() {
    echo "yay!"
}

# Create a tar file, generate a hash, append it to the end
tar -cf log.tar /var/log/* 2>/dev/null
TARFILE_SIZE=$(stat -f "%z" log.tar)
SIGNATURE=$(generate_hash log.tar)
echo $SIGNATURE >>log.tar

# Then, later, extract without getting an error..

tar xvf <(dd if=$OLDPWD/log.tar bs=1 count=${TARFILE_SIZE})

Tl; dr হ'ল: আমি ডিডিটিকে অবিশ্বাস্যভাবে দরকারী বলে মনে করি। এবং এগুলি কেবলমাত্র তিনটি উদাহরণ যা আমি আমার মাথার উপরের অংশটিকে ভাবতে পারি।


4

আপনি কিছু আউটপুট সামগ্রী পুনর্নির্দেশ করতে পারেন। এটি বিশেষভাবে দরকারী, যদি আপনার সাথে এটি লেখার প্রয়োজন হয় sudo:

echo some_content | sudo dd status=none of=output.txt

এছাড়া sudoএটি সমতুল্য আছে:

echo some_content > output.txt

বা এটি:

echo some_content | sudo tee output.txt > /dev/null

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.