কেন ডিডি খুব বেশি সময় নেয়?


18

আমার একটি ডিস্কের অন্য একটিতে অনুলিপি করা দরকার। আমি নীচের কমান্ডটি দিয়ে চেষ্টা করেছি এবং ফেডেরোতে 1 টিবি ডিস্কের অনুলিপি করতে প্রায় এক দিন সময় লাগে।

dd if=/dev/sda of=/dev/sdb 

আমি ইউনিক্স (এইচপি-ইউএক্স) সিস্টেমে নীচের কমান্ডটি দিয়ে একই চেষ্টা করেছি এবং এটি কয়েক ঘন্টার মধ্যে সম্পূর্ণ হয়ে যায়

dd if=/dev/sda of=/dev/rdsk

দ্রুত থেকে ডিস্ক থেকে ডিস্কে অনুলিপি করতে আমি কী বিকল্প ব্যবহার করতে পারি?


2
cp /dev/sda /dev/sdbবা ( pv /dev/sda > /dev/sdb একটি অগ্রগতি বার পেতে) অনেক দ্রুত হবে। আপনি ddএখানে কেন ব্যবহার করবেন ? ddকেবল conv=sync,noerrorত্রুটিযুক্ত ডিস্কগুলি পরিচালনা করার মতো জিনিসগুলিতেই কার্যকর হবে তবে তারপরেও এর ddrescueপরিবর্তে জিনিসগুলি ব্যবহার করা আরও বুদ্ধিমান হয়ে উঠবে (এছাড়াও pvএর -Eবিকল্পটি দেখুন)।
স্টাফেন চেজেলাস

1
@ স্টাফেনচাজেলাগুলি catআরও দ্রুত হতে পারে তবে পার্থক্যটি এতটা নাটকীয় নয় (আমার পরীক্ষার মতো ফাইল-টু-ডিভাইসের চেয়ে ডিভাইস-টু-ডিভাইসের জন্যও বড়)।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

8
"আমি ইউনিক্স সিস্টেমেও একই চেষ্টা করেছি" - সুতরাং আপনি কোন ধরণের সিস্টেমে ইউনিক্স না থাকলে প্রথম চেষ্টা করেছিলেন? এছাড়াও, কি হার্ডওয়ার, ইত্যাদি।
মার্সেলেম


প্রথম এইচপি-ইউএক্স (ইন্টিগ্রিটি ব্লেড) এবং এর আগে সোলারিস মেশিন ব্যবহৃত হয়েছে।
KKD

উত্তর:


28

ddঅনেকগুলি (অদ্ভুত) বিকল্প রয়েছে, দেখুন ডিডি (1)

আপনার বাফারের আকারটি স্পষ্টভাবে বলা উচিত, তাই চেষ্টা করুন

dd if=/dev/sda of=/dev/sdb bs=16M

আইআইআরসি, ডিফল্ট বাফার আকারটি কেবল 512 বাইট। উপরের কমান্ডটি এটি 16 মেগাবাইটে সেট করে। আপনি কিছু ছোট চেষ্টা করতে পারেন (উদাঃ bs=1M) তবে আপনার ডিফল্টের চেয়ে বেশি ব্যবহার করা উচিত (বিশেষত 4Kbytes এর সেক্টর সহ সাম্প্রতিক ডিস্ক হার্ডওয়্যারে, অর্থাৎ অ্যাডভান্সড ফর্ম্যাট )। আমি নির্লজ্জভাবে দু'জনের কিছু পাওয়ার প্রস্তাব করি যা কমপক্ষে একটি মেগাবাইট।

ডিফল্ট 512 বাইট বাফার আকারের সাথে, আমি অনুমান করি (তবে আমি খুব ভুল হতে পারি) যে হার্ডওয়ারের জন্য প্রতিটি 512 বাইট ব্লকের জন্য 4K স্থানান্তর করতে কার্নেলের প্রয়োজন হয়।

সম্পর্কিত rdsk, এসডি (4) ম্যান পেজগুলি বলেছেন:

এই সময়ে, শুধুমাত্র ব্লক ডিভাইস সরবরাহ করা হয়। কাঁচা ডিভাইসগুলি এখনও কার্যকর করা হয়নি।

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


লিনাক্স সিস্টেমে আরডিএসকি পাওয়া যায় কিনা? আমি ইউনিক্স সিস্টেমগুলিতে ব্যবহার করেছি।
KKD

