स्नैपशॉट की तुलना करने के लिए btrfs के पास एक कुशल तरीका है?


21

माउंटेड स्नैपशॉट को अलग करते समय यह काम करेगा, ऐसा लगता है कि यह कई मामलों में बहुत धीमा हो सकता है।

क्या स्नैपशॉट को अलग करने के लिए btrfs की विशिष्ट कार्यक्षमता है? (डॉक्स में मुझे कोई भी नहीं मिला था)


हालांकि यह पता लगाना संभव हो सकता है कि कौन से ब्लॉक बदले गए और कैसे, आपको उस मामले पर विचार करने की आवश्यकता है जब बाद में कोई बदलाव किया गया हो, यदि आप वास्तव में फाइल सिस्टम (निर्देशिका) की तुलना करना चाहते हैं। उदाहरण के लिए यदि आप फ़ाइल Aयुक्त a, लिखने bइसके स्नैपशॉट में और बाद में वापस करने के लिए बदल a, फ़ाइल वास्तव में सब पर नहीं बदला।
क्रिस्टियान सियुपिटु

ऐसा लगता है कि यह पूरी तरह से स्रोत कोड संशोधन नियंत्रण के अनुरूप होगा जहां इस तरह की बात हर समय की जाती है, जब तक कि मैं कुछ याद नहीं कर रहा हूं।
कैटस्कुल

एक btrfs फाइलसिस्टम पर rsync जैसी किसी चीज़ को चलाने की एक अतिरिक्त समस्या यह है कि, जब तक कि noatime आरोह विकल्प का उपयोग नहीं किया गया था, यह देखने के लिए कि क्या वे बदल गए हैं, यह जांचने के लिए सभी फ़ाइलों को पढ़ना प्रभावी ढंग से संशोधित करेगा और कोई फ़ाइल नहीं होने पर भी अगला स्नैपशॉट बड़ा होगा। । चर्चा के लिए lwn.net/Articles/499293 देखें ।
लुका सिटी

जवाबों:


11

ऐसा लगता है कि आप btrfs सेंड / रिसीव की तलाश में हैं , जो लिनक्स 3.6 में दिखाई देगा। sendआदेश दो स्नैपशॉट के बीच मतभेद की एक लॉग फ़ाइल बनाता है, और receiveआदेश एक फ़ाइल से परिवर्तनों लागू होता है। ध्यान दें कि भेजने / प्राप्त करने के लिए एक कस्टम फ़ाइल प्रारूप का उपयोग किया जाता है, इसलिए फ़ाइल बिल्कुल वैसी नहीं दिखेगी, जैसे, अंतर या टार।


अच्छा! ठीक वैसा ही मैं देख रहा था।
कैटस्कुल

2
इस आउटपुट को देखने वाले एक उदाहरण ऐप के लिए देखें: github.com/sysnux/btrfs-snapshots-diff (मेरे द्वारा नहीं)
Att Righ

10

मैं डेबियन स्थिर चला रहा हूं जो कि नहीं है btrfs send, इसलिए मैंने एक समाधान का उपयोग किया btrfs subvolume find-new

यदि आपके पास स्नैपशॉट 1 और स्नैपशॉट 2 है और आप जानना चाहते हैं कि बाद के एक में क्या बदल गया है, स्नैपशॉट 2, क्योंकि स्नैपशॉट 1 बनाया गया था, आप नीचे दी गई स्क्रिप्ट का उपयोग कर सकते हैं

btrfs-diff oldsnapshot/ newsnapshot/

जो समाचारों में परिवर्तित सभी फाइलों को सूचीबद्ध करेगा / oldsnapshot / के बाद से।

#!/bin/bash
usage() { echo $@ >2; echo "Usage: $0 <older-snapshot> <newer-snapshot>" >2; exit 1; }

