Robocopy Offline Backup (Robust File Copy), Windows işletim sistemlerinde dosya kopyalama ve yedekleme işlemleri için kullanılan bir komut satırı aracıdır. Kullanım alanları çok değişkenlik gösterse de ben bugün offline backup işlemleri için sizlere yol gösteriyor olacağım.
Offline Backup Senaryosu :
Diyelim ki Veeam Backup, sanal sunucu yedeklerini güvende tutmak ve olası kritik durumlar için verileri güvene almak istiyoruz. Datastore üzerinde 18TB veri olduğunu varsayalım. Bu bağlamda elimizde de offline backup için tuttuğumuz 2x10TB toplam 20TB alan olduğunu varsayalım.
İlk aşamada sürükle bırak mantığı ile verileri kopyalayabileceğimizi düşünsek de veri dosyalarının çok büyük olması sebebiyle 2 parça halinde ayrı disklere atmak bir hayli uğraştırıcı olacaktır. Diğer yandan ise Robocopy Offline Backup sırasında, dosya sistemi üzerinde başka işlemler (örneğin, kullanıcı etkileşimleri veya diğer uygulamalar) gerçekleşmediği için, Robocopy daha az disk I/O rekabeti ile karşılaşır ve bu da genellikle daha hızlı bir kopyalama süreci anlamına gelir. Öyleyse senaryoya istinaden robocopy için hangi powershell komutlarını çalıştırırız örnek ile göstereyim.
$source = "D:\KaynakVeri"
$destination1 = "E:\Hedef1"
$destination2 = "F:\Hedef2"
$currentDestination = $destination1
function Get-FreeSpace {
param (
[string]$drivePath
)
$driveLetter = ($drivePath -split ":")[0]
return (Get-Volume -DriveLetter $driveLetter).SizeRemaining
}
function Get-FileSize {
param (
[string]$filePath
)
return (Get-Item $filePath).length
}
Get-ChildItem -Path $source -Recurse | Where-Object { !$_.PSIsContainer } | ForEach-Object {
$fileSize = Get-FileSize $_.FullName
$relativePath = $_.FullName.Substring($source.Length)
$targetPath = Join-Path $currentDestination $relativePath
if ($fileSize -gt (Get-FreeSpace $currentDestination)) {
if ($currentDestination -eq $destination1) {
$currentDestination = $destination2
$targetPath = Join-Path $currentDestination $relativePath
} else {
Write-Error "Both destinations are full!"
exit
}
}
$targetDir = [System.IO.Path]::GetDirectoryName($targetPath)
if (-not (Test-Path $targetDir)) {
New-Item -ItemType Directory -Path $targetDir -Force
}
robocopy $_.DirectoryName $targetDir $_.Name /R:5 /W:5
}
Robocopy Kodun İşlevi :
- 1-Dosyanın boyutunu alır. Kopyalamayı başlatır
- 2-Şu anki hedef klasörde yeterli alan olup olmadığını kontrol eder.
- 3-Eğer yeterli alan yoksa, hedefi değiştirir.
- 4-Dosyayı hedef klasöre kopyalar.
Sonuç olarak ; örnek bir senaryo üzerinden robocopy’nin işlevlerini sizlerle paylaşmak istedim. Bu neticede olayın mantığını kavrayarak kullanım alanlarını genişletebilirsiniz. Aynı zamanda konu ilginizi çektiyse Temel Powershell Komutları – Pratik Kodlar başlıklı makaleye göz atabilirsiniz.
Kaynak Chatgpt‘nin bizzat kendisidir. Kod bilgileri ve senaryonun gerçekleşmesinde rol oynamıştır.