Apakah btrf memiliki cara yang efisien untuk membandingkan foto?

21

Meskipun snapshot yang dipasang di atas berfungsi, sepertinya itu bisa sangat lambat dalam banyak kasus.

Apakah ada fungsi spesifik btrfs untuk membedakan snapshot? (Saya tidak dapat menemukannya di dokumen)

Catskul
sumber
Meskipun dimungkinkan untuk mengetahui blok mana yang diubah dan bagaimana, Anda perlu mempertimbangkan kasus ketika perubahan telah dibalik nanti, jika Anda benar-benar ingin membandingkan sistem file (direktori). Sebagai contoh jika Anda memiliki file yang Aberisi a, menulis bdalam snapshot-nya dan kemudian mengubahnya kembali a, file tidak benar-benar berubah sama sekali.
Cristian Ciupitu
Sepertinya itu akan sepenuhnya analog dengan kontrol revisi kode sumber di mana hal semacam ini dilakukan sepanjang waktu, kecuali saya kehilangan sesuatu.
Catskul
Masalah tambahan menjalankan sesuatu seperti rsync pada sistem file btrfs adalah bahwa, kecuali jika opsi mount noatime digunakan, membaca semua file untuk memeriksa apakah mereka telah berubah akan secara efektif memodifikasinya dan snapshot berikutnya akan menjadi besar bahkan jika tidak ada file yang benar-benar dimodifikasi . Lihat lwn.net/Articles/499293 untuk diskusi.
Luca Citi

Jawaban:

11

Sepertinya Anda mencari mengirim / menerima btrf , yang akan muncul di Linux 3.6. The sendPerintah menciptakan sebuah file log dari perbedaan antara dua foto, dan receiveperintah berlaku perubahan dari sebuah file. Perhatikan bahwa kirim / terima menggunakan format file khusus, sehingga file tidak akan persis seperti, katakanlah, diff atau tar.

amcnabb
sumber
Bagus! Itulah tepatnya yang saya cari.
Catskul
2
Untuk contoh aplikasi yang mem-parsing output ini, lihat: github.com/sysnux/btrfs-snapshots-diff (bukan oleh saya)
Att Righ
10

Saya menjalankan stabil Debian yang tidak ada btrfs send, jadi saya mencari solusi menggunakan btrfs subvolume find-new.

Jika Anda memiliki snapshot1 dan snapshot2 dan Anda ingin tahu apa yang berubah pada yang berikutnya, snapshot 2, karena snapshot1 dibuat, Anda dapat menggunakan skrip di bawah ini yang menyediakan

btrfs-diff oldsnapshot/ newsnapshot/

yang akan mencantumkan semua file yang diubah dalam newsnapshot / sejak 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

Untuk menjelaskan: btrfs subvolume find-newmenemukan file berubah setelah 'generasi' snapshot tertentu. Ini juga melaporkan nomor generasi saat ini.

Peringatan

mis. mengambil snapshot harian dari sebuah kasus 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

Apa yang berubah antara snap1 dan snap2?

$ btrfs-diff snap1/ snap2/
bar1
foo2

Jadi kita dapat melihat file baru, melihat file yang dimodifikasi, tetapi penghapusan tidak dilaporkan . Ini karena perintah melaporkan file yang ada, bukan yang sekarang tidak.

Apa yang berubah antara snap2 dan subvolume langsung?

$ btrfs-diff snap2/ live/
foo3

file yang diganti namanya tidak dilaporkan . Datanya tidak berubah.

Sekarang bagaimana jika kita menambahkan data ke file yang diganti namanya

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

OKE, masuk akal. Tapi mari kita buat file baru

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

eh! dimana lala? . Jika Anda menambahkan file lain, lalamuncul. Jadi perilaku ini agak aneh. Mungkin itulah sebabnya wiki mengatakan:

Pendekatan find-new memiliki beberapa batasan serius dan karenanya tidak dapat digunakan untuk sesuatu seperti mengirim / menerima.

Namun, keanehannya muncul ketika Anda membandingkan subvolume langsung dengan keadaan sebelumnya, bukan ketika Anda membandingkan snapshot (hanya baca). Jadi ini masih bisa berguna kecuali Anda ingin juga mengidentifikasi file yang dihapus.

artfulrobot
sumber
Hai, saya telah sedikit memperluas alat Anda. Alat ini akan menunjukkan kepada Anda aliran semua perubahan yang telah terjadi dalam snapshots (ini juga dapat memilih tautan individual) github.com/talwrii/btrlog
Att Righ
1

Ini didukung oleh alat kenyamanan snapshot snapper.

sudo snapper -c config diff 445..446

Tentu saja ini mengharuskan Anda menggunakan snappersnapshot Anda.

Id snapshot ini dapat ditemukan menggunakan snapper list -a. Sayangnya pada saat penulisan snapper tidak mendukung snapshot daftar untuk satu konfigurasi, meskipun angka-angka ini dapat ditemukan dari nama subvolume.

Att Righ
sumber