मैं लिनक्स डिस्क छवि को एक विरल फ़ाइल में कैसे बदलूं?


12

मेरे पास डिस्क छवियों का एक समूह है, जो एक EXT विभाजन पर 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
किसी फ़ाइल में शून्य लिखने से विरल फ़ाइल नहीं बनेगी। यह एक अलग अवधारणा है। जब आप एक विरल फ़ाइल की तलाश / पढ़ते हैं, जब ओएस को पता चलता है कि डेटा का ब्लॉक वास्तव में नहीं है (उस क्षेत्र में डेटा के लिए ब्लॉक सूची खाली है) यह (ओएस) ऑटो जादुई रूप से रीड बफ़र को शून्य बाइट्स से भरता है।
Hotei

ध्यान दें: sudo cat /dev/zero > zero.fileकाम नहीं करता है क्योंकि sudoकमांड को निष्पादित करने से पहले आपका बैश (आपके अनुसार, रूट नहीं) चल रहा है । देखें unix.stackexchange.com/questions/1416/...
फ्रिट्ज

जवाबों:


19

सबसे पहले, विरल फाइलें केवल पारदर्शी रूप से नियंत्रित की जाती हैं यदि आप चाहते हैं, न कि यदि आप शून्य लिखते हैं।

इसे और अधिक स्पष्ट करने के लिए, विकिपीडिया से उदाहरण

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

करता नहीं किसी भी शून्य लिखते हैं, यह आउटपुट फ़ाइल खुल जाएगा, की तलाश (ऊपर से छलांग) 5MB और फिर लिखने शून्य (सब पर यानी कुछ भी नहीं) शून्य। यह आदेश ( विकिपीडिया से नहीं )

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

शून्य के 5MB लिखेंगे और विरल फ़ाइल नहीं बनाएंगे!

परिणामस्वरूप, एक फ़ाइल जो पहले से ही गैर-विरल है, बाद में जादुई रूप से विरल नहीं बनेगी।

दूसरा, बहुत सारे शून्य विरल के साथ एक फ़ाइल बनाने के लिए, आपको इसे cp करना होगा

cp --sparse=always original sparsefile

या आप उपयोग कर सकते हैं टार की या rsync साथ ही के --sparse विकल्प।


1
विकिपीडिया के अनुसार, dd के साथ शून्य लिखने से एक विरल फ़ाइल बन जाएगी। क्या आप बता सकते हैं कि "तलाश" का मतलब क्या है?
एंडोलिथ जूथ

1
फिर बिल्ली के बारे में क्या? स्पार्स फ़ाइलों के बारे में मैन पेज में कुछ भी नहीं है, इसलिए मुझे लगता cat /dev/zero > zero.fileहै कि शून्य स्थान को शून्य से भरने के लिए पूरी तरह से ठीक है?
लुडविग वेन्ज़िएरल

2
@endolith: यह स्पष्ट करने के लिए कि ddज़ीरो लिखने के लिए या मांगने के लिए क्या अंतर है इसका उपयोग करने के लिए मेरे उत्तर को अपडेट करें ।
मिहि

2
@Ludwig Weinzierl: हाँ, यह catकमांड आपकी पूरी डिस्क (या कम से कम रूट या कोटा द्वारा आरक्षित नहीं है) को "वास्तविक" शून्य के साथ भर देगी, और कोई विरल फ़ाइल नहीं बनाएगी।
मिही

1
@endolith आपको अतिरिक्त स्थान की आवश्यकता होगी, हाँ। लेकिन जब से आप टारबॉल को संपीड़ित कर सकते हैं, आपको केवल मूल फ़ाइल के लिए स्थान और विरल फ़ाइल के एक संपीड़ित संस्करण की आवश्यकता होगी।
मिहि

12

संभवत: किसी फ़ाइल को स्थान पर रखने का सबसे आसान तरीका fallocateउपयोगिता का उपयोग करना होगा :

