PowerShell Yedekleme Sistemi Oluşturma
Beni Twitter'da takip ediyorsanız, yedeklemeleri çalıştırma ve test etme konusunda aylık bir tweet hatırlatıcımın olduğunu biliyorsunuzdur. Bugün yedekleme kavramının, BT'ye başladığım dönemden farklı olduğunu söylemeliyim. Artık ucuz disk depolama ve bulut hizmetlerimiz var. Bazı yönlerden verilerimiz sürekli olarak yedeklenmektedir. Bu benim için bile geçerli. Verileri birden fazla cihaza kaydetmek ve senkronize etmek için bir dizi bulut hizmeti kullanıyorum. Uzun süre herhangi bir resmi yedekleme stratejisi hakkında düşünmedim. Ama belki de yaşlılığımda biraz daha temkinli davranıyorum. Ya da belki paranoyak. Son zamanlarda, yerel olarak bulut hizmetlerime kötü veri aktaran bir şeylerin meydana gelmesinden endişelenmeye başladım. Soruna neyin sebep olduğu gerçekten önemli değil, yalnızca bozuk veya hatalı verileri bulutla senkronize etmek zorunda kalabilirim. Daha iyi hazırlanmam gerekiyor. PowerShell çalışanı olduğum için PowerShell yedekleme sistemine ihtiyacım var.
Makul önlemler aldığımı düşünmek isterim. ESET Internet Security'yi sistemlerimde çalıştırıyorum. Şüpheli web sitelerini ziyaret ediyorum. Yamaları ve güncellemeleri takip ediyorum. Windows 10 araçlarını kullanarak anahtar klasörlerin yedeğini bile ayarladım. Ancak seçeneklere sahip olmayı seviyorum. Geçtiğimiz hafta boyunca PowerShell tabanlı bir yedekleme çözümü oluşturuyordum. Belki bu ihtiyacınız olan bir şey değildir, ancak kullandığım tekniklerden bazılarını kendi çalışmalarınızda yararlı bulabilirsiniz.
Temel Yedeklemeler
Yedekleme yaklaşımım, tam yedekleme ve ardından günlük artımlı yedeklemelerden oluşan geleneksel bir modeli izliyor. Yerel ağımda zaten yedekleme kaynağı olarak kullandığım bir Synology NAS cihazım var. Anahtar klasörlerin arşiv dosyalarını YearMonthDay_identifier_FULL adlandırma kuralını kullanarak oluşturdum. Arşivi oluşturmak için hangi aracı kullandığınız gerçekten önemli değil. WinRar kullandığım için 20191101_scripts-FULL.rar gibi bir dosyayla karşılaşıyorum. Compress-Archive'ı kullanmaya başladım ancak gizli dosya ve klasörler konusunda bilinen bir sınırlaması var. Git projelerimi de yedeklemek istediğim için başka bir şeye yönelmek zorunda kaldım. Sanırım GitHub'a geçtiğimden beri bu öğeleri atlayabilirim. Ancak her yerel proje GitHub'da yer almıyor. Ne olursa olsun, gizli bir dosya içerebilecek yedeklemem gereken başka işlerim olabilir, bu nedenle Compress-Archive bir seçenek değildir. Gelecekteki bir gönderide WinRar'ı çalıştırmak için kullandığım PowerShell kodunu paylaşacağım.
Dosyaları İzleme
Yedekleme sürecimdeki en önemli adım, hangi dosyaların aşamalı olarak yedekleneceğine karar vermektir. Bunun için .NET System.IO.FileSystemWatcher'a ve bir etkinlik aboneliğine başvurmaya karar verdim. İşte bunun nasıl çalıştığına dair bir örnek. Öncelikle FileSystemWatcher'ın bir örneğini oluşturuyorum.
$path="C:\work\"
#define the watcher object
$watcher=[System.IO.FileSystemWatcher]($path)
$watcher.IncludeSubdirectories = $True
#enable the watcher
$watcher.EnableRaisingEvents=$True
İzleyicinin alt klasörleri izlemesini etkinleştirdiğinizden emin olun. İlk seferde bunu kaçırdım ve neden tüm değişikliklerimin algılanmadığını anlayamadım.
Bunun varsayılan olarak tüm dosyaları (*.*) izleyeceğini görebilirsiniz ki bu benim amaçlarım için uygundur. Sonunda ek filtrelemeyi nasıl uyguladığımı göreceksiniz. Daha sonra Register-ObjectEvent'i kullanarak etkinlik abonesini oluşturuyorum.
$params = @{
InputObject = $watcher
Eventname = "Changed"
SourceIdentifier = "WorkChange"
MessageData = "A file was created or changed"
}
Register-ObjectEvent @params
FileSystemWatcher kullanılırken EventName için olası seçenekler Değiştirildi, Oluşturuldu ve Silindi'dir. Teknik olarak Yeniden Adlandırılmış bir etkinlik var ama onunla hiç çalışmadım. Aboneliği görüntülemek için Get-EventSubscriber cmdlet'ini kullanın.
Bu aboneliği oluşturduğumda, C:\Work'te her dosya değiştirildiğinde (veya oluşturulduğunda) bir etkinlik alacağım. Bu olayları Get-Event ile görebilirsiniz.
Dosyayla ilgili bilgiler SourceEventArgs özelliğinde depolanır.
Yedekleme için C:\Work izlemem gerekse bu dosyayı eklemeyi bilirdim.
Sonuç Alma
Bu PowerShell oturumu çalıştığı sürece etkinlik abonesi değişiklikleri yakalayacaktır. Günün ilerleyen saatlerinde yedeklenmeye hazır tüm dosyaların bir listesini alabilirim.
(Get-Event).sourceEventArgs.fullpath | Select-Object -unique | Where-Object { Test-Path $_}
Benzersiz yolları filtreliyorum çünkü bazen bir dosya değişikliği aynı dosya için birden fazla olayı tetikleyebilir. Veya bir dosyayı gün içinde birkaç kez değiştirebilirim. Ayrıca bir dosyayı da silebilirim, bu yüzden yolu test ediyorum.
Artımlı bir arşiv oluşturmak için bu dosyaları yedekleme rutinime aktarabilirim.
Sonraki adımlar
Ancak şu ana kadar gösterdiklerimin sınırlamaları var. PowerShell'i kapatırsam etkinlik abonesini kaybederim. Bu arada, etkinlik abonesini manuel olarak kaldırmak için Unregister-Event'i kullanabilirsiniz. Ayrıca izlemek istediğim birden fazla klasör var. Bir dahaki sefere günlük izleme ihtiyaçlarımı karşılamak için zamanlanmış bir PowerShell işini nasıl kurduğumu size göstereceğim.