Btrfs có một cách hiệu quả để so sánh ảnh chụp nhanh?


21

Mặc dù các ảnh chụp nhanh được gắn khác nhau sẽ hoạt động, có vẻ như nó có thể bị chậm khủng khiếp trong nhiều trường hợp.

Có btrfs chức năng cụ thể cho khác biệt snapshot? (Tôi không thể tìm thấy bất kỳ tài liệu nào)


Mặc dù có thể tìm ra khối nào đã được thay đổi và làm thế nào, bạn cần xem xét trường hợp khi thay đổi đã được đảo ngược sau đó, nếu bạn thực sự muốn so sánh các hệ thống tập tin (thư mục). Ví dụ: nếu bạn có tệp Achứa a, hãy viết btrong ảnh chụp nhanh và sau đó thay đổi lại a, tệp hoàn toàn không thay đổi.
Cristian Ciupitu

Có vẻ như nó hoàn toàn tương tự với kiểm soát sửa đổi mã nguồn trong đó loại việc này được thực hiện mọi lúc, trừ khi tôi thiếu một cái gì đó.
Catskul

Một vấn đề khác của việc chạy một cái gì đó như rsync trên hệ thống tập tin btrfs là, trừ khi sử dụng tùy chọn gắn kết giữa giờ, đọc tất cả các tệp để kiểm tra xem chúng có thay đổi hay không và ảnh chụp nhanh tiếp theo sẽ lớn ngay cả khi không có tệp nào thực sự được sửa đổi . Xem lwn.net/Articles/499293 để thảo luận.
Luca Citi

Câu trả lời:


11

Có vẻ như bạn đang tìm kiếm gửi / nhận btrfs , sẽ xuất hiện trong Linux 3.6. Các sendlệnh tạo file bản ghi của sự khác nhau giữa hai bức ảnh chụp, và các receivelệnh áp dụng các thay đổi từ một tập tin. Lưu ý rằng gửi / nhận sử dụng định dạng tệp tùy chỉnh, vì vậy tệp sẽ không giống hệt như giả sử, diff hoặc tar.


Tốt đẹp! Đó chính xác là những gì tôi đang tìm kiếm.
Catskul

2
Đối với một ứng dụng ví dụ phân tích đầu ra này, hãy xem: github.com/sysnux/btrfs-snapshots-diff (không phải bởi tôi)
Att Righ

10

Tôi đang chạy Debian ổn định mà không có btrfs send, vì vậy tôi đã tìm đến một giải pháp bằng cách sử dụng btrfs subvolume find-new.

Nếu bạn có snapshot1 và snapshot2 và bạn muốn biết điều gì đã thay đổi trong phần sau, snapshot 2, vì snapshot1 đã được tạo, bạn có thể sử dụng tập lệnh bên dưới cung cấp

btrfs-diff oldsnapshot/ newsnapshot/

sẽ liệt kê tất cả các tệp đã thay đổi trong newsnapshot / kể từ 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

Để giải thích: btrfs subvolume find-newtìm các tệp đã thay đổi sau một 'thế hệ' ảnh chụp cụ thể. Nó cũng báo cáo số thế hệ hiện tại.

Hãy cẩn thận

ví dụ: chụp ảnh nhanh hàng ngày của trường hợp subvolume:

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

Điều gì đã thay đổi giữa snap1 và snap2?

$ btrfs-diff snap1/ snap2/
bar1
foo2

Vì vậy, chúng ta có thể thấy tệp mới, xem tệp đã sửa đổi, nhưng việc xóa không được báo cáo . Điều này là do lệnh báo cáo về các tệp tồn tại, chứ không phải các tệp hiện không có.

Điều gì đã thay đổi giữa snap2 và subvolume sống?

$ btrfs-diff snap2/ live/
foo3

các tập tin đổi tên không được báo cáo . Dữ liệu của nó không thay đổi.

Bây giờ nếu chúng ta thêm dữ liệu vào tệp đã đổi tên

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

OK, có ý nghĩa. Nhưng hãy tạo một tập tin mới

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

hả lala ở đâu . Nếu bạn thêm một tập tin khác, lalaxuất hiện. Vì vậy, hành vi này là một chút kỳ lạ. Đó có lẽ là lý do tại sao wiki nói:

Cách tiếp cận tìm kiếm mới có một số hạn chế nghiêm trọng và do đó không thực sự có thể sử dụng được cho những thứ như gửi / nhận.

Tuy nhiên, sự kỳ lạ xuất hiện khi bạn so sánh một subvolume trực tiếp với trạng thái trước đó, chứ không phải khi bạn so sánh các ảnh chụp nhanh (chỉ đọc). Vì vậy, điều này vẫn có thể hữu ích trừ khi bạn muốn xác định các tệp đã bị xóa.


Này, tôi đã mở rộng công cụ của bạn một chút. Công cụ này sẽ hiển thị cho bạn một luồng tất cả các thay đổi đã xảy ra trong ảnh chụp nhanh (nó cũng có thể chọn các liên kết riêng lẻ) github.com/talwrii/btrlog
Att Righ

1

Điều này được hỗ trợ bởi các công cụ tiện lợi chụp nhanh snapper.

sudo snapper -c config diff 445..446

Tất nhiên điều này đòi hỏi bạn phải sử dụng snappercho ảnh chụp nhanh của bạn.

Id chụp nhanh này có thể được tìm thấy bằng cách sử dụng snapper list -a. Thật không may tại thời điểm viết snapper không hỗ trợ các snapshot danh sách cho một cấu hình duy nhất, mặc dù những con số này có thể được tìm thấy từ các tên subvolume.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.