অন ​​ফ্লাই স্ট্রিম সংক্ষেপণ যা হার্ডওয়্যার সংস্থানগুলিতে ছড়িয়ে পড়ে না?


23

আমার কাছে 200 গিগাবাইট ফ্রি ডিস্ক স্পেস, 16 গিগাবাইট র‌্যাম (যার মধ্যে ~ 1 জিবি ডেস্কটপ এবং কার্নেল দ্বারা দখল করা হয়েছে) এবং 6 গিগাবাইট অদলবদল রয়েছে।

আমার কাছে একটি 240 গিগাবাইট বাহ্যিক এসএসডি রয়েছে, 70 জিবি ব্যবহৃত 1 এবং বাকিটি বিনামূল্যে, যা আমার ডিস্কে ব্যাক আপ করতে হবে।

সাধারণত, আমি dd if=/dev/sdb of=Desktop/disk.imgপ্রথমে ডিস্কটি প্রস্তুত করব এবং তারপরে এটি সংকোচিত করব, তবে চিত্রটি তৈরি করা আমার পক্ষে বিকল্পের চেয়ে অনেক বেশি ডিস্কের জায়গার প্রয়োজন হবে না, যদিও সংকোচন পদক্ষেপের ফলে ফাঁকা স্থানটি স্কোয়াশ হয়ে যাবে ফলে চূড়ান্ত সংরক্ষণাগারটি আমার ডিস্কে সহজেই ফিট করতে পারে।

ddডিফল্টরূপে gzipSTDOUT এ লেখেন, এবং STDIN থেকে পড়তে পারেন, তাই তাত্ত্বিকভাবে আমি লিখতে পারি dd if=/dev/sdb | gzip -9 -, তবে gzipবাইটগুলি ddউত্পাদন করতে পারে তার চেয়ে বেশি সময় নেয় takes

থেকে man pipe:

পাইপের লেখার প্রান্তে লেখা ডেটা পাইপের রিড প্রান্ত থেকে পড়া না হওয়া অবধি কার্নেল দ্বারা বাফার করা হয়।

আমি |সত্যিকারের পাইপের মতো হ'ল ভিজ্যুয়ালাইজ করি - একটি অ্যাপ্লিকেশন স্থান পরিবর্তনকারী ডেটা এবং অন্যটি পাইপের সারি থেকে যত তাড়াতাড়ি সম্ভব ডেটা নিয়ে যায়।

যখন বাম পাশের প্রোগ্রামটি পাইপের অন্য প্রান্তের চেয়ে দ্রুত আরও বেশি ডেটা লিখবে তখন এটি প্রক্রিয়া করার আশা করতে পারে? এটি কি চরম স্মৃতি বা অদলবদলের জন্য কারণ তৈরি করবে বা কার্নেলটি ডিস্কে একটি ফিফো তৈরি করার চেষ্টা করবে, যার ফলে ডিস্কটি পূরণ করবে? বা SIGPIPE Broken pipeবাফার খুব বেশি হলে এটি কি ব্যর্থ হবে ?

মূলত, এই দুটি প্রশ্ন উত্থিত:

  1. একবারে পড়ার চেয়ে পাইপে আরও বেশি ডেটা স্থানান্তরের কী কী প্রভাব ও ফলাফল রয়েছে?
  2. ডিস্কে সম্পূর্ণ সঙ্কুচিত ডেটাস্ট্রিম না রেখেই কোনও ডাস্টাস্ট্রিকে সংকোচন করার নির্ভরযোগ্য উপায় কী?

দ্রষ্টব্য 1: আমি ঠিক প্রথম 70 টি ব্যবহৃত জিবি অনুলিপি করতে পারি না এবং টুকরো টুকরো টুকরো টুকরো করা এবং অন্যান্য সামগ্রীর কারণে একটি ওয়ার্কিং সিস্টেম বা ফাইল সিস্টেম পাওয়ার আশা করি which


