Dd के साथ बनाई गई img फाइल का आकार कैसे बदलें?


19

मेरे पास 4 जीबी एसडी कार्ड से डीडी छवि है जिसमें दो विभाजन हैं, ये दो विभाजन केवल लगभग 800 एमबी का उपयोग कर रहे हैं और जैसे कि मैं img फी के आकार को कम करना चाहता हूं।

किसी को भी 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 के लिए 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

लेकिन अगर यह फिर से एक वास्तविक डिस्क पर लिखा जा रहा है, तो आपको इसे एक कच्ची छवि में बदलना होगा।


1
आप यह कैसे सुनिश्चित कर सकते हैं कि वर्तमान में विभाजनों पर संग्रहीत सभी फाइलें डिस्क पर भौतिक रूप से बिखरी हुई नहीं हैं?
वेलेरियो शांतिनेल्ली

क्योंकि मुझे लगता है कि फाइलें डिस्क पर क्रमिक रूप से नहीं लिखी गई हैं और अगर कोई फ़ाइल स्टोरेज के अंत में है, तो जब मैं आकार को काटता हूं, तो मैं उस फ़ाइल की सामग्री खो दूंगा।
वेलेरियो शांतिनेली

क्योंकि ओपी पूछ रहा है कि बिना डेटा खोए डिस्क छवि को कैसे सिकोड़ें। यदि आप एक निश्चित आकार में एक छवि को काटते हैं तो आप यह सुनिश्चित नहीं कर सकते कि डेटा संरक्षित किया जाएगा।
वेलेरियो सेंटिनेली

@ValerioSantinelli: वास्तव में मैं छवि को छोटा करने का सुझाव कहां देता हूं?
user1686

1
@ValerioSantinelli: अपने फाइल सिस्टम के लिए उपयुक्त फाइल सिस्टम-रिसाइज टूल का उपयोग करके, उदाहरण के लिए ( resize2fsया ntfsresizeलिनक्स में FAT के लिए कोई टूल नहीं है), इसे छोटे डिवाइस पर लिखने से पहले, या सिर्फ फाइलों पर एक नया फाइल सिस्टम बनाकर और कॉपी करके।
user1686

22

का उपयोग करना resize2fsबहुत आसान है

resize2fs -M xxx.img

आपको पहले e2fsck से पूछा जाएगा - तो:

e2fsck -f -y xxx.img

(छवि को माउंट नहीं किया जाना चाहिए!)

नोट: यह केवल तभी काम करेगा जब छवि एक ही पार्टीशन की हो, यदि यह एक पूरी ब्लॉक डिवाइस है जिसमें म्यूटेंट विभाजन के साथ उपरोक्त उत्तर देखें ...


बस एक नोट: कई विभाजनों के लिए, losetup --find --partscan xxx.imgछवि फ़ाइल को लूप डिवाइस के रूप में सेटअप करने के लिए उपयोग करें। फिर lsblkलूप डिवाइस के विभाजन को खोजने के लिए चलाएं ।
यिहुई ज़ियोन्ग

ऐसा लगता है कि यह आईएसओ छवि के लिए काम नहीं करता है जिसमें ऑपरेटिंग सिस्टम शामिल है। आकार बदलने के बाद सिस्टम बूट नहीं करता है।
SR

@ एसआर लिनक्स ऑपरेटिंग सिस्टम?
रॉल्फ

1
यह एक बहुत अच्छा जवाब है, लेकिन resize2fsकेवल extNविभाजन के लिए है। अन्य प्रकार के विभाजन के लिए अन्य उपकरणों की आवश्यकता होगी।
रॉल्फ

2

मैंने इसे qemu-img के साथ भी आज़माया , और इसने एक आकर्षण की तरह काम किया:

qemu-img resize test.img 2G

हम test.imgइसे 2G (2GB) बनाने के लिए आकार बदल रहे हैं ।

मेरे लिए निर्दोष काम किया।


1
बहुत बढ़िया, मेरे लिए भी निर्दोष काम किया, एक रास्पियन छवि को संकुचित करना। पूरी तरह कार्यरत!
फफिलेंद्रो

खैर, सब कुछ काम कर रहा है, हालांकि बूटिंग के बाद, रनिंग df -hमूल आकार दिखाता है। यह कैसे हो सकता है?
फुलफिंड्रो

जाहिरा तौर पर, qemu-img विभाजन तालिका नहीं है, इसलिए यह .img को कैसे संपीड़ित करता है?
फेल्डएंड्रो

मैं एक .img डिस्क को 1M का आकार बदल सकता हूं जो निश्चित रूप से डिस्क छवि को तोड़ता है। आकार को सुरक्षित बनाने के लिए कोई विचार?
lesca

1

मैंने अपने 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 छवि फ़ाइल होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.