আমি কীভাবে একটি লিনাক্স ডিস্ক চিত্রকে একটি স্পার ফাইলে রূপান্তর করব?


12

আমার একটি ডিস্ক ইমেজগুলির একটি গুচ্ছ রয়েছে, যা একটি এক্সটি পার্টিশনে ddrescue দিয়ে তৈরি করা হয়েছে এবং আমি মাউন্টযোগ্য অবস্থায় থাকা অবস্থায়, ডেটা হারানো ছাড়াই তাদের আকার হ্রাস করতে চাই।

আমি কীভাবে ইমেজের ফাইল সিস্টেমে শূন্য স্থানটি জিরো দিয়ে পূরণ করতে পারি, এবং তারপরে ফাইলটিকে একটি বিচ্ছুরিত ফর্মে রূপান্তর করতে পারি যাতে এই ফাঁকা স্থানটি আসলে ডিস্কে সঞ্চয় না হয়?

উদাহরণ স্বরূপ:

> du -s --si --apparent-size Jimage.image 
120G Jimage.image
> du -s --si Jimage.image 
121G Jimage.image

এটিতে এটিতে কেবলমাত্র 50G এর আসল ডেটা রয়েছে, তবে দ্বিতীয় পরিমাপটি আরও ছোট হওয়া উচিত।

সম্ভবত এটি শূন্যস্থান পূরণ করবে:

cat /dev/zero > zero.file
rm zero.file

তবে যদি স্পার্স ফাইলগুলি স্বচ্ছভাবে পরিচালিত হয় , তবে এটি ভার্চুয়াল ডিস্কটিতে কিছু না লিখে আসলে একটি স্পার ফাইল তৈরি করতে পারে, ভার্চুয়াল ডিস্ক চিত্রটি একটি স্পার্স ফাইলের মধ্যে রূপান্তরিত করতে ব্যঙ্গাত্মকভাবে আমাকে বাধা দেয়। :) এটা কি পারে?

দ্রষ্টব্য: কিছু কারণে, sudo dd if=/dev/zero of=./zero.fileযখন catমাউন্ট করা ডিস্ক চিত্রে না থাকে তখন কাজ করে।


2
একটি ফাইলের মধ্যে শূন্যগুলি লিখলে কোনও স্পার্স ফাইল তৈরি হবে না। এটি ভিন্ন ধারণা। যখন আপনি কোনও অপ্রয়োজনীয় ফাইল সন্ধান করেন / পড়েন যখন ওএস ডেটা-র ব্লকটি সত্যিই সেখানে না থাকে (ব্লক তালিকাটি সেই অঞ্চলের ডেটার জন্য খালি থাকে) এটি (ওএস) অটো যাদুতে শূন্য বাইট সহ পঠিত বাফারটি পূরণ করে।
হোটেই

দ্রষ্টব্য: sudo cat /dev/zero > zero.fileকাজ করে না কারণ আপনার ব্যাশ (আপনার হিসাবে চলমান, রুট নয়) sudoকমান্ডটি কার্যকর করার আগে পুনর্নির্দেশটি করে । দেখুন unix.stackexchange.com/questions/1416/...
ফ্রিটজ

উত্তর:


19

প্রথমত, স্পার্স ফাইলগুলি কেবল স্বচ্ছভাবে পরিচালনা করা হয় আপনি যদি সন্ধান করেন তবে আপনি শূন্যগুলি লেখেন না not

এটি আরও পরিষ্কার করার জন্য, উইকিপিডিয়া থেকে উদাহরণ

dd if=/dev/zero of=sparse-file bs=1k count=0 seek=5120

কোনও জিরো লেখেন না , এটি আউটপুট ফাইলটি খুলবে, 5 এমবি অনুসন্ধান করবে ( তারপরে ঝাঁপিয়ে যাবে) এবং তারপরে শূন্যটি শূন্য লিখবে (অর্থাত্ কিছুই নয়)। এই আদেশ ( উইকিপিডিয়া থেকে নয় )

dd if=/dev/zero of=sparse-file bs=1k count=5120

5MB জিরো লিখবে এবং একটি স্পার্স ফাইল তৈরি করবে না!

