यदि पुरानी फ़ाइल पहले से मौजूद है तो समान फ़ाइलों को --link-dest विकल्प से लिंक करने के लिए rsync कैसे प्राप्त करें?


11

कोई सोच सकता है कि --link-dest'एक समान फ़ाइल के लिए सभी मामलों में काम करेगा। लेकिन यह तब नहीं है जब फ़ाइल मौजूद है, भले ही फ़ाइल पुराना हो / भिन्न सामग्री हो।

यह इस वजह से है, पर rsync मैन पेज से --link-dest:

"यह विकल्प सबसे अच्छा काम करता है जब एक खाली गंतव्य पदानुक्रम में कॉपी किया जाता है, क्योंकि rsync मौजूदा फ़ाइलों को निश्चित मानता है (इसलिए rsync लिंक-डेस्ट डेरे में कभी नहीं दिखता है जब गंतव्य फ़ाइल पहले से मौजूद है )"

इसका मतलब है कि यदि y/fileस्रोत के समान ही मौजूद है, और z/fileपुराना है,

rsync -a --del -link-dest=y source:/file z

परिणाम दो TW इनोडेस (और दो बार डिस्कस्पेस) का उपयोग किया जा रहा है, y/fileऔर z/file, जिसमें समान सामग्री और डेटास्टैम्प होंगे।

मुझे यह पता चला क्योंकि मैं मूल रूप से प्रति दिन एक बार चलने वाली इस स्क्रिप्ट के साथ दैनिक बैकअप करता हूं:

mv $somedaysago $today; 
yest=$today; today=`date +%Y%m%d`;
rsync -avPShyH --del --link-dest=../$yest host:/dirs $today

क्योंकि मेरा बैकअप 10M फ़ाइलों तक होता है, ऐसा rm -rf $olddir; rsync source:$dir newdirकरने में बहुत लंबा समय लगता है (विशेषकर तब जब प्रतिदिन केवल 0.5% फाइलें बदल जाती हैं, 10M dir प्रविष्टियों के विलोपन और निर्माण के लिए सिर्फ 50K नई या परिवर्तित फ़ाइलों को संभालने के लिए, जो कि मेरा काम कर देगी। बैकअप अगले दिन के लिए समय पर पूरा नहीं होता है)।

यहां स्थिति का डेमो दिया गया है:

aहमारा स्रोत है, के 1माध्यम 4से हमारे गिने बैकअप हैं:

$ mkdir -p 1 2; echo foo > 1/foobar; cp -lrv 1/* 2
`1/foobar' -> `2/foobar'
$ ls -i1 */foobar
1053003 1/foobar
1053003 2/foobar

$ mkdir a; echo quux > a/foobar
$ mv 1 3; rsync -avPhyH --del --link-dest=../2 a/ 3
sending incremental file list
./
foobar
           5 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)

sent 105 bytes  received 34 bytes  278.00 bytes/sec
total size is 5  speedup is 0.04

$ ls -i1 */foobar
1053003 2/foobar
1053007 3/foobar
1053006 a/foobar

$ mv 2 4; rsync -avPhyH --del --link-dest=../3 a/ 4
sending incremental file list
./
foobar
           5 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)

sent 105 bytes  received 34 bytes  278.00 bytes/sec
total size is 5  speedup is 0.04


$ ls -il1 */foobar
1053007 -rw-r--r-- 1 math math 5 Mar 30 00:57 3/foobar
1053008 -rw-r--r-- 1 math math 5 Mar 30 00:57 4/foobar
1053006 -rw-r--r-- 1 math math 5 Mar 30 00:57 a/foobar

$ md5sum [34a]/foobar
d3b07a382ec010c01889250fce66fb13  3/foobar
d3b07a382ec010c01889250fce66fb13  4/foobar
d3b07a382ec010c01889250fce66fb13  a/foobar

अब हमारे पास 2 बैकअप हैं a/foobarजो सभी तरह से समान हैं, जिसमें टाइमस्टैम्प भी शामिल है, लेकिन अलग-अलग इनोड्स पर कब्जा है।

कोई सोच सकता है कि एक समाधान होगा --delete-before, जो वृद्धिशील स्कैन के लाभ को मारता है, लेकिन यह या तो मदद नहीं करता है क्योंकि फ़ाइल को हटाया नहीं जाएगा, लेकिन मामले में वृद्धि के आधार पर उपयोग के रूप में उपयोग संभव है।

कोई आगे बढ़ सकता है तो हम इस वृद्धिशील-कॉपी हेज को बंद कर सकते हैं --whole-file, लेकिन यह एल्गोरिथ्म में कोई मदद नहीं करता है, जो हम चाहते हैं उसे प्राप्त करने का कोई तरीका नहीं है।