আপনি কেবল ব্যবহারকারী ডিরেক্টরিগুলির পরিবর্তে এবং সম্ভবত ইনস্টল থাকা অ-মানক সফ্টওয়্যারটির তালিকার পরিবর্তে কেন এমন একটি সম্পূর্ণ ফাইল সিস্টেমের ব্যাক আপ করবেন?
জামেস্কেফ

5
নিবন্ধন করুন কারণ এটি পুনরুদ্ধার করা অনেক সহজ ...
ডিভেন্টফ্যান

4
@ জামেস্কেফ কারণ আমি তখন বুট সেক্টর এবং অদলবদল পার্টিশনটি পেয়েছি, যাতে আমি এক বিলিয়ন বিরক্তিকর ফাইল না রেখে ডিস্কটি আবার তৈরি করতে পারি।
বিড়াল

3
এলোমেলো পরামর্শ: lzopপরিবর্তে অনুসন্ধান gzip; এটি কেবলমাত্র একটি স্বল্প নিম্নতর সংক্ষেপণের অনুপাত সহ অনেক দ্রুত সংকোচিত হয়। আমি এটি ডিস্ক চিত্রগুলির জন্য আদর্শ মনে করি যেখানে সংক্ষেপণের গতি সত্যিকারের বাধা হতে পারে।
মার্সেলম

1
"যখন বাম পাশের প্রোগ্রামটি পাইপের অন্য প্রান্তের চেয়ে দ্রুত আরও বেশি ডেটা লিখবে তখন এটি প্রক্রিয়া করার আশা করতে পারে?" পাইপে আরও জায়গা না পাওয়া পর্যন্ত কার্নেল লেখার প্রক্রিয়াটিকে ঘুমিয়ে দেবে।
তাভিয়ান বার্নস

উত্তর:


16

প্রযুক্তিগতভাবে আপনার এমনকি প্রয়োজন নেই dd:

gzip < /dev/drive > drive.img.gz

যদি আপনি এটি ব্যবহার করেন তবে আপনার ddসর্বদা ডিফল্ট ব্লকসাইজের মতো সাইস্কেল হেলকের চেয়ে বড় হওয়া dd bs=1Mবা ভোগা উচিত ( ddএর ডিফল্ট ব্লকসাইজ 512 বাইট হয়, যেহেতু এটি read()write()যে 4096প্রতি সাইক্লাল MiBখুব বেশি ওভারহেড)।

gzip -9এর জন্য দেখানোর জন্য খুব অল্প পরিমাণে অনেক বেশি সিপিইউ ব্যবহার করে। যদি gzipআপনাকে ধীর করে দিচ্ছে, সংক্ষেপণের স্তরটি কম করুন বা একটি আলাদা (দ্রুত) সংক্ষেপণ পদ্ধতি ব্যবহার করুন।

