/ ডি / র্যান্ডম থেকে ডিডি কেন বিভিন্ন ফাইলের আকার দেয়?


26

আমি একটি উবুন্টু সিস্টেমে নিম্নলিখিত কমান্ডটি চালাচ্ছি:

dd if=/dev/random of=rand bs=1K count=2

যাইহোক, যতবারই আমি এটি চালাচ্ছি, আমি আলাদা আকারের একটি ফাইল দিয়ে শেষ করি। কেন? আমি এলোমেলো ডেটা ভরাট দেওয়া আকারের একটি ফাইল কীভাবে তৈরি করতে পারি?


1
/dev/randomআপনি চান সংখ্যা সংখ্যা জেনারেট করার জন্য পর্যাপ্ত এনট্রপি না থাকলে ব্লক হবে। এটি কেবলমাত্র উচ্চমানের psuedo র্যান্ডম "র্যান্ডমনেস" র পরিমাণ সংগ্রহ করতে সময় নেয় ... হয় /dev/urandomকম এলোমেলো "এলোমেলো" মানের জন্য ব্যবহার করুন, বা আপনার এন্ট্রপি পুলটি পরীক্ষা করুন (একটি লুপে, এবং প্রয়োজন হিসাবে অপেক্ষা করুন) ...
পিটার.ও


3
মাত্র যোগ করুনiflag=fullblock
frostschutz

উত্তর:


31

আপনি ddলিনাক্সের অদ্ভুত আচরণের অদ্ভুত আচরণের সংমিশ্রণটি পর্যবেক্ষণ করছেন /dev/random। উভয়ই, যাইহোক, খুব কমই কাজের জন্য সঠিক সরঞ্জাম।

লিনাক্সের /dev/randomডেটা অল্প পরিমাণে ফিরে আসে। এটি অনুমানের ভিত্তিতে তৈরি হয় যে সিউডোরেন্ডম নম্বর জেনারেটরের এনট্রপি খুব দ্রুত হারে নিভে গেছে। যেহেতু নতুন এন্ট্রপি সংগ্রহ করা ধীর, তাই /dev/randomসাধারণত একবারে কয়েকটি বাইট ত্যাগ করে।

ddপ্রাথমিকভাবে টেপ ডিভাইসগুলিতে অপারেট করার উদ্দেশ্যে তৈরি একটি পুরানো, ক্র্যাংকি প্রোগ্রাম। আপনি যখন এটি 1 কেবি এর একটি ব্লক পড়তে বলছেন, এটি একটি ব্লক পড়ার চেষ্টা করে। যদি পঠন 1024 বাইটের চেয়ে কম ফিরে আসে তবে শক্ত, এটিই আপনি পাবেন। সুতরাং dd if=/dev/random bs=1K count=2দুটি read(2)কল করে। যেহেতু এটি পড়েছে /dev/random, দুটি readকল সাধারণত পাওয়া যায় এমন এন্ট্রপির উপর নির্ভর করে বিবিধ সংখ্যায় মাত্র কয়েকটি বাইট ফেরত দেয়। আরও দেখুন ডিডি কখন অনুলিপি করার উপযুক্ত? (বা, কখন পড়বে () এবং লিখুন () আংশিক)

আপনি যদি কোনও ওএস ইনস্টলার বা ক্লোনার ডিজাইন না করেন তবে আপনার /dev/randomলিনাক্সের অধীনে কখনও ব্যবহার করা উচিত নয় /dev/urandomurandomMan পৃষ্ঠা কিছুটা বিভ্রান্তিকর হয়; /dev/urandomপ্রকৃতপক্ষে ক্রিপ্টোগ্রাফির জন্য এমনকি দীর্ঘ-দীর্ঘ কীগুলি উত্পন্ন করার জন্য উপযুক্ত। এর সাথে একমাত্র সীমাবদ্ধতা /dev/urandomহ'ল এটি অবশ্যই পর্যাপ্ত এনট্রপি সরবরাহ করতে হবে; লিনাক্স ডিস্ট্রিবিউশনগুলি সাধারণত পুনরায় বুটগুলির মধ্যে এনট্রপি সংরক্ষণ করে, সুতরাং আপনার কেবলমাত্র পর্যাপ্ত এনট্রপি না থাকতে পারে কেবলমাত্র একটি নতুন ইনস্টলেশন on এন্ট্রপি ব্যবহারিক দিক থেকে পরিধান করে না। আরও তথ্যের জন্য, পড়ুন / dev / urandom থেকে একটি র‌্যান্ড লগইন কী জন্য নিরাপদ? এবং ভক্ষণ / দেব / এলোমেলো এন্ট্রপি পুল?

