dd Komutu ile Disk Görüntüsü Alma, Klonlama ve Kurtarma İşlemleri
Disk kopyalama işlerine ilk başladığımda dd komutunu bir kara kutu gibi görürdüm. İçine ne giriyor, ne çıkıyor tam bilmiyorsunuz, yanlış bir parametre girerseniz diskinizi çöpe atabilirsiniz. Yıllar içinde bu komutu hem sevdim hem de birkaç kez ondan korktum. Ama şunu net söyleyeyim: Doğru kullanıldığında dd, elinizin altındaki en güçlü disk yönetim aracıdır ve xargs gibi pipe zincirlerine ihtiyaç duymadan kendi başına inanılmaz işler yapabilir.
Bu yazıda dd komutunu disk görüntüsü alma, klonlama ve kurtarma senaryoları üzerinden ele alacağım. Teorik değil, gerçekten karşılaşacağınız durumlar üzerinden gideceğiz.
dd Komutunu Anlamak: Temel Mantık
dd aslında “data duplicator” ya da eski Unix geleneğine göre “convert and copy” anlamına gelir. Komutun mantığı şu: bir girdi bloğu okur, isteğe bağlı dönüşümler yapar, çıktı bloğu olarak yazar. Bu kadar basit, bu kadar güçlü.
Temel sözdizimi şöyledir:
dd if=<kaynak> of=<hedef> [parametreler]
- if: input file (kaynak), okuyacağınız yer
- of: output file (hedef), yazacağınız yer
- bs: block size, tek seferde okunup yazılacak blok boyutu
- count: kaç blok kopyalanacağı
- skip: kaynakta baştan kaç blok atlanacağı
- seek: hedefte baştan kaç blok atlanacağı
- conv: dönüşüm seçenekleri (noerror, sync, notrunc vb.)
- status: ilerleme çıktısı kontrolü (none, noxfer, progress)
Burada dikkat edilmesi gereken önemli bir nokta var: dd komutunda kaynak ve hedef yerlerini karıştırmak felakete yol açar. if ve of parametrelerini her seferinde iki kez kontrol etmeyi alışkanlık haline getirin.
Disk Görüntüsü Almak
En yaygın kullanım senaryosundan başlayalım. Bir diski ya da bölümü birebir görüntü olarak kaydetmek istiyorsunuz.
Tüm Diski Görüntü Olarak Alma
dd if=/dev/sda of=/mnt/backup/disk_yedek.img bs=4M status=progress
Bu komut /dev/sda diskini blok blok okuyarak disk_yedek.img dosyasına yazar. bs=4M parametresi 4 megabaylık bloklar halinde çalışacağını söyler. Varsayılan 512 bayt olan blok boyutunu artırmak işlemi önemli ölçüde hızlandırır.
status=progress parametresini eklemenizi şiddetle tavsiye ederim. Yoksa komut hiç ses çıkarmadan çalışır, tamamlanıp tamamlanmadığını bilemezsiniz. Özellikle büyük disklerle çalışırken bu sizi delirtir.
Belirli Bir Bölümü Görüntü Olarak Alma
Çoğu zaman tüm diski değil, sadece belirli bir bölümü yedeklemek istersiniz:
dd if=/dev/sda1 of=/mnt/backup/sistem_bolumu.img bs=4M conv=noerror,sync status=progress
conv=noerror,sync kombinasyonu özellikle önemli. noerror okuma hatası oluştuğunda durmamasını, sync ise hatalı blokları sıfırlarla doldurarak devam etmesini sağlar. Bozuk disklerle uğraşırken bu iki seçenek hayat kurtarır.
Görüntüyü Sıkıştırarak Alma
Ham dd görüntüleri çok yer kaplar. Gzip ile pipe ederek yerden tasarruf edebilirsiniz:
dd if=/dev/sda bs=4M status=progress | gzip -c > /mnt/backup/disk_yedek.img.gz
Bu noktada xargs‘a ihtiyacınız yok. dd çıktısını doğrudan gzip‘e pipe ediyorsunuz. Bant genişliğini ve disk alanını önemli ölçüde azaltır, ancak işlem süresi uzar.
Daha iyi sıkıştırma için pigz (paralel gzip) kullanabilirsiniz:
dd if=/dev/sda bs=4M status=progress | pigz -c > /mnt/backup/disk_yedek.img.gz
Klonlama İşlemleri
Klonlama, görüntü almadan farklıdır. Doğrudan bir diskten diğerine kopyalama yaparsınız, ara dosya oluşturmazsınız.
Diskten Diske Doğrudan Klonlama
dd if=/dev/sda of=/dev/sdb bs=4M conv=noerror,sync status=progress
Burada kritik bir uyarı: /dev/sdb tamamen silinecektir. Üzerindeki her şey gider. Bu komutu çalıştırmadan önce hedef diski iki kez kontrol edin.
Bunu gerçek bir senaryoyla açıklayayım. Bir müşterinin sunucusunda sistem diski arızalanmaya başlamıştı, S.M.A.R.T. verileri kötü sektörler olduğunu gösteriyordu. Disk henüz çalışıyordu ama ne kadar daha çalışır belirsizdi. Yeni bir disk takıp yukarıdaki komutla klonladım. Sistem bir sonraki gün hiç fark etmeden ayağa kalktı.
Uzak Sunucuya Klonlama
Ağ üzerinden klonlama için SSH ile pipe kullanabilirsiniz:
dd if=/dev/sda bs=4M status=progress | ssh kullanici@uzak_sunucu "dd of=/dev/sdb bs=4M"
Ya da tam tersine, uzak sunucudaki diski yerele çekebilirsiniz:
ssh kullanici@uzak_sunucu "dd if=/dev/sda bs=4M" | dd of=/dev/sdb bs=4M status=progress
Bu yöntem yavaş ağ bağlantılarında acı verebilir. Bant genişliği varsa sıkıştırma ekleyin:
dd if=/dev/sda bs=4M status=progress | gzip -c | ssh kullanici@uzak_sunucu "gunzip -c | dd of=/dev/sdb bs=4M"
Kurtarma Senaryoları
dd nin gerçek gücü kurtarma işlemlerinde ortaya çıkıyor. Özellikle bozuk disklerle uğraşırken başka araçların yetersiz kaldığı yerde dd devreye giriyor.
Bozuk Diskten Veri Kurtarma
Disk bozuksa ddrescue kullanmanızı öneririm ama elinizde sadece dd varsa şöyle yapabilirsiniz:
dd if=/dev/sda of=/mnt/kurtarma/bozuk_disk.img bs=512 conv=noerror,sync status=progress 2>> /var/log/dd_kurtarma.log
Blok boyutunu 512 bayta düşürüyoruz. Büyük blok boyutlarında tek bir hatalı sektör tüm bloğu sorunlu hale getirir. Küçük blokla daha fazla veri kurtarabilirsiniz.
Hataları log dosyasına yönlendirmek kurtarma sürecini takip etmenizi kolaylaştırır.
MBR Yedekleme ve Geri Yükleme
MBR (Master Boot Record) diskin ilk 512 baytında bulunur. Boot loader’ı ya da bölüm tablosunu korumak için MBR’yi yedeklemek iyi bir pratiktir:
dd if=/dev/sda of=/root/mbr_yedek.bin bs=512 count=1
count=1 ile sadece bir blok, yani 512 bayt okuyoruz. Bu MBR’nin tamamını içerir.
Geri yüklemek için:
dd if=/root/mbr_yedek.bin of=/dev/sda bs=512 count=1
Dikkat: Bu komut MBR’yi geri yükler ama bölüm tablosunu da etkiler. Sadece boot loader’ı geri yüklemek istiyorsanız ilk 446 baytı kopyalamanız gerekir:
dd if=/root/mbr_yedek.bin of=/dev/sda bs=446 count=1
GPT Bölüm Tablosu Yedekleme
Modern sistemlerde GPT kullanılıyor. GPT yedekleme biraz daha karmaşık çünkü GPT hem diskin başında hem sonunda kopya bulunduruyor:
dd if=/dev/sda of=/root/gpt_yedek.bin bs=512 count=34
GPT başlığı ilk 34 sektörü kaplar.
İleri Seviye Kullanım Senaryoları
Belirli Bir Ofsetten Veri Okuma
Diyelim ki bölüm tablosu bozuldu ama verilerin nerede olduğunu biliyorsunuz. skip ve seek parametreleriyle belirli ofsetlerden okuma yapabilirsiniz:
dd if=/dev/sda of=/mnt/kurtarma/veri.img bs=512 skip=2048 count=1048576
Bu komut 2048. sektörden başlayarak 1048576 sektör okur. fdisk -l çıktısından ya da parted ile bölüm başlangıç değerlerini öğrenebilirsiniz.
Sıfırlama ve Güvenli Silme
Disk güvenli silme işlemleri için dd oldukça kullanışlıdır:
dd if=/dev/zero of=/dev/sdb bs=4M status=progress
/dev/zero sürekli sıfır bayt üretir. Bu komut tüm diski sıfırlar. Hassas verileri imha etmeden önce bu işlemi birkaç kez tekrarlamak isterseniz:
for i in 1 2 3; do
echo "Gecis $i basliyor..."
dd if=/dev/urandom of=/dev/sdb bs=4M status=progress
done
dd if=/dev/zero of=/dev/sdb bs=4M status=progress
İlk üç geçişte rastgele veri, son geçişte sıfır yazıyoruz. DoD standartlarına yakın bir silme işlemi için bu yeterlidir.
Görüntüden Geri Yükleme
Aldığınız görüntüyü geri yüklemek de aynı derecede önemli. Sıkıştırılmamış görüntüden:
dd if=/mnt/backup/disk_yedek.img of=/dev/sda bs=4M status=progress
Sıkıştırılmış görüntüden:
gunzip -c /mnt/backup/disk_yedek.img.gz | dd of=/dev/sda bs=4M status=progress
Performans Optimizasyonu
dd nin hızını artırmak için birkaç şeyi optimize edebilirsiniz.
Blok boyutu seçimi: bs=4M çoğu senaryo için iyi bir başlangıç noktasıdır. Bazı durumlarda bs=64M hatta bs=128M daha iyi sonuç verebilir. Kendi disk sisteminizde test etmeniz gerekir.
iflag ve oflag parametreleri:
- iflag=direct: Okurken önbelleği atla, doğrudan diskten oku
- oflag=direct: Yazarken önbelleği atla, doğrudan diske yaz
- oflag=dsync: Her blok yazıldıktan sonra senkronize et
dd if=/dev/sda of=/mnt/backup/disk.img bs=4M iflag=direct oflag=direct status=progress
Bu özellikle büyük disklerle çalışırken sistem önbelleğini tükenmeden korumanıza yardımcı olur.
Çalışan dd işlemini izleme: Eski sistemlerde status=progress yoktu. O durumlarda SIGUSR1 sinyaliyle ilerlemeyi öğrenebilirsiniz:
kill -USR1 $(pgrep dd)
Ya da watch ile periyodik olarak:
watch -n 5 'kill -USR1 $(pgrep dd)'
Sık Karşılaşılan Hatalar ve Çözümleri
Deneyimli sysadmin’lerin bile zaman zaman tökezlediği birkaç nokta var.
“No space left on device” hatası: Görüntü almak istediğiniz yerde yeterli alan yok. Boyutu önceden hesaplayın:
blockdev --getsize64 /dev/sda
Bu komut diski bayt cinsinden boyutunu verir.
İşlemin ortasında kesilme: Güç kesintisi ya da ağ sorunu olursa kaldığı yerden devam edemezsiniz. ddrescue bu konuda daha avantajlıdır. Ama dd ile çalışıyorsanız, skip ve seek parametrelerini kullanarak yaklaşık bir noktadan devam etmeyi deneyebilirsiniz.
Hedef disk kaynaktan küçük: Eğer kaynak disk hedeften büyükse klonlama başarısız olur ya da eksik kalır. Kaynak ile hedef boyutlarını mutlaka karşılaştırın. Hedef büyükse sorun yok, fazla alan kullanılmaz. Küçükse count parametresiyle sadece kullanılan kısımı kopyalamayı düşünün.
Bölüm boyutlarını güncelleme: Klonlama sonrası daha büyük bir diske geçtiyseniz bölümler eski boyutlarda kalır. gparted ya da parted ile bölümleri genişletin, ardından resize2fs (ext4 için) ile dosya sistemini büyütün.
Gerçek Dünya: Üretim Ortamında Dikkat Edilmesi Gerekenler
Üretim sistemlerinde dd kullanırken bazı pratik kurallar geliştirdim:
Çalışan bir sistemi kopyalarken tutarsız görüntü alabilirsiniz. İdeal olan sistemi kapatmak ya da bölümü unmount etmektir. Mümkün değilse en azından uygulamaları durdurmuş olun. LVM kullanıyorsanız snapshot alıp oradan kopyalamak çok daha güvenlidir:
lvcreate -L10G -s -n snapshot_yedek /dev/vg0/lv_sistem
dd if=/dev/vg0/snapshot_yedek of=/mnt/backup/sistem.img bs=4M status=progress
lvremove -f /dev/vg0/snapshot_yedek
Ayrıca aldığınız görüntünün bütünlüğünü kontrol etmeyi alışkanlık haline getirin:
md5sum /mnt/backup/disk_yedek.img > /mnt/backup/disk_yedek.img.md5
Geri yükleme sonrasında da kontrol edin:
md5sum -c /mnt/backup/disk_yedek.img.md5
Kritik sistemlerde görüntüyü aldıktan sonra test ortamında geri yükleyip boot edebildiğinizi doğrulayın. Yedek aldım ama hiç test etmedim demek, yedek almadım demekle eşdeğerdir.
Sonuç
dd komutunun gücü tam da sadeliğinden geliyor. xargs gibi ek araçlara ihtiyaç duymadan, doğrudan pipe zincirleri ve yerleşik parametreler aracılığıyla disk yönetiminin neredeyse her senaryosunu karşılıyor. Disk görüntüsü alma, klonlama, MBR yedekleme, bozuk diskten veri kurtarma ve güvenli silme gibi kritik işlemleri tek bir araçla yapabiliyorsunuz.
Ancak gücün sorumluluğu beraberinde getirdiğini unutmayın. dd‘yi “disk destroyer” olarak ananlar boşuna dememişler. if ve of parametrelerini her seferinde dikkatlice kontrol edin, kritik işlemler öncesinde hedef sürücüyü lsblk ya da fdisk -l ile doğrulayın, üretim sistemlerinde mutlaka önce test ortamında pratik yapın.
Disk yönetimi hem teknik hem de sorumlu bir alan. Doğru kullanıldığında dd, aracı kutunuzun en değerli elemanlarından biri haline gelir.