[ $# -eq 2 ] || usage "Incorrect invocation";
SNAPSHOT_OLD=$1;
SNAPSHOT_NEW=$2;

[ -d $SNAPSHOT_OLD ] || usage "$SNAPSHOT_OLD does not exist";
[ -d $SNAPSHOT_NEW ] || usage "$SNAPSHOT_NEW does not exist";

OLD_TRANSID=`btrfs subvolume find-new "$SNAPSHOT_OLD" 9999999`
OLD_TRANSID=${OLD_TRANSID#transid marker was }
[ -n "$OLD_TRANSID" -a "$OLD_TRANSID" -gt 0 ] || usage "Failed to find generation for $SNAPSHOT_NEW"

btrfs subvolume find-new "$SNAPSHOT_NEW" $OLD_TRANSID | sed '$d' | cut -f17- -d' ' | sort | uniq

समझाने के लिए: स्नैपशॉट की एक विशेष 'पीढ़ी' के बादbtrfs subvolume find-new बदल गई फाइलें पाता है । यह वर्तमान पीढ़ी की संख्या की भी रिपोर्ट करता है।

चेतावनियां

उदाहरण के लिए एक सबवोल्यूम केस का दैनिक स्नैपशॉट लें:

mkdir test && cd test
btrfs subvolume create live
date >live/foo1
date >live/bar1
btrfs subvolume snapshot live/ snap1
date >live/foo2  # new file
date >>live/bar1 # modify file
rm live/foo1     # delete file
btrfs subvolume snapshot live/ snap2
date >live/foo3  # new file
mv live/bar{1,2} # rename file
rm live/foo2     # delete file

Snap1 और Snap2 के बीच क्या बदला?

$ btrfs-diff snap1/ snap2/
bar1
foo2

इसलिए हम नई फ़ाइल देख सकते हैं, संशोधित फ़ाइल देख सकते हैं, लेकिन हटाने की सूचना नहीं है । ऐसा इसलिए है क्योंकि कमांड उन फाइलों पर रिपोर्ट करता है जो मौजूद हैं, ऐसा नहीं है जो अब नहीं है।

Snap2 और लाइव सबवोल्यूम के बीच क्या बदलाव आया?

$ btrfs-diff snap2/ live/
foo3

नाम परिवर्तित फ़ाइल की सूचना नहीं है । इसका डेटा नहीं बदला है।

अब क्या होगा अगर हम नामांकित फ़ाइल में डेटा जोड़ते हैं

date >>live/bar2
btrfs-diff snap2/ live/
bar2
foo3

ठीक है, समझ में आता है। लेकिन चलो एक नई फ़ाइल बनाते हैं

date >live/lala
btrfs-diff snap2/ live/
bar2
foo3

एह! लाला कहाँ है? । यदि आप कोई अन्य फ़ाइल जोड़ते हैं, तो lalaप्रकट होती है। इसलिए यह व्यवहार थोड़ा अजीब है। शायद यही कारण है कि विकी कहते हैं:

खोज-नए दृष्टिकोण की कुछ गंभीर सीमाएँ हैं और इस प्रकार वास्तव में कुछ भेजने / प्राप्त करने के लिए उपयोग करने योग्य नहीं है।

हालाँकि, विषमता तब होती है जब आप किसी लाइव सबवॉल्म की तुलना किसी पूर्व स्थिति के खिलाफ करते हैं, न कि तब जब आप तुलना कर रहे होते हैं (केवल-पढ़ने के लिए) स्नैपशॉट। तो यह तब भी उपयोगी हो सकता है जब तक आप नष्ट की गई फ़ाइलों की पहचान नहीं करना चाहते।


अरे वहाँ, मैंने आपका टूल थोड़ा बढ़ा दिया है। यह टूल आपको स्नैपशॉट में होने वाले सभी परिवर्तनों की एक स्ट्रीम दिखाएगा (यह व्यक्तिगत लिंक भी चुन सकता है) github.com/talwrii/btrlog
Att Righ

1

यह स्नैपशॉट सुविधा उपकरण द्वारा समर्थित है snapper

sudo snapper -c config diff 445..446

बेशक यह आपको snapperअपने स्नैपशॉट के लिए उपयोग करने की आवश्यकता है ।

इस स्नैपशॉट आईडी का उपयोग करके पाया जा सकता है snapper list -a। दुर्भाग्य से, लेखन के समय स्नैपर ने एक भी विन्यास के लिए सूची स्नैपशॉट का समर्थन नहीं किया, हालांकि ये संख्याएँ सबवूफर नामों से पाई जा सकती हैं।

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