Restic ile yedeklemeleri yönetirken, anlık görüntüler arasında nelerin değiştiğini bilmek, denetim yapmak, anormallikleri tespit etmek veya veri büyümesini anlamak için çok önemlidir. Restic diff --json komutunu jq ile birleştirerek ham diff çıktısını eyleme dönüştürülebilir bilgilere dönüştürüyorum — özellikle hangi dizinlerin en çok değiştiğini görmek için.
İki Anlık Görüntü Arasında JSON Farkı Alma
Temel komut basittir: iki anlık görüntü arasında, etiketleri, zaman damgaları veya kimlikleriyle tanımlanan, restic diff komutunu --json bayrağıyla çalıştırın. Genellikle belirli bir zaman aralığını araştırmıyorsam, en son iki anlık görüntüyü karşılaştırırım.
restic diff --json latest2 latest1
Bu komut, her bir nesne bir dosya değişikliğini (eklenen, değiştirilen, silinen veya türü değiştirilen) tanımlayan bir JSON dizisi çıktısı verir. Her giriş, yol, boyut değişikliği ve blob kimliklerini içerir. Makine tarafından okunabilir olsa da, doğrudan yorumlaması zor olur.
Parsing ve Özetleme ile jq
Çıktıyı jq üzerinden pipe'liyorum ve dizinlere göre değişiklikleri topluyorum. Bu, hotspot'ları tespit etmemizi sağlıyor — örneğin, /var/log veya /home/user/data sürekli göründüyse, bu dizinlerde saklama veya hariç tutma kurallarına odaklanmam gerektiğini anlarım.
Kullandığım tek satırlık komut şu:
restic diff --json latest2 latest1 | jq -s 'group_by(.path | split("/")[0:2] | join("/")) | map({dir: .[0].path | split("/")[0:2] | join("/"), count: length, total_size_change: map(.size_change) | add}) | sort_by(.count) | reverse | .[0:10]'
Bu komut, ilk iki yol bileşenine göre (örneğin home/user, var/log) değişiklikleri gruplar, her dizinde kaç dosyanın değiştiğini sayar, boyut değişikliklerini toplar ve en aktif 10 dizini döndürür.
Bu komutu çalıştırdıktan sonra şöyle bir çıktı görebilirim:
[
{
"dir": "home/user",
"count": 142,
"total_size_change": 2048576
},
{
"dir": "var/log",
"count": 89,
"total_size_change": 10485760
},
{
"dir": "etc",
"count": 12,
"total_size_change": -4096
}
]
Bu, home/user dizininde en fazla dosya değişikliği olduğu (142), var/log dizininde ise boyut artışı en büyük olduğu (10485760 bayt) anlamına gelir — bu bilgiler, yedekleme temizleme ayarlarını optimize etmek veya beklenmeyen log döndürme davranışlarını araştırmak için faydalıdır.
Otomatikleştirme raporu
Bu komut dosyasını restic-change-report.sh adıyla kaydediyorum ve haftalık olarak cron üzerinden çalıştırıyorum. Çıktı e-posta olarak gönderiliyor veya bir izleme sistemine iletiliyor. Kullanıcıların beklenmedik şekilde yedeklenen dizinlere büyük dosyalar dökmeye başladığı ortak ortamlarda özellikle faydalı buluyorum.
Önceki gönderimimde auditd ve crontab izleme hakkında bahsettiğim gibi (https://furkanikkan.com/urun/auditd-ile-yetkisiz-crontab-degisikliklerini-anlik-siem-e-aktarma-78), proaktif görünürlük sürprizleri önler.
İpuçları ve Uyarılar
- Diff komutlarını önce küçük bir depoda test edin — büyük geçmişler zaman alabilir.
- Birden fazla kaynağı yedekliyorsanız gürültüyü önlemek için --host ve --paths bayraklarını kullanın.
- restic diff, mantıksal değişiklikleri gösterir; bir dosya aynı şekilde yeniden yazıldıysa, görünmeyebilir.
- Şifreli depolar için RESTIC_PASSWORD ortam değişkeninin ayarlandığından emin olun — aksi takdirde komut sessizce başarısız olur.
Bu yaklaşımın çalışmasının nedeni
Yedekleme artışının nedenini tahmin etmek yerine, bu yöntem bana veri sağlar. Zamana dayanarak, bu raporları kullanarak include/exclude desenlerini ayarladım, davranışı bozuk uygulamaları yakaladım ve hatta ransomware benzeri davranışları erken aşamada tespit ettim.
restic kullanıyorsan ve ‘sadece çalışır’ durumundan ‘ne olduğunu biliyorum’ durumuna geçmek istiyorsan, restic diff ve jq ile başla. Hafif, betiklenebilir ve zaten sahip olduğun araçlara entegre edilmiştir.
Kapak görseli: Lenharth Systems · CC0 (Openverse / kamu malı) · https://stocksnap.io/photo/computer-hard-2J3PLNMO9M
