मेरे पास 4 जीबी एसडी कार्ड से डीडी छवि है जिसमें दो विभाजन हैं, ये दो विभाजन केवल लगभग 800 एमबी का उपयोग कर रहे हैं और जैसे कि मैं img फी के आकार को कम करना चाहता हूं।
किसी को भी img फ़ाइल से "मुक्त स्थान" को हटाने का एक तरीका पता है?
मेरे पास 4 जीबी एसडी कार्ड से डीडी छवि है जिसमें दो विभाजन हैं, ये दो विभाजन केवल लगभग 800 एमबी का उपयोग कर रहे हैं और जैसे कि मैं img फी के आकार को कम करना चाहता हूं।
किसी को भी img फ़ाइल से "मुक्त स्थान" को हटाने का एक तरीका पता है?
जवाबों:
पहले सुनिश्चित करें कि मुक्त स्थान वास्तव में खाली है, और हटाए गए फ़ाइलों के बचे हुए नहीं हैं। इसे प्राप्त करने का सबसे आसान तरीका डिस्क पर एक बड़ी फ़ाइल बनाना है, जिसमें केवल नल बाइट्स हैं, फिर इसे हटा दें।
# 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 के लिए qcow2, VirtualBox के लिए VDI, या VMware के लिए VMDK।
ध्यान दें कि इसके बाद भी आपको उपरोक्त विधि का उपयोग करके खाली स्थान की सफाई करके छवि तैयार करने की आवश्यकता है।
# qemu-img convert -f raw -O qcow2 foo.img foo.qcow
# qemu-img convert -f raw -O vmdk foo.img foo.vmdk
लेकिन अगर यह फिर से एक वास्तविक डिस्क पर लिखा जा रहा है, तो आपको इसे एक कच्ची छवि में बदलना होगा।
resize2fs
या ntfsresize
लिनक्स में FAT के लिए कोई टूल नहीं है), इसे छोटे डिवाइस पर लिखने से पहले, या सिर्फ फाइलों पर एक नया फाइल सिस्टम बनाकर और कॉपी करके।
का उपयोग करना resize2fs
बहुत आसान है
resize2fs -M xxx.img
आपको पहले e2fsck से पूछा जाएगा - तो:
e2fsck -f -y xxx.img
(छवि को माउंट नहीं किया जाना चाहिए!)
नोट: यह केवल तभी काम करेगा जब छवि एक ही पार्टीशन की हो, यदि यह एक पूरी ब्लॉक डिवाइस है जिसमें म्यूटेंट विभाजन के साथ उपरोक्त उत्तर देखें ...
losetup --find --partscan xxx.img
छवि फ़ाइल को लूप डिवाइस के रूप में सेटअप करने के लिए उपयोग करें। फिर lsblk
लूप डिवाइस के विभाजन को खोजने के लिए चलाएं ।
resize2fs
केवल extN
विभाजन के लिए है। अन्य प्रकार के विभाजन के लिए अन्य उपकरणों की आवश्यकता होगी।
मैंने इसे qemu-img के साथ भी आज़माया , और इसने एक आकर्षण की तरह काम किया:
qemu-img resize test.img 2G
हम test.img
इसे 2G (2GB) बनाने के लिए आकार बदल रहे हैं ।
मेरे लिए निर्दोष काम किया।
df -h
मूल आकार दिखाता है। यह कैसे हो सकता है?
मैंने अपने Ubuntu 16.10 कंप्यूटर के साथ gparted दृष्टिकोण का उपयोग किया है:
1) losetup
ऊपर के रूप में पिछले पदों में वर्णित के साथ , अगले उपलब्ध लूप विभाजन में img फ़ाइल को मैप करें
2) lsblk
किस लूप ड्राइव से चेक करें कि आपकी इमेज फाइल मैप की गई है, जैसे/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 छवि फ़ाइल होगा।