ফলস্বরূপ, একটি ফাইল যা ইতিমধ্যে অপ্রয়োজনীয় পরে যাদুকরীভাবে পরে স্পার্স হয়ে উঠবে না।

দ্বিতীয়ত, প্রচুর জিরো স্পার্স সহ একটি ফাইল তৈরি করতে আপনাকে এটি সিপি করতে হবে

cp --sparse=always original sparsefile

বা আপনি ব্যবহার করতে পারেন আলকাতরা 's অথবা rsync পাশাপাশি এর --sparse বিকল্প।


1
উইকিপিডিয়া অনুসারে, ডিডি সহ জিরো লিখলে একটি স্পার ফাইল তৈরি হবে। "অনুসন্ধান" এর অর্থ কী আপনি ব্যাখ্যা করতে পারেন?
এন্ডোলিথ

1
তাহলে বিড়ালের কী হবে? বিচ্ছিন্ন ফাইলগুলি সম্পর্কে ম্যান পৃষ্ঠায় কিছুই নেই, তাই আমি ধরে নিই cat /dev/zero > zero.fileযে শূন্যের সাথে খালি স্থানটি পূরণ করা পুরোপুরি ঠিক আছে?
লুডউইগ ওয়েইঞ্জিয়রেল

2
@ এন্ডোলিথ: জিরো ddলেখার জন্য বা সন্ধানের জন্য কী কী পার্থক্য রয়েছে তা পরিষ্কার করে দেওয়ার জন্য আমার উত্তর আপডেট করেছে।
mihi

2
@ লুডভিগ ওয়েইঞ্জিয়রল: হ্যাঁ, এই catআদেশটি আপনার সম্পূর্ণ ডিস্কটি (বা কমপক্ষে মূলের জন্য বা কোটা দ্বারা সংরক্ষিত নয়) পূরণ করবে এবং " স্প্রেস" জিরো দিয়ে কোনও স্পার ফাইল তৈরি করবে না।
mihi

1
@ এন্ডোলিথের জন্য আপনার অতিরিক্ত স্থানের দরকার হবে, হ্যাঁ। তবে যেহেতু আপনি টার্বল সংকোচন করতে পারেন, আপনার কেবলমাত্র মূল ফাইল এবং স্পার ফাইলের সংক্ষেপিত সংস্করণের জন্য স্থান প্রয়োজন।
মিহি

12

জায়গাটিতে কোনও ফাইল স্পার্সাইফাই করার সবচেয়ে সহজ উপায় হ'ল fallocateইউটিলিটিটি নিম্নরূপ ব্যবহার করা :

fallocate -v --dig-holes {file_name}

fallocate (1) দ্বারা প্রদান করা হয় util-লিনাক্স উপর প্যাকেজ ডেবিয়ান


1
কিছু কারণে, fallocate --dig-holes, 299GiB মূল থেকে 103GiB ফাইল ফলে যখন cp --sparse=alwaysআমাকে 93GiB দিলেন - একই SHA1 এ সমষ্টি সঙ্গে সমস্ত (মাপ মাধ্যমে চেক করা du -B1Gবনাম du --apparent-size -B1G)। তাই fallocateনিকৃষ্ট ফলাফল দেয় বলে মনে হচ্ছে।
রুসলান

3

সম্পূর্ণতার জন্য আমার উত্তর সম্পাদনা করা:

  1. শূন্য সহ বেলুন খালি এফএস স্পেস (সতর্কতা: এটি আপনার ডিস্কের চিত্র পরিবর্তন করে):

losetup --partscan --find --show disk.img

ধরুন এটি / dev / loop1 কে ডিস্ক হিসাবে দেয় এবং কেবল একটি পার্টিশন রয়েছে, অন্যথায় আমাদের প্রতিটি পার্টিশনের মাউন্টেবল এফএস এর সাথে এটি পুনরুক্ত করতে হবে (স্ব্যাপ পার্টিশন ইত্যাদি উপেক্ষা করুন)।

mkdir -p /mnt/tmp mount /dev/loop1p1 /mnt/tmp dd if=/dev/zero of=/mnt/tmp/tempfile

