Asagidaki script eski zfs den yeni zfs veri kopyalamasi yapar.
##########################scriptin calistirma sorumlulugu calistirana aittir. #######################################
#!/bin/bash
# zfs uzerindek verileri hizli tasimak icin zfs replikasyonu yapar
#
# Kullanım: ./zfs_local_replicate.sh source_dataset destination_dataset
# 2025.05.13
# Remzi AKYUZ
# remzi@akyuz.tech
SOURCE_FS="$1"
DEST_FS="$2"
DATE=$(date +"%Y%m%d-%H%M%S")
SNAPSHOT_NAME="${SOURCE_FS}@replica-${DATE}"
# Hatalı kullanım kontrolü
if [[ -z "$SOURCE_FS" || -z "$DEST_FS" ]]; then
echo "Kullanım: $0 <source_dataset> <destination_dataset>"
exit 1
fi
# 1. Snapshot oluştur
echo "[+] Snapshot oluşturuluyor: $SNAPSHOT_NAME"
zfs snapshot "$SNAPSHOT_NAME"
# 2. İlk defa mı yoksa incremental mi?
LAST_SNAP=$(zfs list -t snapshot -o name -s creation | grep "^${SOURCE_FS}@replica-" | tail -2 | head -1)
if [[ -n "$LAST_SNAP" && "$LAST_SNAP" != "$SNAPSHOT_NAME" ]]; then
echo "[+] Incremental send: $LAST_SNAP -> $SNAPSHOT_NAME"
zfs send -i "$LAST_SNAP" "$SNAPSHOT_NAME" | zfs receive -F "$DEST_FS"
else
echo "[+] Tam send (ilk kez çalışıyor olabilir)"
zfs send "$SNAPSHOT_NAME" | zfs receive -F "$DEST_FS"
fi
# 3. Replikasyon tamam
echo "[+] Replikasyon tamamlandı. Hedef: $DEST_FS"
# 4. Eski snapshot'ları sil (yalnızca replica- ile başlayanlar)
echo "[+] Eski snapshot'lar temizleniyor, yalnızca son 3 adet tutulacak..."
SNAPSHOTS=($(zfs list -t snapshot -o name -s creation | grep "^${SOURCE_FS}@replica-" ))
TOTAL=${#SNAPSHOTS[@]}
if (( TOTAL > 3 )); then
COUNT=$((TOTAL - 3))
for ((i=0; i<$COUNT; i++)); do
OLD_SNAP="${SNAPSHOTS[$i]}"
echo "[-] Siliniyor: $OLD_SNAP"
zfs destroy "$OLD_SNAP"
done
else
echo "[=] Silinecek eski snapshot bulunamadı (toplam: $TOTAL)"
fi
echo "[+] Hedef dataset'teki eski snapshot'lar temizleniyor..."
DEST_SNAPSHOTS=($(zfs list -t snapshot -o name -s creation | grep "^${DEST_FS}@replica-" ))
TOTAL_DEST=${#DEST_SNAPSHOTS[@]}
if (( TOTAL_DEST > 3 )); then
COUNT_DEST=$((TOTAL_DEST - 3))
for ((i=0; i<$COUNT_DEST; i++)); do
OLD_DEST_SNAP="${DEST_SNAPSHOTS[$i]}"
echo "[-] Siliniyor (hedef): $OLD_DEST_SNAP"
zfs destroy "$OLD_DEST_SNAP"
done
else
echo "[=] Silinecek hedef snapshot bulunamadı (toplam: $TOTAL_DEST)"
fi
##########################scriptin calistirma sorumlulugu calistirana aittir. #######################################
Ozellikle buyuk hacimli dosya sistemlerinin tasinmasi icin uygundur.
tasima islemleri snapshotlar ile yapilmaktadir. snapshot esnasinda acik dosya varsa, acik dosyalar kapatilip, script calistirilir ve tekrar dosya yazma islemlerine devam edilir.
Bellir bir servis kullaniyorsaniz, servisi durdurun, script baslatin, snaphot alindiktan ve kopyalama devam ederken, servisi tekrar baslatabilirsiniz.
Alternatif olarak scriptdeki asagidaki satirlari duzenleyebilirsiniz.
systemctl stop servis_ismi
# 1. Snapshot oluştur
echo "[+] Snapshot oluşturuluyor: $SNAPSHOT_NAME"
zfs snapshot "$SNAPSHOT_NAME"
systemctl start servis_ismi
Bu islem servisini anlik olarak durdurur, snap sonrasi tekrar baslatir.
Servisinizin data butunlugu korunmus olur.
Hiç yorum yok:
Yorum Gönder