1
পৃষ্ঠার ক্যাশে সম্ভবত আপনি যা কিছু করুন 4Kb ব্লকগুলিতে ডিল করবে, তবে আপনি 4Kb পড়ার জন্য কতগুলি সাইক্যেল ডিডি ব্যবহার করতে পারেন তা নিয়ন্ত্রণ করতে পারেন। আমি নিশ্চিত যে উপরে কিছু পড়ার আকার রয়েছে যা স্টলিংয়ের লেখার ব্যয়টি সংরক্ষিত সিস্কলগুলির চেয়ে বেশি ব্যয়বহুল, তবে মিষ্টি স্পটটি কোথায় তা সম্পর্কে কোনও ধারণা নেই।
অকেজো

কয়েকটি এমবি-র একটি ব্লকের আকার ডিফল্ট 512 বি এর চেয়ে ভাল তবে আমি যখন এটি বেঞ্চমার্ক করেছি তখন আমি দেখতে পেলাম যে catঠিক ফাইলটি (ফাইল-সিস্টেম-থেকে-ফাইল-সিস্টেম স্থানান্তরের জন্য, সরাসরি ব্লক-টু- ব্লকেও বিভিন্ন পারফরম্যান্সের বৈশিষ্ট্য থাকতে পারে)। তবে পার্থক্যটি কোনও ক্ষেত্রে নাটকীয় ছিল না।
গিলস 'তাই মন্দ হওয়া বন্ধ করুন'

1
মজার বিষয় হল, ম্যাকোজে (একটি এসইএস-প্রত্যয়িত, বিটিডাব্লু) সঞ্চালনের সময় লক্ষ্য হিসাবে এটির দ্রুত ব্যবহার/dev/rdiskXdd
আদিব

1
আপনি যদি ভাবছেন যে কি চলছে (যেমন আমি করেছি) এটি যুক্ত করে status=progressযা পুরো ক্রিয়াকলাপের অগ্রগতি মুদ্রণ করবে।
আলেকসান্দার লেচ

17

কয়েক বছর আগে ইউনিক্স-জমিতে ddএকটি ব্লক ডিভাইস অনুলিপি করার প্রয়োজনীয় উপায় ছিল। এটি (লিনাক্স-ভিত্তিক সিস্টেমে, কমপক্ষে) catপ্রায় সর্বদা তুলনায় দ্রুত হলেও কার্গো-কাল্ট জ্ঞান হিসাবে এগিয়েছে dd

যাইহোক, এমনকি ইতিহাসে ফিরে একটি শালীন ব্লকের আকার (ধীর) সিস্টেম কলগুলির সংখ্যা হ্রাস করতে সহায়তা করেছিল, প্রতিটি সিস্টেম কল একটি আই / ও ক্রিয়াকলাপকে ট্রিগার করে। ডিফল্ট ব্লকের আকার 512 বাইট (একটি ডিস্ক সেক্টর)। একাধিক ডিস্ক ব্লক একসাথে একটি পাঠের সাথে সংগ্রহ করা ছিল - এবং তা গ্রহণযোগ্যও। এই উদাহরণটি একটি 32MB ব্লক আকার ব্যবহার করে:

dd bs=$((512*2048*32)) if=/dev/source of=/dev/target

বর্তমান লিনাক্স-ভিত্তিক সিস্টেমে, ডিস্কগুলিকে সিম্পল দিয়ে সবচেয়ে দক্ষতার সাথে অনুলিপি করা যায় cat

cat /dev/source >/dev/target

(আপনার প্রশ্নের মন্তব্যে উল্লিখিত হিসাবে pvপ্রতিস্থাপিত হতে পারে catএবং আপনাকে অগ্রগতি এবং থ্রুপুট একটি ইঙ্গিত দেবে।)


3
বিশেষত, ডিডি ব্যবহার করার কারণটি ছিল জিএনইউ সিপিতে একটি বাগ এবং 90 এর দশকের গোড়ার দিকে লিনাক্স কার্নেলের একটি বাগ। Historicalতিহাসিক ইউনিক্স সিস্টেমে ডিডি ব্যবহারের কারণগুলি খুব আলাদা ছিল এবং একটি সম্পূর্ণ ব্লক ডিভাইস অনুলিপি করা অনুলকনীয় কাজটি করতে চাওয়া ছিল।
র্যান্ডম 832

