btrfs มีวิธีที่มีประสิทธิภาพในการเปรียบเทียบสแน็ปช็อตหรือไม่


21

ในขณะที่การติดตั้งสแนปชอตที่แตกต่างกันนั้นใช้งานได้ดูเหมือนว่ามันจะช้าอย่างน่ากลัวในหลายกรณี

มีฟังก์ชั่นเฉพาะของ btrfs ในการกระจายสแนปชอตหรือไม่? (ฉันไม่พบสิ่งใดในเอกสาร)


ในขณะที่อาจเป็นไปได้ที่จะหาว่าบล็อกใดที่มีการเปลี่ยนแปลงและวิธีการที่คุณต้องพิจารณากรณีเมื่อการเปลี่ยนแปลงได้รับการย้อนกลับในภายหลังถ้าคุณต้องการเปรียบเทียบระบบไฟล์ (ไดเรกทอรี) ตัวอย่างเช่นถ้าคุณมีไฟล์Aที่มีaเขียนbในภาพรวมและต่อมาเปลี่ยนกลับไปเป็นaไฟล์ไม่ได้จริงๆเปลี่ยนที่ทุกคน
Cristian Ciupitu

ดูเหมือนว่ามันจะคล้ายกับการควบคุมการแก้ไขซอร์สโค้ดอย่างสมบูรณ์ซึ่งสิ่งเหล่านี้ทำอยู่ตลอดเวลาเว้นแต่ว่าฉันขาดอะไรไป
Catskul

ปัญหาเพิ่มเติมของการใช้งานบางอย่างเช่น rsync บนระบบไฟล์ btrfs ก็คือหากไม่มีการใช้ตัวเลือก noatime mount การอ่านไฟล์ทั้งหมดเพื่อตรวจสอบว่ามีการเปลี่ยนแปลงอย่างมีประสิทธิภาพหรือไม่และสแน็ปช็อตต่อไปจะมีขนาดใหญ่ . ดูlwn.net/Articles/499293สำหรับการสนทนา
Luca Citi

คำตอบ:


11

ดูเหมือนว่าคุณกำลังมองหาส่ง / รับ btrfsซึ่งจะปรากฏใน Linux 3.6 sendคำสั่งสร้างแฟ้มบันทึกของความแตกต่างระหว่างสองภาพรวมและreceiveคำสั่งใช้การเปลี่ยนแปลงจากแฟ้ม โปรดทราบว่าการส่ง / รับใช้รูปแบบไฟล์ที่กำหนดเองดังนั้นไฟล์จะไม่เหมือนกับพูด, diff หรือ tar


ดี! นั่นคือสิ่งที่ฉันกำลังมองหา
Catskul

2
สำหรับแอปตัวอย่างที่แยกวิเคราะห์ผลลัพธ์นี้ดู: github.com/sysnux/btrfs-snapshots-diff (ไม่ใช่ฉัน)
Att Righ

10

ผมทำงานที่มั่นคง Debian ซึ่งไม่ได้มีดังนั้นฉันมองไปที่การแก้ปัญหาโดยใช้btrfs sendbtrfs subvolume find-new

หากคุณมี snapshot1 และ snapshot2 และคุณต้องการทราบว่ามีการเปลี่ยนแปลงอะไรในภายหลังหนึ่ง snapshot 2 เนื่องจาก snapshot1 ถูกสร้างขึ้นคุณสามารถใช้สคริปต์ด้านล่างซึ่งมี

btrfs-diff oldsnapshot/ newsnapshot/

ซึ่งจะแสดงรายการไฟล์ทั้งหมดที่มีการเปลี่ยนแปลงใน 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 และ subvolume สด

$ btrfs-diff snap2/ live/
foo3

ไฟล์เปลี่ยนชื่อไม่ได้รายงาน ข้อมูลไม่เปลี่ยนแปลง

ตอนนี้ถ้าเราเพิ่มข้อมูลลงในไฟล์ที่ถูกเปลี่ยนชื่อ

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

ตกลงทำให้รู้สึก แต่มาสร้างไฟล์ใหม่กันเถอะ

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

เอ๊ะ! ลาลาอยู่ที่ไหน . หากคุณเพิ่มไฟล์อื่นlalaปรากฏขึ้น ดังนั้นพฤติกรรมนี้ค่อนข้างแปลก ซึ่งอาจเป็นสาเหตุที่ wiki พูดว่า:

วิธีการค้นหาใหม่มีข้อ จำกัด ที่ร้ายแรงดังนั้นจึงไม่สามารถใช้งานได้กับบางสิ่งบางอย่างเช่นการส่ง / รับ

อย่างไรก็ตามความแปลกประหลาดเกิดขึ้นเมื่อคุณเปรียบเทียบ subvolume สดกับสถานะก่อนหน้านี้ไม่ใช่เมื่อคุณเปรียบเทียบสแนปชอต (อ่านอย่างเดียว) ดังนั้นสิ่งนี้อาจมีประโยชน์เว้นแต่คุณต้องการระบุไฟล์ที่ถูกลบด้วย


เฮ้ฉันได้ขยายเครื่องมือของคุณเล็กน้อย เครื่องมือนี้จะแสดงให้คุณเห็นการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นในสแนปชอต (นอกจากนี้ยังสามารถเลือกการเชื่อมโยงแต่ละรายการ) github.com/talwrii/btrlog
Att Righ

1

snapperนี้ได้รับการสนับสนุนโดยเครื่องมืออำนวยความสะดวกภาพรวม

sudo snapper -c config diff 445..446

หลักสูตรนี้คุณต้องใช้ snapperแนปชอตของคุณ

snapper list -aรหัสภาพรวมนี้สามารถพบได้โดยใช้ น่าเสียดายที่ตอนที่เขียนปลากะพงไม่สนับสนุนสแน็ปช็อตรายการสำหรับการตั้งค่าครั้งเดียวถึงแม้ว่าตัวเลขเหล่านี้สามารถพบได้จากชื่อ subvolume

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.