क्या rsync --inplace पूरी फाइल को लिखता है, या सिर्फ उन हिस्सों को जिसे अपडेट करने की आवश्यकता है? (btrfs + rsync बैकअप के लिए)


21

मैं कई गाइड पढ़ रहा था कि कैसे इतिहास के साथ एक कुशल बैकअप समाधान बनाने के लिए rsync के साथ btrfs स्नैपशॉट को मिलाएं। हालाँकि यह सब इस बात पर निर्भर करता है कि क्या rsync --inplaceकेवल फाइलों के उन हिस्सों को संशोधित करता है जो वास्तव में बदल गए हैं, या यदि यह पूरी फ़ाइल को क्रमिक रूप से अधिलेखित करता है। यदि यह पूरी फाइल लिखता है तो ऐसा लगता है कि btrfs हमेशा फ़ाइल की एक नई प्रतिलिपि बनाएगा, जो विचार को बहुत कम कुशल बना देगा।


यह भी कैसे पता चलेगा कि यह पूरी फाइल पर लिखने से बच सकता है? क्या पहले पूरी फाइल को पढ़ने की जरूरत नहीं है, यह पता लगाने के लिए कि क्या बदल गया है?
मेहरदाद

2
@ मेहरदाद हाँ, यह करता है, लेकिन पूरा पढ़ना समस्या नहीं है। यदि rsyncपूरी फ़ाइल पढ़ता है और फिर केवल उन भागों को अपडेट करना और अपडेट करना चाहता है जो आवश्यक हैं, तो btrfs केवल इन अपडेट किए गए ब्लॉकों को कॉपी करेंगे। लेकिन अगर पूरी फाइल को rsyncपढ़ता है और लिखता है, तो यह एक समस्या होगी।
पेट्र पुडलक

1
@ मेहरदाद rsyncन केवल यह जानते हैं कि यह पूरी फाइल को लिखने से बच सकता है, यह ऐसा करने के लिए इसे पूरी तरह से नेट पर कॉपी किए बिना प्रबंधित करता है । चतुर थोड़ा कार्यक्रम।
गनथर पाईज़

जवाबों:


31

यदि आप rsync दो स्थानीय पथ पास करते हैं, तो यह "--whole-file" का उपयोग करने के लिए डिफ़ॉल्ट होगा, और डेल्टा-हस्तांतरण नहीं। तो, आप जो खोज रहे हैं, वह "- पूर्ण-फ़ाइल" है। यदि आपने '-c' का अनुरोध किया है, तो आपको डेल्टा-ट्रांसफर भी मिलेगा।

यहां बताया गया है कि आप कैसे सत्यापित कर सकते हैं:

$ mkdir a b
$ dd if=/dev/zero of=a/1 bs=1k count=64
$ dd if=/dev/zero of=a/2 bs=1k count=64
$ dd if=/dev/zero of=a/3 bs=1k count=64
$ rsync -av a/ b/
sending incremental file list
./
1
2
3

sent 196831 bytes  received 72 bytes  393806.00 bytes/sec
total size is 196608  speedup is 1.00

फिर एक फाइल को टच करें और फिर से सिंक करें

$ touch a/1
$ rsync -av --inplace a/ b/
sending incremental file list
1

sent 65662 bytes  received 31 bytes  131386.00 bytes/sec
total size is 196608  speedup is 2.99

आप इसे "ls -li" के साथ इन-री-इन-वेरिफाई कर सकते हैं, लेकिन ध्यान दें कि उसने पूरे 64K बाइट भेजे। -No-पूरे-फ़ाइल के साथ फिर से प्रयास करें

$ touch a/1
$ rsync -av --inplace --no-whole-file a/ b/
sending incremental file list
1

sent 494 bytes  received 595 bytes  2178.00 bytes/sec
total size is 196608  speedup is 180.54

अब आपने केवल 494 बाइट भेजे हैं। यदि फ़ाइल में से कोई भी लिखा गया था, तो आप आगे सत्यापित करने के लिए स्ट्रेस का उपयोग कर सकते हैं, लेकिन यह दिखाता है कि यह कम से कम डेल्टा-हस्तांतरण का उपयोग करता है।

