কীভাবে ডিডি দিয়ে তৈরি ইমগ ফাইলের আকার পরিবর্তন করবেন?


19

আমার কাছে একটি 4 জিডি এসডি কার্ডের একটি ডিডি চিত্র রয়েছে যার দুটি পার্টিশন রয়েছে, এই দুটি পার্টিশনটি প্রায় 800 এমবি ব্যবহার করছে এবং যেমন আমি ইমগ ফাইয়ের আকার হ্রাস করতে চাই।

Img ফাইল থেকে "ফ্রি স্পেস" সরিয়ে ফেলার কোনও উপায় কি কেউ জানেন?


পছন্দসই ফলাফলটি আপনি কী যুক্ত করতে পারেন। উদাহরণস্বরূপ: সিডিতে সঞ্চয় করতে, কার্ডে ফিরে চিত্র।
ওয়েইন

উত্তর:


8

প্রথমে নিশ্চিত করুন যে খালি জায়গাটি আসলে ফাঁকা এবং এতে মুছে ফেলা ফাইলগুলির অবশিষ্টাংশ নেই। এটি অর্জনের সবচেয়ে সহজ উপায় হ'ল ডিস্কে একটি বিশাল ফাইল তৈরি করা, যার মধ্যে কেবল নাল বাইট থাকে, তারপরে এটি মুছুন।

# losetup --find --partscan foo.img
# lsblk
NAME      MAJ:MIN RM    SIZE RO TYPE MOUNTPOINT
loop0       7:0    0   4096M  0 loop 
├─loop0p1 259:0    0   2048M  0 loop 
└─loop0p2 259:1    0   2048M  0 loop 
# for part in /dev/loop0p*; do
    mount $part /mnt
    dd if=/dev/zero of=/mnt/filler conv=fsync bs=1M
    rm /mnt/filler
    umount /mnt
  done
dd: error writing ‘/mnt/filler’: No space left on device
dd: error writing ‘/mnt/filler’: No space left on device
# losetup --detach /dev/loop0

তারপরে gzipবা এর মতো কোনও সরঞ্জাম দিয়ে এটি সংকুচিত করুন xz। এমনকি সর্বনিম্ন সংক্ষেপণের স্তরেও, একটি দীর্ঘ সিরিজের জিরো ভালভাবে সংকোচিত হবে:

# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz

মনে রাখবেন যে ডিস্কে আবার লেখার সময় আপনাকে অবশ্যই চিত্রটি সঙ্কুচিত করতে হবে। এটি এটি 'লাইভ' সঙ্কুচিত করবে:

# cat foo.img.gz | gunzip | dd of=/dev/sda

নোট করুন যে আউটপুট ডিভাইস (এসডিএ) অবশ্যই মূল চিত্রের ফিট করার জন্য পর্যাপ্ত আকারের হতে হবে , অন্যথায় ডেটা হারিয়ে যাবে বা ক্ষতিগ্রস্থ হবে।


একটি বিকল্প পদ্ধতি, যদি আপনি চিত্রটি ব্যবহার করে চালিয়ে যেতে চান - যেমন ভার্চুয়াল মেশিনের সাহায্যে - কাঁচা চিত্রটি ভার্চুয়ালাইজেশন সফ্টওয়্যার দ্বারা ব্যবহৃত কোনও চিত্র বিন্যাসে রূপান্তর করা; উদাহরণস্বরূপ Qemu এর qQ2, ভার্চুয়ালবক্সের জন্য ভিডিআই, বা ভিএমওয়্যারের জন্য VMDK।

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

# qemu-img convert -f raw -O qcow2 foo.img foo.qcow

# qemu-img convert -f raw -O vmdk foo.img foo.vmdk

তবে যদি এটি আবার একটি বাস্তব ডিস্কে লেখা যায়, আপনাকে এটিকে আবার কোনও কাঁচা চিত্রে রূপান্তর করতে হবে।


1
আপনি কীভাবে নিশ্চিত হতে পারেন যে বর্তমানে পার্টিশনে সংরক্ষিত সমস্ত ফাইলই শারীরিকভাবে ডিস্কের চারদিকে ছড়িয়ে নেই?
ভ্যালেরিও সান্তিনেল্লি

কারণ আমি মনে করি যে ফাইলগুলি ডিস্কে ধারাবাহিকভাবে লিখিত হয়নি এবং যদি কোনও ফাইল স্টোরেজ শেষে হয়, যখন আমি আকারটি কেটে ফেলি, আমি সেই ফাইলটির বিষয়বস্তু হারাব।
ভ্যালেরিও সান্তিনেল্লি

কারণ ওপি জিজ্ঞাসা করছে যে কীভাবে ডেটা না হারিয়ে ডিস্ক চিত্রটি সঙ্কুচিত করবেন। আপনি যদি একটি নির্দিষ্ট আকারে কোনও চিত্র ছাঁটাই করেন তবে আপনি নিশ্চিত হতে পারবেন না যে ডেটা সংরক্ষণ করা হবে।
ভ্যালেরিও সান্তিনেল্লি