এটি ENOSPC- এর সাথে ব্যর্থতার অবসান হোক।

/bin/rm -f /mnt/tmp/tempfile umount /mnt/tmp losetup -d /dev/loop1

  1. একটি বিচ্ছিন্ন ছবিতে অনুলিপি করুন:

'ডিডি' এর সাথে শূন্যের সাথে একটি ফাইলকে একটি বিচ্ছিন্ন ফাইলে রূপান্তর করতে একটি বিকল্প রয়েছে:

dd if=disk.img of=disk-sparse.img conv=sparse



1
হ্যাঁ, এই বিকল্পটি ওপি জিজ্ঞাসা করার সময় থেকে নয়। এটি "অন্যান্য অনুসন্ধানকারীদের জন্য একটি রুটির টুকরো রেখে দিন" এর চেয়ে বেশি ছিল ... :-)
লাম দাস

1
ফাইল সিস্টেমের ধরণের উপর নির্ভর করে, ফাইল সিস্টেমে জিরো zerofreeমাউন্ট করা এবং লেখার চেয়ে দ্রুত হতে পারে এবং যদি ইতিমধ্যে প্রচুর শূন্য থাকে তবে ডিস্ক চিত্রটি কম বাড়ায়।
মিহি

2

আপনি কি বলতে চাইছেন যে আপনার ডিড্রেসকিউ তৈরি চিত্রটি, 50 জিবি এবং বাস্তবে এর চেয়ে কম কিছু যথেষ্ট হবে?

যদি এটি হয় তবে আপনি প্রথমে ডিডি সহ একটি নতুন চিত্র তৈরি করতে পারবেন না:

dd if=/dev/zero of=some_image.img bs=1M count=20000

এবং তারপরে এটিতে একটি ফাইল সিস্টেম তৈরি করুন:

mkfsofyourchoice some_image.img

তারপরে কেবল চিত্রটি মাউন্ট করুন, এবং পুরানো চিত্র থেকে নতুন কোনওটিতে অনুলিপি করবেন? এটা কি আপনার জন্য কাজ করবে?


2

পার্টিম্যাজ এমন ডিস্ক চিত্র তৈরি করতে পারে যা কেবলমাত্র একটি ফাইল সিস্টেমের ব্যবহৃত ব্লকগুলি সঞ্চয় করে, অব্যবহৃত ব্লককে উপেক্ষা করে প্রয়োজনীয় স্থানটিকে তাত্পর্যপূর্ণভাবে হ্রাস করে। আমি মনে করি না আপনি ফলাফলের চিত্রগুলি সরাসরি মাউন্ট করতে পারবেন, তবে যাচ্ছেন:

image -> partimage -> image -> cp --sparse=alway

আপনি যা চান তা উত্পাদন করা উচিত (শেষ ধাপটি আটকে রাখাও সম্ভব হতে পারে, চেষ্টা করেনি)।


1
দুর্ভাগ্যক্রমে পার্টিমেজ দ্বারা নির্মিত চিত্রগুলি আবার প্রসারিত না করে মাউন্টযোগ্য নয়, কেবল সংরক্ষণাগারগুলির জন্য এগুলি উপযুক্ত করে তোলে।
পার্কিনস

0

এখানে এখন গুণ -স্পারসিফাই নামে একটি সরঞ্জাম রয়েছে যা এটি করবে। এটি শূন্যস্থান দিয়ে শূন্যস্থান পূরণ করে এবং তারপরে ছবিটি একটি স্পার্স ফাইলটিতে অনুলিপি করে। যদিও এর জন্য অনেকগুলি নির্ভরতা ইনস্টল করা প্রয়োজন।


-2

আমার সন্দেহ হয় আপনার যদি সেই স্পষ্টটিতে লিখিত একটি কাস্টম প্রোগ্রামের প্রয়োজন হয় তবে এটি যদি আপনি সত্যিই করতে চান তবে। তবে কি ...?