नोट (टिप्पणी देखें) कि स्थानीय फाइल सिस्टम के लिए, --whole-file मान लिया गया है (rsync के लिए मैन पेज देखें)। दूसरी ओर, एक नेटवर्क के पार --no-whole-fileमाना जाता है, इसलिए --inplaceअपने आप ही जैसा व्यवहार करेगा --inplace --no-whole-file


क्यों नहीं करता --inplaceहै --no-whole-file?
गेरमिया सेप

--no-whole-fileवैसे भी डिफ़ॉल्ट नहीं है ?
गेरमीया

2
@Geremia अगर दोनों रास्ते स्थानीय नहीं हैं। और मेरे उदाहरण से पता चलता है कि मैं 2013 में rsync के संस्करण का उपयोग --inplaceनहीं करता --no-whole-fileथा, लेकिन rsync के अपने संस्करण के साथ इस प्रयोग को दोहराने के लिए आपका स्वागत है।
पातड़ां

ठीक है, inplaceसमान / भिन्न ब्लॉकों के लिए स्कैनिंग के बारे में नहीं है ', यह सिर्फ मौजूदा फाइल को ओवर राइट करने के बारे में है, ऑफसेट 0. से (दूसरा अस्थायी अस्थायी कॉपी बनाया गया है, और उसके बाद ही पुरानी टारगेट फाइल डिलीट हो जाती है और टेंपरेरी कॉपी कॉपी हो जाती है। यह संभवतः "सुरक्षित" समझा जाता है कि पुरानी फ़ाइल को यथासंभव लंबे समय तक रखा जाए, अगर प्रक्रिया बाधित हो जाती है। बेशक यह प्रदर्शन, पीक स्टोरेज खपत (बड़ी फ़ाइलों के बारे में सोचें), संभवतः विखंडन ...) के लिए बदतर है ...
फ्रैंक नोके

1
मुझे लगता है, कि यह अन्य तरह से गोल है, --no-whole-fileहमेशा इसका मतलब है --inplace, अन्यथा इसका अधिकांश प्रदर्शन लाभ हो जाएगा। हालांकि यह प्रलेखित नहीं हो सका, ...
फ्रैंक नोके

15

यहां मैं निश्चित उत्तर का अनुमान लगाता हूं, जो मैनुअल के सही भाग का हवाला देता है:

   --inplace

          [...]

          This option is useful for transferring large files
          with  block-based  changes  or  appended data, and
          also on systems that are disk bound,  not  network
          bound.   It  can  also  help  keep a copy-on-write
                                               *************
          filesystem snapshot from diverging the entire con‐
          *******************
          tents of a file that only has minor changes.

4

--inplaceकेवल उन क्षेत्रों को अधिलेखित करता है जो बदल गए हैं। Btrfs पर लिखते समय हमेशा इसका उपयोग करें।


और क्या आपके पास कोई सबूत है जो दिखाता है कि यह फाइलों के अन्य हिस्सों को अधिलेखित नहीं करता है?
पेट्र पुडल्क

क्या यही बात ZFS पर लागू होती है?
ewwhite

@ नया: चूंकि ZFS को BTRFS की तरह गाय (कॉपी-ऑन-राइट) है, तो हाँ।
गेरमिया

@ पेट्रापुडलाक -vvvइसे मैचिंग ब्लॉक्स को दिखाता है
टॉम हेल

3

rsync का डेल्टा ट्रांसफर एल्गोरिथ्म इस बात से संबंधित है कि क्या पूरी फ़ाइल संचरित है या बस अलग-अलग हिस्से हैं। बैंडविड्थ पर सहेजने के लिए दो मशीनों के बीच एक फ़ाइल को rsyncing करते समय यह डिफ़ॉल्ट व्यवहार है। यह --whole-file(या -W) बल के साथ अधिरोहित किया जा सकता हैrsync संपूर्ण फ़ाइल को संचारित करने के करने के ।

