ডিডি সহ এলোমেলো ডেটা তৈরি করুন এবং "আংশিক পড়ার সতর্কতা" পান। সতর্কতার পরে তথ্য এখন কি এলোমেলো?


16

আমি এলোমেলো ডেটা সহ একটি 1 টিবি ফাইল তৈরি করি dd if=/dev/urandom of=file bs=1M count=1000000। এখন আমি kill -SIGUSR1 <PID>অগ্রগতিটি যাচাই করি এবং নিম্নলিখিতগুলি পাই:

691581+0 Datensätze ein
691580+0 Datensätze aus
725174190080 Bytes (725 GB) kopiert, 86256,9 s, 8,4 MB/s
800950+1 Datensätze ein
800950+0 Datensätze aus
839856947200 Bytes (840 GB) kopiert, 99429,5 s, 8,4 MB/s
dd: warning: partial read (809620 bytes); suggest iflag=fullblock
803432+1 Datensätze ein
803431+1 Datensätze aus
842459273876 Bytes (842 GB) kopiert, 99791,3 s, 8,4 MB/s

আমি সতর্কতার ব্যাখ্যা দিতে পারি না। এটা কি বলে? সতর্কতার পরে আমার ফাইলটি কি আসলেই এলোমেলো হয়েছে বা কোনও সমস্যা আছে? কি +0 বা + 1-এ আছে 800950+1 Datensätze einএবং 800950+0 Datensätze ausএর অর্থ কি? সতর্কতার পরে এটি +1। এটি কি একটি ত্রুটিযুক্ত হিসাব?


উত্তরগুলি উত্তর দেওয়া সহজ হবে যদি আপনি বার্তাগুলিটি ইংরেজিতে অনুবাদ করতে পারেন। এছাড়াও, "সত্যই এলোমেলো" সংজ্ঞা দিন। আপনার কোন স্তরের এলোমেলো প্রয়োজন, আপনি এটি কীসের জন্য ব্যবহার করবেন?
টেরডন

ইংরাজী বার্তা পেতে, LC_ALL=Cকমান্ডের সামনে ব্যবহার করুন , যেমনLC_ALL=C dd if=...
ভোলকার সিগেল

উত্তর:


38

সংক্ষিপ্তসার: ddএকটি ক্র্যাংকি সরঞ্জাম যা সঠিকভাবে ব্যবহার করা শক্ত। এটি আপনাকে বলে এমন অসংখ্য টিউটোরিয়াল সত্ত্বেও এটি ব্যবহার করবেন না। ddএর সাথে একটি "ইউনিক্স স্ট্রিট ক্রেডিট" ভিবি যুক্ত রয়েছে - তবে আপনি কী করছেন তা যদি আপনি সত্যিই বুঝতে পারেন তবে আপনি জানতে পারবেন যে এটি আপনাকে 10 ফুট খুঁটির সাথে স্পর্শ করা উচিত নয়।

ddreadপ্রতি ব্লক সিস্টেমে একটি কল দেয় (এর মান দ্বারা সংজ্ঞায়িত bs)। readসিস্টেম কলটি নির্দিষ্ট বাফার আকারের যতটা ডেটা দেয় তার কোনও গ্যারান্টি নেই । এটি নিয়মিত ফাইল এবং ব্লক ডিভাইসের জন্য কাজ করতে ঝোঁক, তবে পাইপ এবং কিছু অক্ষর ডিভাইসের জন্য নয়। দেখুন ডেডি কখন অনুলিপি করার উপযুক্ত? (বা, কখন পড়বেন) (এবং আংশিক লিখুন) আরও তথ্যের জন্য। যদি readসিস্টেম কল একেরও কম পূর্ণ ব্লক ফেরত দেয় তবে ddআংশিক ব্লক স্থানান্তর করে। এটি এখনও নির্দিষ্ট সংখ্যক ব্লকের অনুলিপি করে, তাই স্থানান্তরিত বাইটের মোট পরিমাণ অনুরোধের চেয়ে কম হয়।