1
@ র্যান্ডম 832 একটি সম্পূর্ণ ডিস্ক অনুলিপি করতে চাইলে এটি অস্বাভাবিক হত তবে আমার মনে আছে চারপাশে পার্টিশনগুলি কপি করা দরকার (
বড়গুলি

3
(বাগগুলির বিশদ বিবরণ: কার্নেলটি ডিস্কের ব্যবহারের মাপগুলি ভুলভাবে জানিয়েছে [প্রতিটি উত্স ফাইলকে একটি বিচ্ছিন্ন ফাইল ছিল তা এই সিদ্ধান্তে নেতৃত্ব দিচ্ছে], এবং সিপি কোনও ডিভাইস গন্তব্যে বিচ্ছিন্ন ফাইল থেকে অনুলিপি করার সময় ব্লকগুলি শূন্য করে না So সুতরাং কোনও শূন্য ইতিমধ্যে ডিস্কে যা কিছু আবর্জনা ঘটেছে তা আপনার উত্সের ব্লক করে রাখবে)
র্যান্ডম 832

আমি এই জাতীয় উত্তর পছন্দ করি। তথ্যের জন্য ধন্যবাদ। আপনার আপডেট আপ এখানে।
ক্যাটবাজার

7

সাধারণত, ddকিছু বিকল্পের পক্ষে এড়ানো যায়। ddrescueপরিবর্তে জিএনইউ ব্যবহার করার বেশ কয়েকটি ভাল কারণ রয়েছে । উবুন্টুতে, আপনি এটি দিয়ে এটি ইনস্টল করতে পারেন:

sudo apt-get install gddrescue

এবং ddrescueব্যবহার করার জন্য সহজ। লক্ষ্য করুন প্যাকেজের নাম থেকে ভিন্নভাবে, এক্সিকিউটেবল নেই প্রাথমিক আছে g

এটি ব্যবহার করা যেমন সহজ:

ddrescue inputFile outputFile logFile

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

এটি ব্লক আকারের জন্য বোধগম্য ডিফল্টগুলি ব্যবহার করে, তাই অনুলিপিতে আমার কম্পিউটারে কমপক্ষে গতি কমদামে ডিভাইস পরিচালনা করতে পারে তত দ্রুত (আমি এর সাথে অনেকগুলি ড্রাইভ, সমস্ত আকার এবং প্রকারের ক্লোন করেছি) oned

প্রায়শই, ড্রাইভগুলি যে ব্যর্থ হতে শুরু করে তাদের গতির সমস্যা যেমন মাঝেমধ্যে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে মেলে ddrescueউপরের সমস্তটি সনাক্ত করতে এবং আপনার ক্লোনটি পুনরায় চালু করতে সহায়তা করতে পারে (যদি আপনি কোনও লগ ফাইল নির্দিষ্ট করে থাকেন) এমনকি আপনার ড্রাইভটি পুনরায় সেট হয়ে চলেছে।


6

খুব সুন্দর প্রশ্ন। কাঁচা ইন্টারফেসটি কিছু ইউনিক্স সিস্টেমে (tru64, hpux, solaris) প্রয়োগ করা হয়েছে তবে লিনাক্সে নয়। কাঁচা ইন্টারফেসটি স্থানান্তর দ্রুত করে তোলে কারণ ইউনিক্স I / O এড়িয়ে যায়। ব্লক ইন্টারফেসটি ( /dev/dskবা /dev/disk) ধীর গতির কারণ এটি ইউনিক্স I / O সিস্টেমটি ব্যবহার করে। Speedup করার dd(GNU DD করতে পারেন) ব্যবহারের bs=30Mবা bs=20Mআপনার HW উপর নির্ভর করে। সংক্ষিপ্ত উত্তরটি হ'ল: এটি প্রয়োগ করা হয়নি, কমপক্ষে আমি যতদূর জানি। কার্নেল সংস্করণ ২.২-এর পুরানো সময় থেকে আমি লিনাক্স ব্যবহার করছি এবং rdskইউনিক্সে কখনও ব্যবহার হয়নি ।


6
আপনি কেন একটি ব্লকের আকারের প্রস্তাব করেন যা দুটি পাওয়ার নয়?
বেসাইল স্টারিঙ্কেভিচ

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