@ ভালেরিওসন্তাইনেলি: আমি ছবিটি কেটে দেওয়ার ঠিক কোথায় পরামর্শ দিচ্ছি?
ব্যবহারকারীর 6868

1
@ ভ্যালারিওস্যান্টাইনেলি: আপনার ফাইল সিস্টেমের জন্য উপযুক্ত ফাইল সিস্টেম-রিসাইজ সরঞ্জামটি ব্যবহার করে, উদাহরণস্বরূপ resize2fsবা ntfsresize(লিনাক্সের FAT এর কোনও সরঞ্জাম নেই), এটি ছোট ডিভাইসে লেখার আগে, বা একটি নতুন ফাইল সিস্টেম তৈরি করে এবং কেবলমাত্র ফাইলগুলিতে অনুলিপি করে।
user1686

22

ব্যবহার resize2fsকরা অনেক সহজ

resize2fs -M xxx.img

আপনাকে প্রথমে e2fsck করতে বলা হবে - সুতরাং:

e2fsck -f -y xxx.img

(চিত্র অবশ্যই মাউন্ট করা উচিত নয়!)

দ্রষ্টব্য: এটি কেবল তখনই কাজ করবে যদি চিত্রটি একক বিভাজনের হয়, যদি এটি একাধিক পার্টিশনযুক্ত পুরো ব্লক ডিভাইসটি উপরের উত্তরটি দেখে ...


কেবল একটি নোট: একাধিক পার্টিশনের জন্য, losetup --find --partscan xxx.imgলুপ ডিভাইস হিসাবে চিত্র ফাইল সেটআপ করতে ব্যবহার করুন। তারপরে lsblkলুপ ডিভাইসের পার্টিশনগুলি অনুসন্ধান করতে দৌড়াতে পারেন।
ইহুই জাইনিং

দেখে মনে হচ্ছে এটি অপারেটিং সিস্টেমযুক্ত আইএসও চিত্রের জন্য কাজ করে না। পুনরায় আকার দেওয়ার পরে সিস্টেমটি বুট হয় না।
এসআর

@ এসআর লিনাক্স অপারেটিং সিস্টেম?
রল্ফ

1
এটি খুব সুন্দর উত্তর, তবে resize2fsএটি কেবল extNটাইপ পার্টিশনের জন্য। অন্যান্য ধরণের পার্টিশনের জন্য অন্যান্য সরঞ্জামের প্রয়োজন হবে।
রল্ফ

2

আমি এটি কেমু-ইমগ দিয়েও চেষ্টা করেছি এবং এটি একটি কবজির মতো কাজ করেছে:

qemu-img resize test.img 2G

আমরা test.imgএটি 2 জি (2 জিবি) তৈরির জন্য আকার পরিবর্তন করছি ।

আমার জন্য নির্দোষ কাজ করেছেন।


1
অসাধারণ, আমার জন্যও ত্রুটিহীন পরিশ্রম করে, একটি রাস্পবিয়ান চিত্রকে সংকুচিত করে। সম্পূর্ণ কাজ!
ffleandro

ঠিক আছে, সবকিছু কাজ করছে, তবে বুট করার পরে, চলমান df -hআসল আকারটি দেখায়। এটা কিভাবে সম্ভব?
ffleandro

স্পষ্টতই, qemu-img পার্টিশন টেবিলটি করে না, সুতরাং এটি .img কে কীভাবে সংকুচিত করে?
ffleandro

আমি একটি .img ডিস্ককে 1 এম তে পুনরায় আকার দিতে পারি যা স্পষ্টভাবে ডিস্কের চিত্রটি ভঙ্গ করে। আকার পরিবর্তনকে আরও নিরাপদ করার কোনও ধারণা?
লেসকা

1

আমি আমার উবুন্টু 16.10 কম্পিউটারের সাথে জিপিআর্ট পদ্ধতির ব্যবহার করেছি:

1) losetupউপরের হিসাবে আগের পোস্টগুলিতে বর্ণিত হিসাবে পরবর্তী উপলব্ধ লুপ বিভাজনের সাথে img ফাইলটি মানচিত্র করুন

2) সাথে চেক করুন lsblk আপনার চিত্রের ফাইলটি কোন লুপ ড্রাইভের ম্যাপ করা হয়েছে তা পরীক্ষা করুন eg/dev/loop0

3) কার্যকর করুন sudo gparted /dev/loop0

4) লুপ পার্টিশন (গুলি) যথাযথ হিসাবে বিবেচনা করুন সঙ্কুচিত করুন; দয়া করে এই পার্টিশনগুলি আনমাউন্ট করা আছে কিনা তা নিশ্চিত করুন।

5) এক্সিকিউট করুন fdisk /dev/loop0, তারপরে প্রবেশ করুনp , এটি আপনাকে বিভিন্ন পার্টিশনের ব্লক আকার এবং শেষের ব্লক নম্বরটি দেখায়।

6) সম্পাদন dd if=/dev/loop0 of=shrunk_image_file.img, যে কমান্ড অপশন প্রয়োগ bs=[BlockSize]এবং count=[EndBlockNumberOfLastLoopPartition+1]এবং আপনি একটি সঙ্কুচিত এবং rightsized ইমেজ ফাইল থাকবে।

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