Blocks dd` কীভাবে ডেটা-শিফ্ট ডেটা ব্লক করতে ব্যবহার করা যেতে পারে?


10

একটি সাধারণ উদাহরণ হিসাবে 100MB কাঁচা ব্লক ডিভাইস বিবেচনা করুন। এটি মোট 102760448 বাইটের জন্য 512 বাইটের 204800 ব্লক।

প্রথম 98MB (200704 ব্লক) স্থানান্তর করা চ্যালেঞ্জ হ'ল এর সামনে 2MB (4096 ব্লক) এর ব্যবধান রয়েছে। স্থানে এটি করার জন্য এমন কোনও সেক্টরে কিছুই লেখা নেই যা পড়া হয়নি। এটি অর্জনের একটি উপায় বাফারকে পরিচয় করিয়ে দেওয়া:

$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 | dd of=/dev/sdj2 seek=4096

প্রত্যাশাটি হ'ল mbufferলেখকের কাছে কোনও কিছু দেওয়ার আগে 4096 টি ব্লক সংরক্ষণ করা হবে, সুতরাং এটি নিশ্চিত করা যায় যে এমন কোনও অঞ্চলে কিছুই লেখা নেই যা পড়া হয়নি এবং লেখক বাফারের আকারে পাঠককে পিছনে ফেলে রাখেন। বাফারের উচিত পাঠক এবং লেখককে এই সীমাবদ্ধদের মধ্যে যত দ্রুত সম্ভব পরিচালনা করা উচিত।

তবে এটি নির্ভরযোগ্যভাবে কাজ করছে বলে মনে হয় না। আমি প্রকৃত ডিভাইসগুলি ব্যবহার করার চেষ্টা করেছি তবে এটি কখনই কার্যকর হয় না, যেখানে কোনও ফাইলের পরীক্ষাগুলি আমার -৪-বিট বাক্সে কাজ করেছিল তবে আমার 32-বিট বাক্সে নয়।

প্রথমত, কিছু প্রস্তুতি:

$ dd if=/dev/sdj2 count=200704 | md5sum
0f0727f6644dac7a6ec60ea98ffc6da9
$ dd if=/dev/sdj2 count=200704 of=testfile

এটি কাজ করে না:

$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 -H | dd of=/dev/sdj2 seek=4096
summary: 98.0 MiByte in  4.4sec - average of 22.0 MiB/s
md5 hash: 3cbf1ca59a250d19573285458e320ade

এটি 64৪-বিট সিস্টেমে কাজ করে তবে 32-বিট সিস্টেমে নয়:

$ dd if=testfile count=200704 | mbuffer -s 512 -b 4096 -P 100 -H | dd of=testfile seek=4096 conv=notrunc
summary: 98.0 MiByte in  0.9sec - average of  111 MiB/s
md5 hash: 0f0727f6644dac7a6ec60ea98ffc6da9

এটি নির্ভরযোগ্যভাবে কীভাবে করা যায়?


মন্তব্য

আমি বাফারিং সম্পর্কিত অন্যান্য প্রশ্নগুলি পড়েছি এবং দেখেছি pv, bufferএবং mbuffer। আমি কেবলমাত্র পরবর্তী বাফার আকারের সাথে কাজ করতে পারি।

ইন্টারমিটিয়েট স্টোরেজ ব্যবহার করা সমস্যাটির একটি সুস্পষ্ট সমাধান যা সর্বদা কাজ করে তবে পর্যাপ্ত অতিরিক্ত ক্ষমতা উপলব্ধ না হলে এটি ব্যবহারিক হয় না।

mbufferসংস্করণ 20140302 সহ আর্চ লিনাক্স চালিত টেস্ট প্ল্যাটফর্মগুলি ।


আমি মনে করি না এটি সমস্যার সমাধান করবে, কিন্তু কৌতূহলের বাইরে কেন এগুলি কেন ব্যবহার করা mbufferযায়? পরিবর্তে ddএকসাথে ব্লক ডিভাইসের পুরো বিষয়বস্তু পড়তে হবে না কেন dd bs=102760448? অবশ্যই, একটি উপায় বা অন্যটি এটি র‌্যামে বাফার করেছে।
সেলেদা

@ কেলাডা - ১০০ এমবি উদাহরণ মাত্র একটি উদাহরণ। 1TB পড়া, উদাহরণস্বরূপ, একসাথে এমন ভাল ধারণা হবে না।
স্টারফ্রি

2
আহ, আমি এখন বুঝতে পারি, ধন্যবাদ। mbufferআসলে দ্বিতীয় বাধ্য করা উচিত ddপ্রথম পশ্চাতে থাকে এবং আপনি শুধুমাত্র শিফট মাপের বাফার যথেষ্ট র্যাম প্রয়োজন। খুব খারাপ খারাপ দিকগুলি ddপিছনের ক্রমে ব্লকগুলি পড়া এবং লেখা সমর্থন করে না কারণ এটি সমস্যাটি দূর করবে!
সেলেদা

আপনি কীভাবে দ্বিতীয়
এমডি

@ পিপুসি, দ্বিতীয় এমডি 5 হ'ল এমবাফার দ্বারা আউটপুট (এর -Hযুক্তিটি এই বৈশিষ্ট্যটি সক্ষম করে)।
স্টারফ্রি

উত্তর:


2

বাফার ব্যতীত আপনি পিছনে যেতে পারেন, একবারে একটি ব্লক।

for i in $(seq 100 -1 0)
do
    dd if=/dev/thing of=/dev/thing \
       bs=1M skip=$i seek=$(($i+2)) count=1
done

দয়া করে মনে রাখবেন ত্রুটি পরীক্ষা করার অভাবে এই উদাহরণটি বিপজ্জনক।

ddকলগুলির পরিমাণের কারণে এটিও ধীর । আপনার যদি বাঁচানোর মতো স্মৃতি থাকে তবে আপনি বৃহত্তর ব্লকসাইজ ব্যবহার করতে পারেন।

একটি বাফার দিয়ে, বিপদ থেকে সাবধান থাকুন । এটি 100% প্রিফিল গ্যারান্টি যথেষ্ট নয় । আপনার যা প্রয়োজন তা পুরো প্রক্রিয়া জুড়ে ন্যূনতম পূরণ। বাফারটি কখনই নীচে নেমে আসবে না 2Mকারণ অন্যথায় আপনি আপনার পড়ার মতো এখনও পড়া ডেটা ওভাররাইট করে ফেলবেন।

সুতরাং তত্ত্বের ক্ষেত্রে আপনি কোনও ধরণের বাফার এবং কেবল চেইন ছাড়াই করতে পারেন dd:

dd if=/dev/thing bs=1M | \
dd bs=1M iflag=fullblock | \
dd bs=1M iflag=fullblock | \
dd of=/dev/thing bs=1M seek=2

বাস্তবে এটি নির্ভরযোগ্যভাবে কাজ করে না কারণ প্রথমে ddডেটা পড়া চালিয়ে যাওয়ার কোনও গ্যারান্টি নেই , যখন সর্বশেষ dd( 2M"বাফার" এর মধ্যে) ইতিমধ্যে লিখছে।

আপনি বাফারের মধ্যে যথেষ্ট বড় করে আপনার সম্ভাবনাগুলিকে যথেষ্ট পরিমাণে বাড়িয়ে তুলতে পারেন, তবুও এটি নির্ভরযোগ্য নয়।

দুর্ভাগ্যক্রমে আমি ন্যূনতম পূরণের সম্পত্তি সহ একটি ভাল বাফার প্রোগ্রাম জানি না। আপনার এমন একটি দরকার যা আউটপুট থামিয়ে দেয় যতক্ষণ না বাফারের মধ্যে আপনার সুরক্ষা মার্জিনের চেয়ে কম থাকে।


আমি এটি গ্রহণ করেছি কারণ এটি কীভাবে ddব্যবহার করা যেতে পারে তা প্রদর্শনের মাধ্যমে মূল প্রশ্নের উত্তর দেয় । তবে আমি মনে করি যে আসল সমাধানটি ব্যবহার করা ddনয় বরং এর পরিবর্তে পিছনের দিকে চালানোর জন্য নকশাকৃত কোনও কিছুর বিকল্প বেছে নিন ddrescue। আমি একটি উত্তরে এটি করার একটি উপায় বর্ণনা করেছি।
তারকাচিহ্ন

1
@ স্টারফাই: অবশ্যই, একটি প্রোগ্রাম যা এটি করে তা একটি দুর্দান্ত সমাধান হবে। তবে আমি ddrescueএখানে সম্পর্কে মোটেও নিশ্চিত নই । যদি এটি বিভিন্ন ডিভাইসে কাজ করার প্রত্যাশা করে না, এবং আপনার যুক্তি স্বীকার করার জন্য আপনাকে এটি চালিত করতে হবে। এটি অভ্যন্তরীণভাবে "ন্যূনতম বাফার ফিল" সম্পত্তি নাও থাকতে পারে (যেহেতু বিভিন্ন ডিভাইসের সাথে এটির প্রয়োজন হয় না), তাই এটি আবার আপনার ডেটাটিকে দূষিত করতে পারে। আপনার উত্সের কোডটি এটি আপনার ব্যবহারের ক্ষেত্রে তৈরি করা হয়েছে কিনা তা যাচাই করতে হবে।
frostschutz

1

আপনি 4096 টি ব্লক পড়ছেন, এবং তারপরে 4096 ব্লকগুলি ডিস্কের পরবর্তী 4096 ব্লকে লিখছেন, এভাবে দ্বিতীয় 4096 ব্লকগুলি পড়ার আগে ওভাররাইট করে। কোনও লেখা শুরু করার আগে সেই দ্বিতীয় 4096 পেতে আপনার 8129 ব্লকটি পড়তে হবে এবং তারপরে আপনার পরবর্তী 4096 পড়ার আগে কেবল 4096 ব্লক লিখতে হবে।

এটি কোন ধরণের ফাইল সিস্টেমের কথা উল্লেখ করেনি। যদি এটি এক্সট্রা [234] হয় এবং আপনার e2fsprogs এর সাম্প্রতিক সংস্করণ রয়েছে তবে আপনি ব্যবহার করতে পারেন e2image -ra -O 512 /dev/sdj2। ভলিউমের ফাঁকা জায়গাটি এড়িয়ে যাওয়ার জন্য যথেষ্ট স্মার্ট হওয়ারও এটির অতিরিক্ত সুবিধা রয়েছে।


এটি পড়ার সময় এটি বোধগম্য হয় এবং আমি তার উপর ভিত্তি করে অন্য চেহারা নিতে চলেছি। তবে কেন এটি পরীক্ষার ফাইলে কাজ করেছে তা ব্যাখ্যা করে না।
তারকাচিহ্ন

ফাইল সিস্টেম পুনরায়, আপনি কি আমার পরীক্ষার ফাইল যুক্ত ফাইল সিস্টেমের কথা উল্লেখ করছেন? এটি ext4তবে ব্লক ডিভাইসের অনুলিপিটির জন্য, কোনও ফাইল সিস্টেম অপ্রাসঙ্গিক হওয়া উচিত।
তারকাচিহ্ন

@ স্টারফ্রাই, জেনেরিক উপায়ে এটি করার একমাত্র উপায়টি হ'ল ইমানুয়েল প্রস্তাবিত অ্যালগরিদম (শেষ থেকে পিছনে কাজ করা) ব্যবহার করুন যা জিপিআর্ট যা করে।
psusi

ব্লকের আকার পুনরায়, আমি বৃহত্তর ব্লকগুলি চেষ্টা করেছি (আমার প্রশ্নে এটি লেখা উচিত ছিল)। আমি দেখেছি যে এটি একটি 64 কে সেক্টর বাফার এমনকি আরও নির্ভরযোগ্য হয়ে উঠেনি। নির্ভরযোগ্য সমাধান হ'ল পিছনের দিকে চালানো, এমন কিছু যা ddনা করে।
স্টারফ্রি

1

একটি নির্ভরযোগ্য সমাধানের জন্য আপনাকে অবশ্যই নিশ্চিত করা হয়েছে যে কোনও কিছু এমন কিছু লেখেনি যা সম্ভবত পড়া হয়নি এবং এটি অর্জনের একমাত্র আসল উপায় হ'ল অনুলিপিটি অনুলিপিতে পরিচালনা করা।

ddrescueটুল একটি বিপরীত দিক কাজ করতে পারেন কিন্তু এটা ইনপুট এবং আউটপুট একই হচ্ছে চালানোর জন্য রাজি। তবে এটি ডিভাইস নোডের নকল করে এটি চালিত করা সম্ভব।

আমি কিছু দ্রুত পরীক্ষা-নিরীক্ষা করেছি এবং এটি কাজ করে বলে মনে হচ্ছে। কমান্ড-লাইনটি হ'ল:

$ ddrescue -f -R -s 200704s -o 4096s /dev/sdj11 /dev/sdj11_copy

যুক্তিগুলি হল

  • -f এটি কোনও বিদ্যমান আউটপুট ডিভাইসে লিখতে বাধ্য করার প্রয়োজন
  • -R এটিকে বিপরীত দিকে কাজ করতে বলে
  • -sকতটা ইনপুট অনুলিপি করতে হবে তা বলবে ( sসেক্টরের সংখ্যা নির্দিষ্ট করতে আমি প্রত্যয়টি ব্যবহার করেছি )
  • -oলেখার আগে আউটপুট ডিভাইসে সামনের দিকে এগিয়ে যেতে বলে ( sপ্রত্যয় সহ আবার সেক্টরে নির্দিষ্ট করা )
  • /dev/sdj11 পড়ার জন্য ব্লক ডিভাইস
  • /dev/sdj11_copy লেখার জন্য ব্লক ডিভাইস

এর পরামিতিগুলির /dev/sdj11_copyসাথে mknodমেলে আমি তৈরি করেছি /dev/sdj11

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

এটি আমার আসল প্রশ্নের উত্তর দেয় না যা কীভাবে এটি অর্জন করবে জিজ্ঞাসা করেছিল ddতবে আমি মনে করি, অন্যান্য উত্তরগুলি পড়ে, তার উত্তরটি এটি ddকরতে পারে না।


ddrescueএই পরিস্থিতিতে খারাপ ব্লক আবিষ্কার হলে কী হবে ? যদি এটি ডিস্কের অন্য কোনও অঞ্চলে যায় (খারাপ ব্লকগুলি এড়াতে) এবং সেখান থেকে অনুলিপি চালিয়ে যেতে থাকে তবে এটি আবার আপনার ডেটার অনুলিপি করা অংশগুলিকে ওভাররাইট করতে পারে। যদি এটি একই ডিভাইসটির সাথে কাজ করার প্রত্যাশা না করে তবে বিভিন্ন সম্ভাব্য ডেটা দুর্নীতির ঘটনা রোধ করার জন্য কোনও বিশেষ ব্যবস্থা নেওয়ার কোনও কারণ নেই।
frostschutz

আমি সম্মত হই যে এটি একটি সম্ভাব্য সমস্যা তবে আমি প্রান্তের মামলার দিকে নজর দিইনি, যেহেতু আমি এটি আমার প্রয়োজনের জন্য ব্যবহার করতে সক্ষম হয়েছি। ddrescueখারাপ ডেটা পুনরুদ্ধার করার জন্য এর প্রচেষ্টা সীমাবদ্ধ করার বিকল্প রয়েছে তবে আমি সেগুলি ব্যবহার করে দেখিনি।
স্টারফাই

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