এর বেশিরভাগ ব্যবহারগুলি ddযেমন headবা এর সাথে আরও ভালভাবে প্রকাশ করা হয় tail। যদি আপনি 2kB এলোমেলো বাইট চান তবে চালান

head -c 2k </dev/urandom >rand

পুরানো লিনাক্স কার্নেলগুলির সাথে, আপনি এড়িয়ে যেতে পারেন

dd if=/dev/urandom of=rand bs=1k count=2

কারণ /dev/urandomআনন্দের সাথে অনুরোধ অনুসারে যতগুলি বাইট ফিরে এসেছিল। কার্নেল ৩.১16 এর পরে এটি আর সত্য নয়, এটি এখন ৩২ মেগাবাইটে সীমাবদ্ধ

সাধারণভাবে, যখন আপনি ব্যবহার করতে হবে ddবাইটের একটি নির্দিষ্ট সংখ্যা বের করে আনতে এবং তার ইনপুট একটি নিয়মিত ফাইল অথবা ব্লক ডিভাইস থেকে আসছে না হয়, আপনি -এর প্রত্যেক বাইট পড়া প্রয়োজন: dd bs=1 count=2048


ধন্যবাদ ডিডির পরিবর্তে মাথা ব্যবহারের পরামর্শের জন্য। এটি আমাকে চাইলে এখনও / দেব / এলোমেলো ব্যবহার করতে দেয়। যদিও আপনি উল্লেখ করেছেন / ডিভ / ইউরানডম সম্ভবত যথেষ্ট হবে তবে কীভাবে / ডি / র্যান্ডম ব্যবহার করা উচিত তা জেনে রাখা ভাল is
ড্যানিয়েল

কার্নেলের উপর থেকে 3.16 /dev/urandom প্রতি 32m রিটার্ন দেয়read()
মাইক্রজারভ

বিকল্পভাবে, আপনার যদি পসিক্স কমপ্লায়েন্ট কমান্ডের প্রয়োজন হয় তবে আপনি এখানে কৌশলটি ব্যবহার করতে পারেন: unix.stackexchange.com/a/192114dd if=/dev/urandom ibs=1k obs=1k | dd bs=1k count=2
রাফলেউইন্ড

11

থেকে man 4 randomএকটি RHEL 5 বক্স করুন:

পড়লে, / dev / এলোমেলো ডিভাইস কেবল এনট্রপি পুলের শব্দগুলির বিটগুলির আনুমানিক সংখ্যার মধ্যে এলোমেলো বাইটগুলি উপস্থিত করবে।

আমি সেই মেশিনে 213 বাইট সাইজের ফাইল পাই। মানুষ 4 এলোমেলো:

যখন পড়বেন, / dev / urandom ডিভাইসটি অনুরোধ করা হয়েছে তত বেশি বাইট ফিরে আসবে।

আমি প্রতিটি অনুরোধ থেকে 2048 বাইট পাই dd if=/dev/urandom of=rand bs=1K count=2

আমি উপসংহারে পৌঁছেছি যে আপনার মেশিনের আমন্ত্রণের মধ্যে কতটা এনট্রপি জন্মায় তার কারণে পার্থক্য dd if=/dev/random ...


হ্যাঁ, ব্যবহারিকভাবে, যদি না তিনি সত্যিকারের ক্রিপ্টো অ্যাপ্লিকেশনটিতে না থাকেন তবে @ ড্যানিয়েলকে / দেব / ইউরানডম ব্যবহার করা উচিত। তবে dd if=/dev/random bs=1K count=2এন্টারপপির পুলটি যখন আপাতভাবে স্রোত হয় তখন কেন থামবে তা নিয়ে আমি বিস্মিত হই । দস্তাবেজগুলি থেকে, আরও এনট্রপি না হওয়া পর্যন্ত এটি ব্লক করা উচিত, সুতরাং এটি ddকেবলমাত্র বর্তমান পুলটি বাইরে ফেলে দিয়ে প্রস্থান করার পরিবর্তে ধীরে ধীরে ফাইলটি লিখবে।
সিজেসি

আমি সে সম্পর্কেও অবাক হয়েছি, তবে এটি আরএইচএল, স্ল্যাকওয়ার 13.1 এবং একটি সুন্দর বর্তমান আর্চ জুড়ে সুসংগত। আরএইচএলটি x86_64, অন্যরা 32-বিট ছিলেন। দুর্ভাগ্যক্রমে ডিডি ডকসগুলি জিএনইউ তথ্য ফর্ম্যাটে রয়েছে, সুতরাং আমি সেগুলি সব পড়িনি।
ব্রুস এডিগার

