कोई सोच सकता है कि --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
ठीक है, लेकिन हाथ में इस मुद्दे से संबंधित नहीं है। कॉपी गायब होने के बाद स्रोत से गायब फाइलें हटा दी जाएंगी। मैं जिस मुद्दे को स्पष्ट कर रहा हूं वह आज के बैकअप के साथ जुड़ा हुआ है जो कल के समान है, लेकिन पुराने के बाहर मौजूदा पुरानी फ़ाइल के खिलाफ है जो कल के इनोड से जुड़ा नहीं है, लेकिन कल की डिस्क से कुल डिस्क-स्पेस में दो बार एक नई फाइल के रूप में संग्रहीत किया जाता है समान प्रति मानी जाती है।
rsnapshot
? इसके अलावा, "समान" फ़ाइलों को राहत देने के लिए एक छोटी सी स्क्रिप्ट लिखने पर विचार करें। मैं अपने सिस्टम पर दोनों करता हूं।
hardlink(1)
धीमा है (rsync के मेटाडाटा स्कैन की तुलना में 15 गुना धीमा); pax
पुराने बैकअप की तुलना में नए की तुलना में तेज है, लेकिन एचडीडी प्रमुख है। rsync -n
डेल्टा सूची प्राप्त करने का मतलब है कि उत्पादन सर्वरों को दो बार मारना (10M फ़ाइलों को स्कैन करना 50K परिवर्तनों की प्रतिलिपि बनाने से कहीं अधिक प्रभाव है)। बीमार सूची को अनुमति देने के लिए rsync में एक विकल्प के बारे में मेल करें।
--delete-after
इस उपयोग परिदृश्य में उपयोग करता हूं , इसमें क्या गलत है?