--inplaceचाहे साथ सौदों rsync, स्थानांतरण के दौरान, एक अस्थायी फ़ाइल बनाने या नहीं होंगे। डिफ़ॉल्ट व्यवहार एक अस्थायी फ़ाइल बनाने के लिए है। यह सुरक्षा का एक उपाय बताता है कि यदि स्थानांतरण बाधित होता है, तो गंतव्य मशीन में मौजूदा फ़ाइल बरकरार / अछूती रहती है। --inplaceइस व्यवहार को ओवरराइड करता है और rsyncमौजूदा फ़ाइल को सीधे अपडेट करने के लिए कहता है। इसके साथ, यदि आप स्थानांतरण बाधित है, तो आप गंतव्य मशीन में एक असंगत फ़ाइल होने का जोखिम चलाते हैं।


2

आदमी पृष्ठ से:

This  option  changes  how  rsync transfers a file when its data
needs to be updated: instead of the default method of creating a
new  copy  of  the file and moving it into place when it is com-
plete, rsync instead writes the updated  data  directly  to  the
destination file.

यह मुझे विश्वास दिलाता है कि यह पूरी तरह से फाइल पर लिखता है - मुझे लगता है कि यह rsync के लिए किसी अन्य तरीके से काम करना असंभव होगा।


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

0

इस पेपर में इन-प्लेस rsync का सैद्धांतिक कार्य वर्णित है ।

पेपर संदर्भ: डी। रसच और आर बर्न्स। इन-प्लेस रुपीस: मोबाइल और वायरलेस उपकरणों के लिए फ़ाइल सिंक्रनाइज़ेशन। USENIX वार्षिक तकनीकी सम्मेलन, FREENIX ट्रैक, 91-100, USENIX, 2003।

लिंक से:

... हमने मौजूदा rsync कार्यान्वयन को संशोधित करके इन-प्लेस पुनर्निर्माण का समर्थन किया।

सार: [...] हमने rsync को संशोधित किया है ताकि यह अंतरिक्ष की कमी वाले उपकरणों पर काम करे। लक्ष्य होस्ट पर मौजूद फ़ाइलें उसी संग्रहण में अपडेट की जाती हैं जो फ़ाइल के वर्तमान संस्करण में रहती है। अंतरिक्ष-विवश डिवाइस पारंपरिक rsync का उपयोग नहीं कर सकते क्योंकि इसके लिए फ़ाइल के पुराने और नए संस्करण दोनों के लिए मेमोरी या स्टोरेज की आवश्यकता होती है। उदाहरणों में सेलुलर फोन और हाथ में पीसी पर फ़ाइलों को सिंक्रनाइज़ करना शामिल है, जिसमें छोटी यादें हैं। इन-प्लेस rsync एल्गोरिथ्म एक ग्राफ़ में फ़ाइल के संपीड़ित प्रतिनिधित्व को एन्कोड करता है, जो तब इन-प्लेस संपत्ति प्राप्त करने के लिए स्थाई रूप से सॉर्ट किया जाता है। [...]

ऐसा प्रतीत होता है कि rsync --inplace क्या कर रहा है का तकनीकी विवरण। कागज की शुरुआत के अनुसार:

हमने rsync को संशोधित किया है ताकि यह इन-प्लेस पुनर्निर्माण के साथ फ़ाइल सिंक्रोनाइज़ेशन कार्यों को पूरा करे। [...] अस्थायी स्थान का उपयोग करने के बजाय, लक्ष्य फ़ाइल में परिवर्तन वर्तमान संस्करण द्वारा पहले से ही कब्जे में अंतरिक्ष में जगह लेता है। इस उपकरण का उपयोग उन उपकरणों को सिंक्रनाइज़ करने के लिए किया जा सकता है जहां स्थान सीमित है।

जैसा कि @ dataless के उत्तर से स्पष्ट हो जाता है , इसका अर्थ है कि --inplaceसमान संग्रहण स्थान का उपयोग कर रहा है, लेकिन यह उस स्थान पर अभी भी पूरी फ़ाइल की प्रतिलिपि बना सकता है। विशेष रूप से, जब प्रतियां स्थानीय फाइल सिस्टम से / के लिए बनाई जाती हैं, तो rsync --whole-fileविकल्प मानता है । लेकिन जब यह दूसरी ओर नेटवर्क वाली प्रणालियों में होता है, तो यह --no-whole-fileविकल्प मान लेता है ।


1
उम, तो जवाब क्या है?
1520 पर Xen2050

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