fallocate -v --dig-holes {file_name}

फैलोबेट (1) को डेबियन पर उपयोग -लिनेक्स पैकेज द्वारा प्रदान किया गया है ।


1
किसी कारण से, fallocate --dig-holes299GiB मूल से 103GiB फ़ाइल के परिणामस्वरूप, जबकि cp --sparse=alwaysमुझे 93GiB दिया गया - सभी एक ही SHA1 राशि ( du -B1Gबनाम के माध्यम से जांचे गए आकार du --apparent-size -B1G) के साथ। इसलिए fallocateहीन परिणाम देने लगता है।
रुस्लान

3

पूर्णता के लिए मेरे उत्तर का संपादन:

  1. ज़ीरो के साथ खाली FS स्पेस (WARNING: इससे आपकी डिस्क छवि बदल जाती है):

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

मान लें कि यह डिस्क के रूप में / dev / loop1 देता है और केवल एक ही विभाजन है, अन्यथा हमें इसे हर विभाजन के लिए माउंट करने योग्य FS के साथ दोहराने की आवश्यकता है (स्वैप विभाजन आदि को अनदेखा करें)।

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' के पास एक फ़ाइल को जीरो के साथ एक विरल फ़ाइल में बदलने का विकल्प है:

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



1
हां, यह विकल्प उस समय से नहीं है जब ओपी ने पूछा था। यह "अन्य खोजकर्ताओं के लिए एक रोटी का टुकड़ा छोड़ना" अधिक था ... :-)
लैम दास

1
फाइलसिस्टम के प्रकार के आधार पर, फाइलसिस्टम के zerofreeलिए ज़ीरो को माउंट करने और लिखने की तुलना में तेज़ हो सकता है, और अगर यह पहले से ही बहुत सारे ज़ीरो को सम्मिलित करता है, तो डिस्क छवि कम हो जाती है।
मिही

2

क्या आपका मतलब है कि आपकी ddresoscope बनाई गई छवि है, कहते हैं, 50 GB और वास्तव में कुछ बहुत कम पर्याप्त होगा?

अगर ऐसा है, तो आप पहले dd के साथ एक नई छवि नहीं बना सकते:

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

और फिर इसमें एक फाइल सिस्टम बनाएं:

mkfsofyourchoice some_image.img

तो बस छवि को माउंट करें, और पुरानी छवि से नई एक के लिए सब कुछ कॉपी करें? क्या वह काम तुम्हारे लिये होगा?


2

PartImage डिस्क छवियों को बना सकता है जो केवल एक फाइल सिस्टम के उपयोग किए गए ब्लॉक को स्टोर करते हैं, इस प्रकार अप्रयुक्त ब्लॉक को अनदेखा करके आवश्यक स्थान को काफी कम कर देते हैं। मुझे नहीं लगता कि आप सीधे परिणामस्वरूप छवियों को माउंट कर सकते हैं, लेकिन जा रहे हैं:

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

आप जो चाहते हैं उसका उत्पादन करना चाहिए (संभव है कि अंतिम चरण भी संभव न हो, कोशिश नहीं की गई)।


1
दुर्भाग्य से, पक्षपात द्वारा बनाई गई छवियां उन्हें फिर से विस्तारित किए बिना माउंट करने योग्य नहीं हैं, जो उन्हें केवल अभिलेखीय उद्देश्यों के लिए उपयुक्त बनाती हैं।
पर्किन्स

0

अब एक उपकरण है जिसे पुण्य-स्पर्षि कहा जाता है जो ऐसा करेगा। यह शून्य स्थान के साथ रिक्त स्थान को भरता है और फिर छवि को एक विरल फ़ाइल में कॉपी करता है। हालाँकि इसके लिए बहुत सारी निर्भरताएँ स्थापित करने की आवश्यकता होती है।


-2

मुझे संदेह है कि आपको उस कल्पना से संबंधित एक कस्टम प्रोग्राम की आवश्यकता होगी यदि वह वास्तव में है जो आप करना चाहते हैं। लेकिन क्या यह है ...?