এটি জেন্টুতেও সামঞ্জস্যপূর্ণ।
ম্যাথু শার্লে

4
@ সিজেসি: কারণ আপনি যখন read(fd, mybuf, 1024)কোনও ব্লকিং এফডি কল করবেন তখন অন্তর্নিহিত ডিভাইসটি কিছু ডেটা ফেরত দেওয়ার সাথে সাথেই এটি ফিরে আসে । যদি সেখানে পড়তে হয় 1024 বাইট, এটি এটি ফিরে আসে। যদি কেবল 201 বাইট থাকে তবে তা 201 এ ফিরে আসবে there যদি 0 বাইট উপলব্ধ থাকে তবে কমপক্ষে একটি বাইট উপলব্ধ না হওয়া অবধি এটি ব্লক হবে, তারপরে সেগুলি / ফেরত দিন।
ওয়ারেন ইয়ং

@ ওয়ারেন ইউং / dev / এলোমেলো থেকে পড়া কি এর বিষয়বস্তু ফেলেছে? আমি ধরে নিই।
মাইকেল মার্টিনেজ

5

কেন ddড্রপ ডেটা? ... গিলস এই আকর্ষণীয় প্রশ্ন সম্পর্কে প্রশ্ন তুলেছেন dd:
ডেডি কখন অনুলিপি করার উপযুক্ত? (বা, কখন পড়বেন () এবং লিখুন () আংশিক)
এই প্রশ্নটির একটি অংশ এখানে দেওয়া হয়েছে:

    * ... ডিডিকে দোষ দেওয়া খুব কঠিন নয়; উদাহরণস্বরূপ এই কোডটি ব্যবহার করে দেখুন: **
        yes | dd of=out bs=1024k count=10
    এবং আউট ফাইলের আকার পরীক্ষা করুন (এটি 10MB এর নিচে ভাল হতে পারে)।


আমার মন্তব্য বাদে (আপনার প্রশ্নের শেষে), এর মতো কিছু দেখার জন্য পুনরাবৃত্তি করছে ... এটি আপনার বাইটগুলি ফাইলে ধরেছে $trnd। আমি আধা-নির্বিচারে বিএস = 8 বেছে নিয়েছি

আপনার মাউস সরান এবং এটি দ্রুত গতিতে দেখুন।
আমার কম্পিউটার অলস (এএফকে এবং কোনও নেটওয়ার্ক ক্রিয়াকলাপ) না দিয়ে এবং এনট্রপি পুলটি শেষ করে দেওয়ার পরে, কেবল ১১৯২ বাইট সংগ্রহ করতে 2 ঘন্টা 12 মিনিট সময় লেগেছিল , আমি এই স্থানে এটি বাতিল করে দিয়েছি।

তারপর, আমাকে মাউস ক্রমাগত চলন্ত সঙ্গে, এটা একটি অপেক্ষাকৃত অনেক খাটো নেন 1 মিনিট 15 সেকেন্ড বাইট একই সংখ্যক সংগ্রহ করা।

এটি বেশ পরিষ্কারভাবে দেখায় যে এনট্রপি সংগ্রহ করা সিপিইউ গতি ভিত্তিক নয়, বরং এটি এলোমেলো ঘটনা ভিত্তিক, এবং আমার উবুন্টু সিস্টেমটি মাউসটিকে তার অন্যতম গুরুত্বপূর্ণ এলোমেলো কারণ হিসাবে ব্যবহার করে ।

get=2048
trnd=/tmp/$USER.rnd; >"$trnd"
while (( $(wc -c <"$trnd") < $get )) ;do
    dd if=/dev/random bs=8 count=1 2>/dev/null >>"$trnd"
    echo -n "itt: $((i+=1))  ct: "; wc -c <"$trnd"
done
truncate -s $get "$trnd"
echo -e "\nfinal count: "; wc -c <"$trnd"

1

ddহয় পরিকল্পিত পরিবর্তনশীল ইনপুট আকারের থেকে পড়ার জন্য এটি সাধারণত আপনার নিষ্পত্তি সেরা টুল আপনি এটি সম্পন্ন প্রয়োজন হলে - অবরুদ্ধ করার জন্য অবিলম্বে কারণ ddবর্তমান ছবি আটকে যাবে না কিছু ভবিষ্যতে মধ্যে সার্চ write() (যদি না আপনি খুব স্পষ্টভাবে এটি আইবিএস চেয়ে বড় obs সঙ্গে যে ভাবে কনফিগার) , কিন্তু পরিবর্তে write()সবকিছু যত তাড়াতাড়ি সার্চ যেমন read()এটি গুলি (এবং ঐচ্ছিকরূপে এটা প্রক্রিয়া)