"আংশিক পঠন" সম্পর্কে সতর্কতা আপনাকে ঠিক এটি বলে: একটি পাঠ আংশিক ছিল, তাই ddএকটি অসম্পূর্ণ ব্লক স্থানান্তরিত করে। ব্লকের গণনায়, এর +1অর্থ একটি ব্লক আংশিকভাবে পড়া হয়েছিল; আউটপুট গণনা হ'ল +0, সমস্ত ব্লকগুলি পঠিত হিসাবে লিখিত ছিল।

এই ডেটার যদৃচ্ছতা প্রভাবিত করে না: সমস্ত বাইট যে ddআউট লিখেছেন বাইট এটি থেকে পড়তে হয় /dev/urandom। তবে আপনি প্রত্যাশার চেয়ে কম বাইট পেয়েছেন।

লিনাক্সের /dev/urandomযথেচ্ছ বৃহত অনুরোধগুলি (উত্স: extract_entropy_userইন drivers/char/random.c) সংযোজন করে , তাই ddএটি পড়ার পরে সাধারণত নিরাপদ। তবে বিপুল পরিমাণে ডেটা পড়তে সময় লাগে। প্রক্রিয়াটি যদি একটি সিগন্যাল পায় তবে readসিস্টেম কলটি তার আউটপুট বাফারটি পূরণ করার আগে ফিরে আসে। এটি স্বাভাবিক আচরণ এবং অ্যাপ্লিকেশনগুলির readএকটি লুপে কল করার কথা ; ddএটি করবেন না, historicalতিহাসিক কারণে ( ddএর উত্সগুলি সংকীর্ণ, তবে এটি টেপগুলি অ্যাক্সেস করার একটি সরঞ্জাম হিসাবে শুরু হয়েছে বলে মনে হয়, যার অদ্ভুত প্রয়োজনীয়তা রয়েছে এবং এটি কখনও কখনও সাধারণ-উদ্দেশ্যে সরঞ্জাম হিসাবে অভিযোজিত হয়নি)। আপনি যখন অগ্রগতি পরীক্ষা করেন, এটি ddপ্রক্রিয়াটি এমন সংকেত প্রেরণ করে যা পাঠকে বাধা দেয়। আপনার কাছে কতগুলি বাইট জেনে যাওয়ার মধ্যে একটি পছন্দ আছেddসামগ্রিকভাবে অনুলিপি করবেন (এটিকে বাধা না দেওয়ার বিষয়টি নিশ্চিত করুন - কোনও অগ্রগতি চেক নেই, কোনও স্থগিতাদেশ নেই), বা ddএখনও অবধি কতগুলি বাইট অনুলিপি করেছেন তা জেনেছেন, এই ক্ষেত্রে আরও কতগুলি বাইট অনুলিপি করবেন তা আপনি জানেন না।

ddজিএনইউ কোর্টিলস- এর সংস্করণটির (যেমন এমবেডেড লিনাক্স এবং সাইগউইন-তে পাওয়া যায়) একটি পতাকা রয়েছে fullblockযা একটি লুপে (এবং এর জন্য ডাইটো ) ddকল করতে বলে এবং এভাবে সর্বদা সম্পূর্ণ ব্লক স্থানান্তর করে। ত্রুটি বার্তাটি আপনাকে এটি ব্যবহার করার পরামর্শ দেয়; আপনার সবসময় এটি ব্যবহার করা উচিত (উভয় ইনপুট এবং আউটপুট পতাকাগুলিতে) খুব বিশেষ পরিস্থিতিতে (বেশিরভাগ সময় টেপগুলি অ্যাক্সেস করার সময়) ব্যতীত - আপনি যদি কিছুটা ব্যবহার করেন তবে তা হ'ল: এখানে আরও ভাল সমাধান থাকে (নীচে দেখুন)।readwritedd