यदि आपको वास्तव में बहुत सारे ऑल-शून्य क्षेत्र मिल गए हैं, तो कोई भी अच्छा संपीड़न उपकरण इसे काफी नीचे लाएगा। और विरल फाइलें लिखने की कोशिश सभी मामलों में काम नहीं करेगी। अगर मुझे सही तरीके से याद है, तो भी स्पार्स फाइलें आउटपुट स्टोरेज के न्यूनतम 1 ब्लॉक को लेती हैं, जहां इनपुट ब्लॉक में कोई भी बिट्स नॉन-जीरो होते हैं। उदाहरण के लिए - मान लीजिए कि आपके पास एक फाइल थी जिसमें प्रति 512 बाइट ब्लॉक में औसतन 1 गैर-शून्य बिट भी था - इसे "स्पार्सली" नहीं लिखा जा सकता है। वैसे, यदि आप फ़ाइल को ज़िप, bzip, bzip2 या p7zip के साथ संपीड़ित करते हैं, तो आप डेटा खोने नहीं जा रहे हैं। वे एमपीईजी या जेपीईजी संपीड़न की तरह नहीं हैं जो हानिपूर्ण हैं।

दूसरी ओर, अगर आपको फ़ाइल में रैंडम की तलाश करने की ज़रूरत है, तो सम्पीडन अधिक परेशानी हो सकती है, क्योंकि यह मूल्य की तुलना में अधिक कठिन है और आप विरल लेखन में वापस आ गए हैं। एक सक्षम C या C ++ प्रोग्रामर को एक घंटे या उससे कम में ऐसा कुछ लिखने में सक्षम होना चाहिए।


दिलचस्प है - एक नीच अभी तक मुझे लगता है कि मैंने जो कुछ भी लिखा है उसका कोई खंडन नहीं है। यदि यह सटीक है, लेकिन अस्वच्छ है, तो यह एक कारण नहीं है। यदि यह सटीक नहीं है और सहायक नहीं है तो यह इसके लायक है।
होटी जूल

मैं कहीं और देखता हूं कि ओपी में एक सवाल था कि वह संपीड़ित छवियों को बढ़ाता है। मैं मान रहा हूं कि यह उस धागे की निरंतरता है। यह जानते हुए कि मैं अब देख सकता हूं कि संपीड़न के मेरे सुझाव को क्यों स्वीकार नहीं किया गया। एक साधारण सी कार्यक्रम अभी भी विरल फाइलें बनाने का एक आसान तरीका है। लेकिन - (अनिर्दिष्ट) ओएस आपको एक विरल आईएसओ माउंट करने देगा। उबटन के रूप में उबंटू आईएसओ मुनरो मैं 100% निश्चित नहीं हूं कि वह काम करने जा रहा है ... लेकिन किसी भी मामले में शुभकामनाएं।
होटी जूल

4
पहिया को क्यों मजबूत करें? cp --sparse=alwaysठीक काम करता है
मिहली

@mihi: यह एक अच्छा विचार है। मैं विरल विकल्प के बारे में नहीं जानता था क्योंकि यह बीएसडी फ्लेवर्स ( फ्रीबीडी डॉट ओआरसीजी / आई ) में उपलब्ध नहीं है और मुझे कभी भी सीपीपी के लिए लिनक्स मैन पेज देखने की आवश्यकता नहीं पड़ी है (आज तक)।
Hotei

अपनी संपीड़ित छवियों को रखने और उन्हें माउंट करने का एक तरीका यह भी है कि उन्हें केवल उन फ़ाइलों पर संग्रहीत किया जाए जो मूल संपीड़न का समर्थन करती हैं। यदि आपके पास ड्राइव क्रैश है, तो डेटा रिकवरी भयानक हो जाती है, लेकिन क्या बैकअप के लिए यह सही है?
पर्किन्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.