যদি আপনি আসলে সমস্ত শূন্য অঞ্চল পেয়ে থাকেন তবে কোনও ভাল সংক্ষেপণের সরঞ্জাম এটি উল্লেখযোগ্যভাবে নেমে আসবে। এবং স্পার্স ফাইলগুলি লেখার চেষ্টা সব ক্ষেত্রে কার্যকর হবে না। আমি যদি সঠিকভাবে স্মরণ করি তবে স্পার্স ফাইলগুলিও সর্বনিম্ন 1 টি আউটপুট স্টোরেজ গ্রহণ করে যেখানে ইনপুট ব্লকে যে কোনও বিট থাকে যা শূন্য নয়। উদাহরণস্বরূপ - বলুন যে আপনার কাছে এমন একটি ফাইল ছিল যা 512 বাইট ব্লকে প্রতি গড়ে 1 টি নন-শূন্য বিট ছিল - এটি "খুব কম" লেখা যায় না। যাইহোক, আপনি জিপ, বিজিপ, বিজিপ 2 বা পি 7 জিপ দিয়ে ফাইলটি সংকুচিত করলে আপনি ডেটা হারাবেন না। এগুলি এমপিগ বা জেপিগ সংক্ষেপণের মতো নয় যা ক্ষয়ক্ষতিযুক্ত।

অন্যদিকে, যদি আপনাকে ফাইলটিতে র্যান্ডম সন্ধান করতে হয় তবে সংক্ষেপণটি এর চেয়ে মূল্যবান হতে পারে এবং আপনি বিরল লেখায় ফিরে এসেছেন। একজন সক্ষম সি বা সি ++ প্রোগ্রামার এমন এক ঘন্টা বা তারও কম সময়ের মধ্যে এমন কিছু লিখতে সক্ষম হবে।


আকর্ষণীয় - একটি ডাউনটোট এখনও তবুও আমি লক্ষ্য করেছি যে আমি যা লিখেছি তার খণ্ডন নেই। যদি এটি সঠিক তবে অপ্রয়োজনীয় হয় তবে এটি হ্রাস করার কোনও কারণ নয়। যদি এটি সঠিক না হয় এবং সহায়ক না হয় তবে এটি তার প্রাপ্য।
হোটেই

আমি অন্য কোথাও দেখতে পাচ্ছি যে ওপিতে সংকীর্ণ চিত্রগুলি মাউন্ট করার ক্ষেত্রে একটি প্রশ্ন ছিল। আমি ধরে নিচ্ছি এটি এই থ্রেডের একটি ধারাবাহিকতা। জেনেও যে আমি এখন দেখতে পাচ্ছি যে আমার সংকোচনের পরামর্শটি কেন গৃহীত হয়নি। একটি সাধারণ সি প্রোগ্রাম হ'ল স্পার্স ফাইলগুলি তৈরি করার একটি সহজ উপায়। তবে - (অনির্দিষ্ট) ওএস আপনাকে একটি বিচ্ছিন্ন আইএসও মাউন্ট করতে দেবে। উবুন্টু আইএসওর মাউন্টারের মতো বাছাই আমি 100% নিশ্চিত নই যে এটি কাজ করে চলেছে ... তবে যে কোনও ক্ষেত্রে শুভকামনা।
হোটেই

4
চাকা পুনরুদ্ধার কেন? cp --sparse=alwaysকাজটি
ঠিকঠাক করে

@ মিমি: এটি একটি ভাল ধারণা। আমি বিচ্ছিন্ন বিকল্প সম্পর্কে জানতাম না কারণ এটি বিএসডি স্বাদে পাওয়া যায় না ( freebsd.org/cgi/… ) এবং আমার সিপি (আজ অবধি) জন্য লিনাক্স ম্যান পৃষ্ঠা দেখার প্রয়োজন হয়নি।
হোটেই

আপনার সংকুচিত চিত্রগুলি রাখা এবং সেগুলিও মাউন্ট করার একটি উপায় হ'ল দেশীয় সংকোচন সমর্থন করে এমন একটি ফাইল সিস্টেমে কেবল সঞ্চয় করা। আপনার যদি ড্রাইভ ক্র্যাশ হয় তবে ডেটা পুনরুদ্ধারটিকে ভয়ঙ্কর করে তোলে, তবে ব্যাকআপগুলির জন্য এটি ঠিক তাইনা?
পার্কিনস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.