আপনি যদি ddচিত্রগুলির পরিবর্তে ফাইল ভিত্তিক ব্যাকআপগুলি করছেন তবে আপনার কিছু যুক্তি থাকতে পারে যা সিদ্ধান্ত নিতে পারে যে আদৌ সংকোচন করা উচিত কি না (বিভিন্ন ফাইলের ধরণের ক্ষেত্রে এটি করার কোনও অর্থ নেই)। dar( tarবিকল্প`) এমন একটি উদাহরণ যা এর করার বিকল্প রয়েছে।

আপনার মুক্ত স্থান শূন্য থাকেন (কারণ এটি একটি এসএসডি এর নির্ভরযোগ্যভাবে আয় TRIM পর শূন্য এবং আপনি দৌড়ে যে fstrimএবং ক্যাশে বাদ) আপনার কাছে ব্যবহার করতে পারেন ddসঙ্গে conv=sparseএকটি ডিকম্প্রেস করা, লুপ-অরোহণযোগ্য, বিক্ষিপ্ত ইমেজ তৈরি করতে ব্যবহার শূন্য এলাকায় জন্য ডিস্ক স্থান শূন্য যে পতাকা । ছদ্মবেশী ফাইলগুলিকে সমর্থন করে এমন একটি ফাইল সিস্টেমের সাহায্যে চিত্র ফাইলটি সমর্থন করা দরকার।

বিকল্পভাবে কিছু ফাইল সিস্টেমের জন্য এমন প্রোগ্রাম রয়েছে যা কেবলমাত্র ব্যবহৃত অঞ্চলগুলিই চিত্রিত করতে সক্ষম।


1
"আপনি যদি ডিডি ব্যবহার করেন তবে আপনার সর্বদা ডিফল্ট ব্লক সাইজের মতো বৃহত্তর সাথে যেতে হবে dd bs=1M" - আপনি পারেন, তবে খুব বেশি আশা করবেন না। আমার পিসিতে dd512-বাইট ব্লক সহ প্রায় 2GB / গুলি করবে। এটি বাধা হবে না; gzipহবে.
মার্সেলম

@ মার্কসেলম আমরা কখনই জানি না লোকেরা কী ধরণের মেশিন ব্যবহার করছে। আপনি যদি dd512-বাইট ব্লক সহ 2 গিগাবাইট / সেকেন্ড চালিয়ে যান তবে আমি বিস্মিত হব যদি এটি প্রক্রিয়াতে একটি সিপিইউ কোর 100% না বের করে। এখন যদি আপনার বাক্সটি একটি চতুর্ভুজ হয় যা যেভাবেই অলস বসে থাকে তবে আপনি কোনও পার্থক্য লক্ষ্য করতে পারেন না। যদিও অন্য সবাই এখনও করেন।
frostschutz

9
দীর্ঘশ্বাস. যতবার ddব্লকসাইজের কথা বলা হয়েছে, লোকেরা নিটপিক করছে। gzipসিপিইউ নিবিড় হওয়াও আমার উত্তরের অংশ ছিল, ঠিক আছে? এবং দুঃখিত, আমি "উপেক্ষিত" এর সাথে একমত নই। এটি কেবল প্রতি গিগের সাথে 1-2 ভাগ যুক্ত করতে পারে gzip -9(তবে এটি কয়েকশ জিগ প্রক্রিয়াজাতকরণের পরেও কয়েক মিনিটের পরিমাণের পরিমাণে) তবে আপনার পরামর্শটি lzop -1প্রতি গিগের তুলনায় 4s বনাম 4 গিগের সাথে নিতে হয়। আলুতে পরীক্ষিত (একক কোর ভেসার) কোনও মূল্য ব্যয় করতে একটি বুদ্ধিমান ব্লকসাইজ যুক্ত করা ddএবং এর শূন্য ডাউনসাইড রয়েছে। নিটপিক করবেন না সপ্তাহের দিন. ymmv
frostschutz

19

ddএকসাথে ডেটা এক ব্লক পড়ে এবং লেখায় এবং এর মধ্যে কেবল একটি ব্লক বকেয়া থাকে। সুতরাং

valgrind dd if=/dev/zero status=progress of=/dev/null bs=1M

ddমেমরি প্রায় 1MB ব্যবহার করে যে দেখায় । গতির গতিতে এর valgrindপ্রভাব দেখতে আপনি ব্লকের আকার এবং প্রায় ড্রপ দিয়ে খেলতে পারেন dd

আপনি যখন পাইপ করেন gzip, তখন ddকেবল gzipগতির গতি মেলে ধীর করে দেয় । এর মেমোরির ব্যবহার বৃদ্ধি পায় না, বা এটি কার্নেলটিকে ডিস্কে বাফারগুলি সংরক্ষণ করার কারণও দেয় না (কার্নেল স্ব্যাপের মাধ্যমে বাদে এটি কীভাবে করতে হয় তা জানে না )। একটি ভাঙ্গা পাইপ কেবল তখন ঘটে যখন পাইপের এক প্রান্তটি মারা যায়; দেখুন signal(7)এবং write(2)বিশদ জন্য।

এইভাবে

dd if=... iconv=fullblock bs=1M | gzip -9 > ...

আপনি যা করছেন তা করার একটি নিরাপদ উপায়।

পাইপিং করার সময়, পড়া প্রক্রিয়াটি চালিয়ে না রাখলে লেখার প্রক্রিয়াটি কার্নেল দ্বারা অবরুদ্ধ হয়ে যায়। দৌড়ে আপনি এটি দেখতে পারেন

strace dd if=/dev/zero bs=1M | (sleep 60; cat > /dev/null)

আপনি দেখতে পাবেন যে dd1 এমবি পড়েছে, তারপরে একটি ইস্যু করে write()যা সেখানে বসে এক মিনিটের জন্য অপেক্ষা করার জন্য sleep। এইভাবে পাইপের উভয় পক্ষের ভারসাম্য শেষ হয়: লেখার প্রক্রিয়াটি খুব দ্রুত হলে কার্নেল ব্লকগুলি লেখেন, এবং পড়ার প্রক্রিয়াটি খুব দ্রুত হলে এটি পড়তে অবরুদ্ধ করে।


1
যে বেশ শান্ত. গতিবেগের গতি ddকমিয়ে আনতে কোন প্রক্রিয়াটি জানে gzip? এটি স্বয়ংক্রিয় যেমন কার্নেলের মতো, বা এটি এর আউটপুট ফাইল বিবরণীর সম্পর্কে মেটাডেটা থেকে গণনা করে?
বিড়াল

9
@ কেট এটি স্বয়ংক্রিয়; পাইপ মধ্যে ডেটা রাখতে ddকল write()write()প্রকৃতপক্ষে কার্নেলের উপর নিয়ন্ত্রণ স্থানান্তর করে যাতে এটি পাইপ মেমরির ব্যবহার করতে পারে। যদি কার্নেলটি পাইপটি পূর্ণ দেখেছে তবে পাইপের পর্যাপ্ত জায়গা না হওয়া পর্যন্ত এটি অপেক্ষা করবে ("ব্লক")। তারপরেই write()কলটি শেষ হয়ে যাবে এবং নিয়ন্ত্রণটিতে ফিরে স্থানান্তরিত ddহবে যা এরপরে আবার পাইপে ডেটা লিখবে।
মার্সেলম

9

পারফরম্যান্স ব্যতীত অন্য কোনও নেতিবাচক প্রভাব নেই: পাইপের একটি বাফার থাকে যা সাধারণত K৪ কে হয় এবং তারপরে, পাইপটিতে কোনও লিখন কেবল gzipআরও কিছু ডেটা না পড়া পর্যন্ত ব্লক হয়ে যায় ।


8

এটি কীভাবে কাজ করে তা প্রকৃত প্রশ্নের উত্তরে: "যদি বাম পাশের প্রোগ্রামটি পাইপের অন্য পাশের চেয়ে আরও বেশি ডেটা আরও দ্রুত লিখতে পারে তবে এটি প্রক্রিয়া করার আশা করতে পারে?"

এটি হয় না। পাইপে মোটামুটি ছোট, সীমিত আকারের বাফার রয়েছে; দেখতে কত বড় পাইপ বাফার হয়?

একবার পাইপ বাফার পূর্ণ হয়ে গেলে প্রেরণ প্রোগ্রামটি ব্লক হয়ে যায় । যখন এটি একটি লিখিত কল দেয়, তথ্য বাফারে ডেটা না লেখা পর্যন্ত কার্নেল প্রোগ্রামটিতে নিয়ন্ত্রণ ফিরিয়ে দেয় না। এটি রিডার প্রোগ্রামকে সিপিইউ সময় দেয় যাতে বাফারটি খালি করা যায়।


3

সম্ভবত আপনার কেবল ফাইলগুলির প্রয়োজন, তারপরে টার ব্যবহার করুন। আপনি যে ব্লকগুলিতে নিজের ইচ্ছামত কিছু না রেখে জিরোগুলি পূরণ করতে পারেন, কেউ ইতিমধ্যে এটি সম্পর্কে জিজ্ঞাসা করেছে। শূন্যের সাথে অব্যবহৃত স্থান সাফ করুন (ext3, ext4)

তারপরে, pigzযা সাধারণত তুলনায় দ্রুত হয় gzip

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