dd if=/dev/urandom iflag=fullblock oflag=fullblock of=file bs=1M count=1000000

কী ddকরবে তা নিশ্চিত করার আর একটি সম্ভাব্য উপায় হ'ল ১ টি ব্লকের আকার পাস করা Then তারপরে আপনি বলতে পারবেন যে ব্লক গণনা থেকে কয়টি বাইট অনুলিপি করা হয়েছিল, যদিও আমি নিশ্চিত না যে readপ্রথমটি পড়ার আগে কোনও ব্যত্যয় ঘটলে কী হবে বাইট (যা অনুশীলনে খুব সম্ভবত না তবে ঘটতে পারে)। তবে এটি কার্যকর হলেও এটি খুব ধীর very

ব্যবহার ddসম্পর্কে সাধারণ পরামর্শটি ব্যবহার করবেন নাdd । যদিও ddডিভাইসগুলিতে অ্যাক্সেসের জন্য প্রায়শই নিম্ন-স্তরের কমান্ড হিসাবে বিজ্ঞাপন দেওয়া হয় তবে এটি আসলে তেমন কোনও বিষয় নয়: সমস্ত যাদুটি ডিভাইস ফাইলে (দ্য /dev/…) অংশে ঘটে থাকে , ddএটি কেবলমাত্র একটি সাধারণ সরঞ্জাম যা অপব্যবহারের উচ্চ সম্ভাবনার সাথে ডেটা ক্ষতিগ্রস্থ হয় resulting । বেশিরভাগ ক্ষেত্রে, কমপক্ষে লিনাক্সে আপনি যা চান তার করার একটি সহজ এবং নিরাপদ উপায় রয়েছে।

উদাহরণস্বরূপ, কোনও ফাইলের শুরুতে নির্দিষ্ট সংখ্যক বাইট পড়ার জন্য, কেবল কল করুন head:

head -c 1000000m </dev/urandom >file

আমি আমার মেশিনে একটি দ্রুত বেঞ্চমার্ক তৈরি করেছি এবং ddএকটি বৃহত ব্লকের আকার এবং এর মধ্যে কোনও পারফরম্যান্সের পার্থক্য লক্ষ্য করি নি head

আপনি কি আবার গোড়া কিছু বাইট লাফালাফি করার প্রয়োজন হলে, নল tailমধ্যে head:

dd if=input of=output count=C bs=B seek=S
<input tail -c +$((S*B+1)) | head -c $((C*B)) >output

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

lsof -a -p 1234 -d 1
cat /proc/1234/fdinfo/1