मैं इस व्यवहार को rsync में एक और बग मानता हूं, जहां विभिन्न कमांड तर्कों के सावधानीपूर्वक चयन से एक लाभकारी व्यवहार का अनुमान लगाया जा सकता है, लेकिन वांछित परिणाम उपलब्ध नहीं है।

एक समाधान दुर्भाग्य से एक एकल rsync से एक परमाणु-ऑपरेशन के रूप में एक सूखी-चाल के साथ आगे बढ़ेगा -n, इसे लॉग इन करना, प्रसंस्करण जो इनपुट के रूप में लॉग इन सभी परिवर्तित फ़ाइलों को मैन्युअल रूप से प्री-डिलीट करता है, फिर rsync --link-destजो हम चाहते हैं उसे प्राप्त करने के लिए चल रहा है - एक बड़ा कीचड़ एक स्वच्छ rsync की तुलना में।

परिशिष्ट: पूर्व लिंक करने की कोशिश की $yesterdayऔर $todayबैकअप सर्वर पर साथ उत्पादन बक्से के खिलाफ बैकअप से पहले rsync --link-dest=../$yesterday $yesterday/ $today- लेकिन एक ही परिणाम - किसी भी फाइल है कि किसी भी तरह से मौजूद है, यहां तक कि 0 लंबाई, कभी नहीं हटाया जाएगा और लिंक-dested, बजाय एक पूरी नए कॉपी को नए इनकोड के साथ और अधिक डिस्कस्पेस का उपयोग करके सॉर्सट्रेड से बनाया जाएगा।

pax(1)एक संभव पूर्व-लिंकिंग-पहले-बैकअप समाधान के रूप में देख रहे हैं।


मैं --delete-afterइस उपयोग परिदृश्य में उपयोग करता हूं , इसमें क्या गलत है?
गोगुड़

1
--delete-afterठीक है, लेकिन हाथ में इस मुद्दे से संबंधित नहीं है। कॉपी गायब होने के बाद स्रोत से गायब फाइलें हटा दी जाएंगी। मैं जिस मुद्दे को स्पष्ट कर रहा हूं वह आज के बैकअप के साथ जुड़ा हुआ है जो कल के समान है, लेकिन पुराने के बाहर मौजूदा पुरानी फ़ाइल के खिलाफ है जो कल के इनोड से जुड़ा नहीं है, लेकिन कल की डिस्क से कुल डिस्क-स्पेस में दो बार एक नई फाइल के रूप में संग्रहीत किया जाता है समान प्रति मानी जाती है।
मैथ

पूरी तरह से निश्चित नहीं है कि आप क्या सवाल करते हैं। क्या आपने विचार किया rsnapshot? इसके अलावा, "समान" फ़ाइलों को राहत देने के लिए एक छोटी सी स्क्रिप्ट लिखने पर विचार करें। मैं अपने सिस्टम पर दोनों करता हूं।
रोएमा

1
यदि आपको यहां आवश्यक उत्तर नहीं मिलता है, तो आप rsync सूची पर पोस्ट कर सकते हैं। Rsync डेवलपर्स नियमित रूप से कई उन्नत उपयोगकर्ताओं के साथ वहाँ सवालों के जवाब देते हैं। आप उन्हें lists.samba.org/mailman/listinfo/rsync के माध्यम से पा सकते हैं । मैं ज्यादातर वहां रहता हूं और बहुत कुछ सीखता हूं।
जो

rsnapshot अभ्यस्त पुराने बैकअप को रीसायकल करता है - और मुझे इसकी आवश्यकता है: यदि मेरे पास 2 मो और 2-मो + 1 दिन पुराना बैकअप है, तो मैं नए लक्ष्य के रूप में एक चक्र कर सकता हूं। चूंकि ~ 5% फाइलें / दिन बदलते हैं, इसलिए मैं 10M के बजाय 50K हार्डलिंक बनाता हूं। यह गति भिन्न है 5 सर्वरों / रात बनाम का बैकअप लेने की अनुमति देता है। hardlink(1)धीमा है (rsync के मेटाडाटा स्कैन की तुलना में 15 गुना धीमा); paxपुराने बैकअप की तुलना में नए की तुलना में तेज है, लेकिन एचडीडी प्रमुख है। rsync -nडेल्टा सूची प्राप्त करने का मतलब है कि उत्पादन सर्वरों को दो बार मारना (10M फ़ाइलों को स्कैन करना 50K परिवर्तनों की प्रतिलिपि बनाने से कहीं अधिक प्रभाव है)। बीमार सूची को अनुमति देने के लिए rsync में एक विकल्प के बारे में मेल करें।
गणित

जवाबों:


12

(प्रश्न संपादित से परिवर्तित)

इसे rsync को अपग्रेड करके हल किया गया है। संस्करण 3.1.1 या बाद में अब --link-destएक हार्डलिंक फ़ाइल के साथ लक्ष्य और निर्देशिका में समान फ़ाइलों को बदल देगा । बहुत जगह बचाता है।

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