Btrfs anlık görüntüleri karşılaştırmak için etkili bir yol var mı?


21

Farklı montajlı enstantaneler işe yarayabilirken, çoğu durumda korkunç derecede yavaş olabilir gibi geliyor.

Anlık fotoğraf çekimi için btrfs özel işlevi var mı? (Dokümanlarda herhangi bir şey bulamadım)


Hangi blokların değiştirildiğini ve nasıl değiştirildiğini bulmak mümkün olsa da, dosya sistemlerini (dizinleri) gerçekten karşılaştırmak istiyorsanız, bir değişikliğin daha sonra tersine çevrildiği durumu göz önünde bulundurmanız gerekir. Örneğin , Aiçeren bir dosyanız varsa , anlık görüntüsüne yazın ve daha sonra tekrar değiştirin , dosya gerçekten hiç değişmedi. aba
Cristian Ciupitu

Bir şeyleri kaçırmadığım sürece, bu tür bir işin her zaman yapıldığı kaynak kod revizyon kontrolüne tamamen benzeyecek gibi görünüyor.
Catskul

Btrfs dosya sisteminde rsync gibi bir şey çalıştırmanın ek bir problemi, noatime mount seçeneği kullanılmadığı sürece, değiştirilip değiştirilmediğini kontrol etmek için tüm dosyaları okumak, onları etkin bir şekilde değiştirecek ve bir sonraki anlık görüntü, hiçbir dosya değiştirilmemiş olsa bile büyük olacağı yönündedir. . Bir tartışma için lwn.net/Articles/499293 e bakınız .
Luca Citi

Yanıtlar:


11

Linux 3.6'da görünecek olan btrfs gönderme / alma'yı aradığınıza benziyor . sendKomut iki enstantane arasındaki farklılıkların bir günlük dosyası oluşturur ve receivekomut bir dosyadan değişiklikleri uygular. Gönderme / alma işleminin özel bir dosya biçimi kullandığına dikkat edin, bu nedenle dosya tam olarak, di, diff veya tar gibi görünmez.


Güzel! Tam olarak aradığım şey buydu.
Catskul

2
Bu çıktıyı çözümleyen bir örnek uygulama için bkz: github.com/sysnux/btrfs-snapshots-diff (bana göre değil)
Att Righ

10

Sahip olmayan bir Debian kararlı çalıştırıyorum btrfs send, bu yüzden kullanarak bir çözüme baktım btrfs subvolume find-new.

Anlık görüntü1 ve anlık görüntü2'niz varsa ve sonrakinde nelerin değiştiğini bilmek istiyorsanız, anlık görüntü 2 yapıldığı için, anlık görüntü 2 yapıldıktan sonra aşağıdaki komut dosyasını kullanabilirsiniz.

btrfs-diff oldsnapshot/ newsnapshot/

Bu, newsnapshot / since / oldsnapshot / den değiştirilen tüm dosyaları listeler.

#!/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

Açıklamak için: belirli bir “nesil” anlık görüntüsünden sonrabtrfs subvolume find-new değişen dosyaları bulur . Ayrıca mevcut üretim numarasını da bildirir.

Uyarılar

örneğin, bir alt hacimli vakanın günlük görüntüsünü alın:

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 ve snap2 arasında neler değişti?

$ btrfs-diff snap1/ snap2/
bar1
foo2

Böylece yeni dosyayı görebilir, değiştirilen dosyayı görebiliriz ancak silme bildirilmez . Bunun nedeni, komutun şu anda olmayan dosyaları değil varolan dosyaları bildirmesidir.

Snap2 ve canlı alt hacim arasında ne değişti?

$ btrfs-diff snap2/ live/
foo3

yeniden adlandırılan dosya bildirilmez . Verileri değişmedi.

Şimdi, yeniden adlandırılmış dosyaya veri eklersek ne olur?

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

Tamam, mantıklı. Ama yeni bir dosya yapalım

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

ha! lala nerede? . Başka bir dosya eklerseniz, lalagörünür. Yani bu davranış biraz garip. Wiki bu yüzden muhtemelen şöyle diyor:

Yeni bulma yaklaşımının bazı ciddi kısıtlamaları vardır ve bu nedenle gönderme / alma gibi bir şey için gerçekten kullanılamaz.

Ancak, gariplik, canlı bir alt sesi önceki bir durumla karşılaştırdığınızda (salt okunur) anlık görüntüleri karşılaştırırken değil. Bu nedenle, silinen dosyaları da tanımlamak istemediğiniz sürece bu hala yararlı olabilir.


Selam, aletini biraz uzattım. Bu araç size anlık görüntülerde meydana gelen tüm değişikliklerin akışını gösterecektir (ayrıca bireysel bağlantıları da seçebilir) github.com/talwrii/btrlog
Att Righ

1

Bu anlık görüntü kolaylık aracı tarafından desteklenir snapper.

sudo snapper -c config diff 445..446

Elbette bu snapper, enstantaneleriniz için kullanmanızı gerektirir .

Bu anlık görüntü kimliklerini kullanarak bulunabilir snapper list -a. Ne yazık ki, snapper yazarken, tek bir yapılandırma için liste anlık görüntülerini desteklemiyordu;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.