কমান্ড ডিডিতে 'সন্ধান' যুক্তি


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

Obs আকারের ব্লক কি?

উত্তর:


22

ddএকটি ইনপুট ফাইল থেকে কোনও আউটপুট ফাইলে ডেটা ব্লকগুলি অনুলিপি করার জন্য ডিজাইন করা হয়েছে । ddব্লক আকারের বিকল্পগুলি নিম্নরূপ থেকে হয় man পৃষ্ঠা :

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 । এটি ফাইলের মধ্যে পঠন / পাঠানোর পয়েন্টারটি সরিয়ে দেয়। থেকে man পৃষ্ঠা :

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

ইউএনআইএক্স-এ সাধারণ ফাইলগুলির কাছে সুবিধাজনক সম্পত্তি থাকে যা আপনাকে শুরুতে পড়তে বা লিখতে হবে না; আপনি যে কোনও জায়গায় সন্ধান করতে এবং সেখান থেকে শুরু করে পড়তে বা লিখতে পারেন। সুতরাং bs=4096 seek=7আউটপুট ফাইলের শুরু থেকে একটি অবস্থান 7 * 4096 বাইটে চলে যাওয়া এবং সেখান থেকে লেখা শুরু করা। এটি ফাইলের যে অংশটি 0 থেকে 7 * 4096 বাইটের মধ্যে রয়েছে তা লিখবে না।

কখনও কখনও লিখিত হয় না এমন সাধারণ ফাইলগুলির ক্ষেত্রগুলি এমনকি অন্তর্নিহিত ফাইল সিস্টেম দ্বারা বরাদ্দ করা হয় না। এই অঞ্চলগুলিকে গর্ত বলা হয় এবং ফাইলগুলিকে স্পার্স ফাইল বলা হয় । আপনার উদাহরণে, file_with_holesশুরুতে একটি 7 * 4096-বাইট গর্ত থাকবে। (h / t @frostschutz নির্দেশ করার জন্য যে ddডিফল্টরূপে আউটপুট ফাইলকে ছিন্ন করে))

এই অবিকৃত অঞ্চলগুলি পড়া ঠিক আছে; আপনি একটি গুচ্ছ জিরো পেতে।

[1] ফিরে যখন ddলেখা হয়েছিল, অ্যানালগাস সিস্টেম কল ছিল seek()


আকর্ষণীয়, আমার মানুষ পৃষ্ঠা annoyingly এই unforthcoming হয় - 'BS = বাইট পঠন এবং লিখুন আপ BYTES একটি time` এ বাইট
গ্রায়েম

আমি ইউনিক্সে "সন্ধান" করতে দেখিনি, সম্ভবত "lseek" আমার ধারণা।
কঙ্গিয়ার

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
@ পিসিস ডিস্ক ডিভাইসগুলি সাধারণত সন্ধানযোগ্য হয় তবে খুব বড় ডিভাইসগুলির সাথে কিছু সমস্যা রয়েছে। আপনার / ডেভ / এসডিডি কত বড় (বাইটে)?
মার্ক প্লটনিক

1
হয়তো আমার আগে আছে এবং মনে করতে পারি না। আমি 4TB ডিস্কের শেষে জিপিটি সেক্টর বা 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এবং মুদ্রণ করে । অবশেষে এটি ত্রুটি ছাড়াই প্রস্থান করে (0)।2*40968192


5

obsআউটপুট ব্লক আকার এবং ibsইনপুট ব্লক আকার। যদি আপনি উল্লেখ bsনা করে থাকেন ibsবা এটি obsউভয়ের জন্যই ব্যবহৃত হয়।

সুতরাং আপনার সন্ধানটি আপনার আউটপুটটির শুরুতে 4096 বা 28672 বাইটের 7 টি ব্লক হবে। তারপরে আপনি 4096 বা 8192 বাইটের 2 টি ব্লক আউটপুটটিতে এই পয়েন্টে ইনপুট শুরু থেকে অনুলিপি করবেন।


1

অনুসন্ধান কেবল আউটপুট ফাইলটিকে "স্ফীত" করবে। সিক = 7 এর অর্থ আউটপুট ফাইলের শুরুতে আউটপুট ব্লকের আকার = obs = 4096bytes সহ 7 "খালি" ব্লক inোকানো হবে। এটি খুব বড় ফাইলগুলি দ্রুত তৈরি করার একটি উপায়।


1
অথবা শুরুতে ডেটা ছেড়ে যেতে যা আপনি পরিবর্তন করতে চান না। খালি ব্লকগুলি কেবল তখনই ফলাফল দেয় যদি প্রাথমিকভাবে আউটপুট ফাইলে এত বেশি ডেটা না থাকে। ম্যানুয়ালটি কীভাবে obsসম্পর্কিত তা সম্পর্কেও স্পষ্ট নয় bs, কমান্ডটি ব্যবহার না করে bsকোনটি পরিবর্তিত obsহবে তা যদি তা না থাকে।
গ্রামীণ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.