পাইপলাইনে অতিরিক্ত আইটেম ব্যয়ে আপনি pvঅগ্রগতি প্রতিবেদন ( dd'এর চেয়ে ভাল ) পেতে কল করতে পারেন (পারফরম্যান্স-ভিত্তিক, এটি সবেমাত্র অনুধাবনযোগ্য)।


2
+1 টি। এটি দীর্ঘ সময়ের মধ্যে স্ট্যাকএক্সচেঞ্জ নেটওয়ার্কে পড়ে থাকা সর্বাধিক গবেষণা হওয়া পোস্টগুলির মধ্যে একটি। এটি সংহত হয়েছে তবুও ddকমান্ড সম্পর্কে সমস্ত বিবরণ (historicতিহাসিক এবং বর্তমান) রয়েছে যা আমি বুঝতে পারি নি যে আমার জানা দরকার। ধন্যবাদ।
মহাজাগতিক অসিফ্রেজ

4
আমি দুঃখিত, তবে আমি আপনার এই দাবির সাথে একমত নই যে ডিডি হ'ল একটি "ক্র্যাঙ্কি সরঞ্জাম যা সঠিকভাবে ব্যবহার করা শক্ত" এবং "ডিডি ব্যবহার করবেন না"। এটি সঠিকভাবে ব্যবহার করার সময় যখন কেউ এটি বোঝার জন্য সময় নিয়েছে সঠিকভাবে ব্যবহৃত হয়। প্রকৃতপক্ষে ডিস্ক ফরেনসিক টুলকিটগুলি প্রায় সমস্ত ডিডি বা ডেসিভেটিভ যেমন ডিসিএফএলডিডি এর উপর নির্ভর করে।
fpmurphy

1
@ fpmurphy1 GNU ddনিরাপদে ব্যবহার করা যেতে পারে, এর fullblockবিকল্পটির জন্য ধন্যবাদ । তবে আপনার যদি জিএনইউ কোর্টিল রয়েছে তবে আপনার ddখুব বেশি দরকার নেই । "ডেরিভেটিভস" যেমন dcflddহয় না dd , তারা তার নকশা অপূর্ণতা থেকে ভোগেন না তাই আমার উত্তর তাদের কাছে প্রযোজ্য নয়। একটি সুবিশাল, মানুষ বেশীরভাগ যারা ব্যবহার ddযথেষ্ট সময় নিয়ে যাওয়া নি তা বুঝতে (অধিকতম, তারা সময় নিয়েছে মনে তারা এটা বুঝতে) এবং এটা ব্যবহার করল তারা ডেটা ক্ষতি হতে পারে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

1
@ গিলস সুতরাং আমাদের অপব্যবহারের সম্ভাবনাগুলির "প্রতিধ্বনি" বি / সি ব্যবহার করা উচিত নয় (সুডো ইকো হ্যালো ওয়ার্ল্ড> / দেব / এসডিএ)?
হোয়াইট04

2
@ হোয়াইট04 আমি নাইট্রোগ্লিসারিনের ব্যারেল পরিচালনা না করার পরামর্শ দিচ্ছি। আমি বলিনি যে আপনার ম্যাচগুলি ব্যবহার করা উচিত নয়।
গিলস 'অশুভ হওয়া বন্ধ করুন' 29:25

9

সতর্কতাটি ঘটে যখন ddএকক পড়তে কোনও ব্লক পূরণ করার জন্য পর্যাপ্ত ডেটা না পাওয়া যায়। এটি অনিয়মিত বা ধীর ডেটা উত্স, বা এমন সূত্রগুলির সাথে ঘটে যা আপনার অনুরোধ করা ব্লককেজের চেয়ে ছোট ইউনিটে ডেটা লেখেন।

ডেটা অখণ্ডতার সাথে কোনও সমস্যা নেই, তবে সমস্যাটি হ'ল ddআংশিক পঠনটিকে এখনও পঠন ব্লক হিসাবে গণ্য করে।

আপনি যদি countবিকল্পটি ব্যবহার না করে থাকেন তবে সতর্কবার্তাটি খুব কমই গুরুত্ব দেয়, এটি কেবলমাত্র পারফরম্যান্স বিবেচনা। তবে এর সাথে count, আপনি যে পরিমাণ ডেটা অনুরোধ করেছেন তা পাবেন না। আংশিক পাঠের কারণে শেষের ofচেয়ে ছোট হবে count*bs

সুতরাং আপনি যখন ব্যবহার করবেন count, প্রযুক্তিগতভাবে আপনার সর্বদা iflag=fullblockপাশাপাশি ব্যবহার করা উচিত ।

+xআংশিক ব্লক সংখ্যা হওয়া উচিত।


-3
< /dev/urandom \
dd ibs=4k obs=64k |
dd bs=64k count=16000000 >file

Just এটি কেবল কাজ করবে। অন্যথায় এখানে থাকা ভুল তথ্যটি প্রকৃতপক্ষে মিথ্যা। ddএর বাফারগুলি স্পষ্টত এবং তাই, বাফার ইনপুটটি আপনাকে স্পষ্টভাবে বাফার করতে হবে এমন ঘটনাগুলি গণনা করতে। এটাই সব। ফুদ কিনবেন না।

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