এখানে কয়েকটি গুরুত্বপূর্ণ সংজ্ঞা দেওয়া হল :

  • ibs=expr
    • বাইপগুলিতে ইনপুট ব্লকের আকার নির্দিষ্ট করুন (ডিফল্ট 512)expr
  • obs=expr
    • বাই দ্বারা আউটপুট ব্লকের আকার নির্দিষ্ট করুন (ডিফল্ট 512)expr
  • bs=expr
    • উভয় ইনপুট এবং আউটপুট ব্লক মাপগুলি exprবাইট, সুপারসিডিং ibs=এবং এ সেট করুন obs=। কোন রূপান্তর ছাড়া অন্য তাহলে sync, noerrorএবং notruncউল্লেখ করা হয়, প্রতিটি ইনপুট ব্লক সংক্ষিপ্ত ব্লক সমষ্টি ছাড়া একটি একক ব্লক হিসাবে আউটপুট অনুলিপি করা হবে।

সুতরাং আপনি যখন দেখেন যে ibsএবং কখন সংজ্ঞাযুক্ত তখন obsততটাই প্রাধান্য পায় - তবে অন্যথায়, যদি আপনি নির্দিষ্ট হন তবে হয় বা হয় না eitherbsibsobscbs

এখানে একটি উদাহরণ রয়েছে যার ibsমধ্যে সবচেয়ে গুরুত্বপূর্ণ। আপনি কত শীঘ্রই /dev/randomপুলটি ভরা হয়েছে তা ট্র্যাক করতে চাইলে আপনি এই জাতীয় কিছু করতে পারেন ...

dd "ibs=$size" conv=sync "count=$lmt" \ 
    if=/dev/random of="$somefile"

যতক্ষণ না if=টার্গেটটি একেবারে পঠনযোগ্য, এর ফলস্বরূপ সর্বদা একই আকারের আউটপুট ফাইল ddহবে কারণ syncনালাগুলিতে পঠনগুলিতে ব্লকগুলি হরনাইজ করবে । অন্য কথায়, যদি বারের dd read()ইনপুট-ব্লকের জন্য গুলি হয় $((size=10)) $((count=5))এবং read()ফাইলটি 2 বাইট ফেরত দেয় তবে 8 বাইট, তারপরে 12 বাইট, তারপরে 2 বাইট, তারপরে 4 বাইট ddতার আউটফাইলে এমন কিছু লিখবে

 2 read bytes 8NULs \
 8 read bytes 2NULs \
10 read bytes 0NULs \
 4 read bytes 6NULs \
 4 read bytes 6NULs

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

আপনি যদি নিয়মিত ফাইলে কিছু পরিমাণ ডেটা লিখে থাকেন তবে এখানে তৈরি অন্যান্য বিবৃতিগুলির বিপরীতে, আপনি এটির ddজন্য এবং মোটামুটি সহজেই ব্যবহার করতে পারেন - তবে আপনার একাধিক এবং একটি নির্ভরযোগ্য ব্লকিং ফ্যাক্টর প্রয়োজন

উদাহরণস্বরূপ, যদি আপনি এটি করেন:

{   dd ibs="$size" obs="${size}x$block_factor" |
    dd bs="${size}x$blockfactor" "count=$lmt"
}  <infile >outfile

... প্রথমটি ddযতটা ibs="$size"ইনপুট ব্লক প্রয়োজন ততটুকুভাবে এটির জন্য এবং দ্বিতীয়টির মধ্যে পাইপের obs="${size}x$block_factor"প্রতিটি জন্য কমপক্ষে একটি আউটপুট ব্লক পূরণ করতে write()হবে dd। এর অর্থ হ'ল দ্বিতীয়টি ddআউটপুটটিকে নির্ভরযোগ্যতার সাথে সীমাবদ্ধ করতে পারে count="$lmt"কারণ write()প্রথমটি তৈরির সমস্ত তার i / o ব্লকসাইজের সাথে মিলবে - এটি তৈরি করতে প্রথমে কতজনকে অবশ্যই করতে হবে তা নির্বিশেষেread()dd

এবং এটিdd হ'ল আপনি কীভাবে নির্ভরযোগ্যভাবে পাইপ বা অন্যান্য ধরণের বিশেষ ফাইলগুলি পড়তে পারেন - অল্প অল্প গণিত সহ।

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