Sistem yöneticiliğinde “bir şeylerin ters gitmesi” meselesi kaçınılmazdır. Diskler bozulur, sistemler çöker, veriler kaybolur. İşte tam bu yüzden dd komutunu iyice öğrenmek, her sysadmin’in temel becerilerinden biri olmalı. dd ilk bakışta sıradan görünebilir, ama doğru kullanıldığında disk klonlama, yedek imaj oluşturma, USB hazırlama ve hatta veri kurtarma gibi kritik işlemleri tek bir araçla halledebilirsiniz.
dd Komutu Nedir?
dd, “data duplicator” ya da bazı kaynaklarda esprili biçimde “disk destroyer” olarak da anılır. Bu ikinci takma ad boşuna değil: yanlış parametrelerle çalıştırıldığında saatlerce uğraştığınız veriyi saniyeler içinde silebilir. Ama panik yapmayın, mantığını kavradığınızda bu komut sizin en güvenilir arkadaşınıza dönüşür.
dd, Unix/Linux dünyasında onlarca yıldır var olan bir araç. Ham veri kopyalaması yapar; yani dosya sistemi, bölümleme tablosu, MBR, boş alanlar dahil her şeyi bit bit okuyup yazar. Bu özelliği onu cp gibi basit kopyalama araçlarından tamamen farklı bir kategoriye sokar.
Temel Sözdizimi
dd komutunun sözdizimi diğer Linux komutlarından biraz farklıdır. Parametre olarak anahtar=değer formatı kullanılır:
dd if=<kaynak> of=<hedef> [seçenekler]
Temel parametreler şunlardır:
- if: Input file, yani okuma yapılacak kaynak
- of: Output file, yani yazma yapılacak hedef
- bs: Block size, her seferinde okunup yazılacak blok boyutu (örn: 512, 4K, 1M, 4G)
- count: Kaç blok kopyalanacağı
- skip: Kaynakta başlangıçta kaç blok atlanacağı
- seek: Hedefte başlangıçta kaç blok atlanacağı
- conv: Dönüşüm seçenekleri (noerror, sync, notrunc vb.)
- status: İlerleme çıktısının kontrolü (none, noxfer, progress)
- iflag/oflag: Giriş/çıkış bayrakları (direct, sync, dsync vb.)
Basit Örneklerle Başlamak
Komutun mantığını kavramak için önce küçük ve risksiz örneklerle başlayalım.
Bir Dosya Oluşturmak
dd if=/dev/zero of=test_dosyasi.bin bs=1M count=100
Bu komut /dev/zero kaynağından (sonsuz sıfır baytı üreten sanal aygıt) 1 MB’lık 100 blok okuyarak 100 MB boyutunda sıfırlarla dolu bir dosya oluşturur. Test ortamları kurarken, swap dosyası oluştururken ya da bir diski test etmeden önce bu yöntemi sıkça kullanırsınız.
Rastgele Veriyle Dolu Dosya
dd if=/dev/urandom of=rastgele.bin bs=1M count=50
Güvenlik testleri için rastgele veri içeren dosyalar oluşturmak gerektiğinde /dev/urandom devreye girer. /dev/zeroya göre çok daha yavaş çalışır ama gerçek rastgele veri üretir.
Gerçek Dünya Senaryosu 1: USB Bellek’e ISO Yazmak
Bir sunucuyu sıfırdan kuracaksınız. Elinizde bir ISO dosyası var ve bunu USB belleğe yazmak istiyorsunuz. dd bu iş için mükemmeldir:
# Önce USB belleğin hangi aygıt olduğunu tespit edin
lsblk
# ISO'yu USB belleğe yazın
sudo dd if=/home/admin/ubuntu-22.04-server-amd64.iso of=/dev/sdb bs=4M status=progress conv=fsync
Burada conv=fsync parametresi kritik öneme sahip. Bu seçenek, dd tamamlanmadan önce tüm verinin fiziksel olarak diske yazılmasını garanti eder. Aksi hâlde komut bitmiş görünse de verinin bir kısmı hâlâ önbellekte olabilir ve USB’yi çektiğinizde sorun yaşarsınız.
status=progress ile de gerçek zamanlı ilerleme bilgisi alırsınız:
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 45.2371 s, 23.7 MB/s
Gerçek Dünya Senaryosu 2: Disk İmajı Oluşturmak
Bir sunucunuzu taşımadan veya büyük bir güncelleme yapmadan önce tam disk imajı almanız şart. İşte tam bir disk imajı alma komutu:
sudo dd if=/dev/sda of=/mnt/backup/sunucu_imaj_$(date +%Y%m%d).img bs=4M status=progress
Tarih damgası eklemek için $(date +%Y%m%d) kullanmak, birden fazla yedek tuttuğunuzda hangisinin ne zaman alındığını anlık görmenizi sağlar.
Eğer ağ üzerinden başka bir sunucuya imaj almak istiyorsanız SSH ile pipe kullanabilirsiniz:
sudo dd if=/dev/sda bs=4M status=progress | ssh yedek-sunucu "dd of=/backup/sunucu_imaj.img"
Bu yöntem son derece verimlidir. Yerel diskten okuma yapılır, SSH tüneli üzerinden uzak sunucuya yazılır. Aradaki ağ bant genişliği ve gecikme süresine göre hız değişse de kritik anlarda hayat kurtarır.
Gerçek Dünya Senaryosu 3: İmajdan Diske Geri Yüklemek
Yedek imajınızı yeni bir diske yazmak için işlemi tersine çevirmeniz yeterli:
sudo dd if=/mnt/backup/sunucu_imaj_20240315.img of=/dev/sdb bs=4M status=progress
Dikkat: if ve of parametrelerini karıştırırsanız felaket olur. Hedef diskinizin içeriğini imajın üzerine yazarsınız. Bu hatayı yapan sayısız sysadmin hikayesi vardır. Komutu çalıştırmadan önce her zaman iki kez kontrol edin.
Gerçek Dünya Senaryosu 4: Disk Klonlama (Birebir Kopyalama)
Eski bir sunucunun diskini daha büyük bir diske taşıyacaksınız. dd ile birebir klonlama yapabilirsiniz:
sudo dd if=/dev/sda of=/dev/sdb bs=4M conv=noerror,sync status=progress
Burada conv=noerror,sync kombinasyonu özellikle önemli. Kaynak diskte bozuk sektörler varsa noerror sayesinde komut durmaz, okuma hatalarını atlar. sync ise bozuk blokları sıfır baytlarla doldurarak hedef diskin boyutunu tutarlı tutar. Veri kurtarma operasyonlarında bu parametreler olmazsa olmazdır.
Klonlama sonrası disk boyutları farklıysa (örneğin 500GB diskten 1TB diske geçiş), kalan alanı kullanabilmek için gparted veya parted ile bölümü genişletmeniz gerekir.
Sıkıştırılmış İmaj Oluşturmak
Disk imajları dev boyutlara ulaşabilir. 500GB’lık bir diski imajlamak 500GB yer kaplar. Bunu önlemek için gzip veya xz ile sıkıştırabilirsiniz:
sudo dd if=/dev/sda bs=4M status=progress | gzip -c > /mnt/backup/disk_imaj.img.gz
Geri yüklemek için:
gunzip -c /mnt/backup/disk_imaj.img.gz | sudo dd of=/dev/sda bs=4M status=progress
Daha iyi sıkıştırma oranı istiyorsanız xz kullanabilirsiniz, ancak çok daha yavaş çalışır:
sudo dd if=/dev/sda bs=4M status=progress | xz -z -T 0 > /mnt/backup/disk_imaj.img.xz
-T 0 parametresi tüm CPU çekirdeklerini kullanarak sıkıştırma yapar.
MBR Yedekleme ve Geri Yükleme
Bazen tüm diski değil, yalnızca MBR (Master Boot Record) bölümünü yedeklemek istersiniz. MBR, diskin ilk 512 baytında bulunur ve bölümleme tablosu ile önyükleyici bilgilerini içerir:
# MBR yedekleme
sudo dd if=/dev/sda of=/root/mbr_yedek.bin bs=512 count=1
# MBR geri yükleme
sudo dd if=/root/mbr_yedek.bin of=/dev/sda bs=512 count=1
GPT diskler için durum biraz farklıdır. GPT, diskin başına ve sonuna yedek tablolar yazar. MBR yedeklemenin benzerini GPT için yapmak istiyorsanız genellikle sgdisk aracı daha uygun olur. Yine de dd ile GPT başlığını da yedekleyebilirsiniz:
# İlk 2048 sektörü (GPT başlığı dahil) yedekle
sudo dd if=/dev/sda of=/root/gpt_yedek.bin bs=512 count=2048
İlerleme Durumunu İzlemek
dd varsayılan olarak çalışırken hiçbir çıktı vermez. Yüzlerce gigabaytlık bir disk kopyalarken ekrana bakıp “acaba çalışıyor mu?” diye merak etmek sinir bozucu olabilir. Birkaç yöntemle ilerlemeyi takip edebilirsiniz:
status=progress en kolay yol (Linux kernel 3.x ve üzeri):
sudo dd if=/dev/sda of=/dev/sdb bs=4M status=progress
Eski bir sistemdeyseniz, çalışan dd işlemine USR1 sinyali göndererek anlık durum bilgisi alabilirsiniz:
# dd işleminin PID'ini bul
sudo kill -USR1 $(pgrep dd)
Ya da watch komutuyla periyodik olarak durum raporu alabilirsiniz:
watch -n 5 'sudo kill -USR1 $(pgrep dd)'
Blok Boyutu Seçimi: Performans Üzerindeki Etkisi
bs (block size) parametresi performansı doğrudan etkiler. Varsayılan değer 512 bayttır, ancak bu modern diskler için son derece küçüktür.
- 512 veya 4K: Çok yavaş, sistem çağrısı başına overhead yüksek olur
- 1M: İyi bir başlangıç noktası, çoğu durumda yeterli
- 4M: Çoğu modern disk için optimal değer
- 64M veya üzeri: Büyük bellekli sistemlerde daha hızlı olabilir, ancak çok büyük bloklar bazen performansı düşürebilir
Hangi değerin en iyi performansı verdiğini test etmek için:
# /dev/null'a yazarak saf okuma performansını test et
sudo dd if=/dev/sda of=/dev/null bs=4M status=progress
Veri Güvenli Silme
Bir diski çöpe atmadan, satmadan veya kiraya vermeden önce verilerin geri döndürülemez biçimde silinmesi gerekir. dd bunu için de kullanılabilir:
# Diski sıfırlarla doldur (tek geçiş)
sudo dd if=/dev/zero of=/dev/sdb bs=4M status=progress
# Rastgele veriyle doldur (daha güvenli)
sudo dd if=/dev/urandom of=/dev/sdb bs=4M status=progress
Gerçek anlamda güvenli silme için shred veya nwipe araçları daha uygun olsa da dd ile yapılan tek geçiş rastgele yazma işlemi, sıradan kullanıcıların veri kurtarmasını imkansız hâle getirir.
Sık Yapılan Hatalar ve Dikkat Edilmesi Gerekenler
if ve of’u karıştırmak: Bu en tehlikeli hatadır. Kaynak ve hedefi ters yazmak, kurtarılması imkansız veri kayıplarına neden olur. Komutu yazmadan önce mutlaka lsblk veya fdisk -l ile disk isimlerini doğrulayın.
Bağlı disklere yazma: Kullanımda olan bir diske (özellikle işletim sisteminin kurulu olduğu diske) dd ile yazmak tanımsız davranışlara yol açar. Hedef disk mümkünse bağlantısız olmalı, en azından bağlama noktaları kaldırılmış olmalı.
Boyut kontrolü yapmamak: Kaynak disk hedeften büyükse dd bir noktada durmak zorunda kalır ve eksik bir imaj oluşur. Bu imajdan geri yükleme yapıldığında bölümleme tablosu bozuk çıkabilir.
Sıkıştırılmış imajın bütünlüğünü kontrol etmemek: İmaj aldıktan sonra mutlaka MD5 veya SHA256 kontrol toplamı alın:
# İmaj alındıktan sonra kontrol toplamı oluştur
sha256sum /mnt/backup/sunucu_imaj_20240315.img > /mnt/backup/sunucu_imaj_20240315.img.sha256
# Geri yükleme öncesi doğrulama
sha256sum -c /mnt/backup/sunucu_imaj_20240315.img.sha256
dd ile Bölüm Kopyalama
Tüm diski değil, yalnızca belirli bir bölümü kopyalamak da mümkündür:
# Yalnızca /dev/sda1 bölümünü kopyala
sudo dd if=/dev/sda1 of=/mnt/backup/sda1_imaj.img bs=4M status=progress
# Bir bölümü başka bir diske geri yükle
sudo dd if=/mnt/backup/sda1_imaj.img of=/dev/sdb1 bs=4M status=progress
Ancak bölüm kopyalamada dikkat edilmesi gereken bir nokta var: Hedef bölüm kaynaktan küçük olmamalı. Aksi hâlde veri kesilerek yazılır ve dosya sistemi bozulur.
Ağ Üzerinden Disk Klonlama (PXE veya Doğrudan SSH)
Veri merkezlerinde bazen onlarca sunucunun aynı imajla kurulması gerekir. dd ve netcat kombinasyonu oldukça hızlı bir çözüm sunar:
# Alıcı sunucuda (hedef)
nc -l -p 9999 | sudo dd of=/dev/sda bs=4M status=progress
# Gönderici sunucuda (kaynak)
sudo dd if=/dev/sda bs=4M status=progress | nc hedef-sunucu-ip 9999
Bu yöntem şifreleme içermez. Güvenli bir ağda veya test ortamında kullanmak daha doğru olur. Üretim ortamı için SSH tüneli tercih edilmeli.
dd Alternatiflerini Bilmek
dd her işin aracı olsa da bazı durumlarda özelleşmiş araçlar daha iyi seçenek olabilir:
- dcfldd:
dd‘nin geliştirilmiş versiyonu, MD5 hash hesaplama ve daha ayrıntılı ilerleme bilgisi sunar - ddrescue: Hasarlı disklerden veri kurtarma için tasarlanmıştır,
dd conv=noerror‘dan çok daha akıllı hata yönetimi yapar - Clonezilla: Grafik arayüzlü disk klonlama çözümü, arka planda
ddbenzeri araçlar kullanır - Partclone: Yalnızca kullanılan blokları kopyalar, bu yüzden
dd‘den çok daha hızlı ve az yer kaplar
Gerçek veri kurtarma senaryolarında ddrescue tercih edilmeli. ddrescue, bozuk sektörleri atlayarak mümkün olan en fazla veriyi kurtarır ve başarısız sektörlerin bir log dosyasını tutar. Bu log sayesinde işlemi daha sonra kaldığı yerden devam ettirabilirsiniz.
Pratik Kontrol Listesi: dd Kullanmadan Önce
Sistematik bir yaklaşım benimsemek, felaket senaryolarını büyük ölçüde önler:
lsblkveyafdisk -lile disk isimlerini doğrula- Hedef aygıtın bağlantısını
umountile kes - Yeterli disk alanı olduğunu kontrol et (
df -h) - Komutun
ifveofparametrelerini bir kez daha oku - Uzun sürecek işlemler için
screenveyatmuxiçinde çalıştır - İmaj sonrası kontrol toplamı al
Sonuç
dd komutu, Linux dünyasının en güçlü ve en tehlikeli araçlarından biri. Bu ikili özellik aslında onun değerini anlatıyor: Doğru ellerde ve doğru biçimde kullanıldığında hiçbir araçla kıyaslanamayacak esneklik sunuyor. USB hazırlama, disk klonlama, sistem yedekleme, güvenli silme ve hatta ağ üzerinden disk transferi gibi onlarca farklı görevi tek bir komutla halledebiliyorsunuz.
Öte yandan, dd‘nin acımasız olduğunu da unutmamak gerekiyor. Size “emin misiniz?” diye sormaz. Enter tuşuna bastığınız anda işe başlar. Bu yüzden her dd komutunu çalıştırmadan önce sanki o anın son kontrolüymüş gibi yaklaşın. if ve of parametrelerini bir kez daha okuyun, disk isimlerini teyit edin.
Pratikte en çok işime yarayan kural şu: dd komutunu yazın ama henüz çalıştırmayın, yanınızdaki birine yüksek sesle okuyun ya da bir kağıda yazıp kontrol edin. Saçma gelebilir, ama bu basit alışkanlık sayesinde pek çok felaket önlenmiştir.