Linux’ta Milyonlarca Dosyayı Daha Hızlı Kopyalamanın Yöntemleri

Linux sistemlerde dosya kopyalama denildiğinde çoğu kullanıcının aklına ilk olarak cp komutu gelir. Basit, hızlı öğrenilir ve neredeyse tüm Linux dağıtımlarında varsayılan olarak bulunur. Bir yapılandırma dosyasını farklı bir dizine almak, birkaç görseli taşımak ya da küçük boyutlu belgeleri yedeklemek için cp çoğu zaman yeterlidir.

Ancak iş büyüdüğünde tablo değişir.

Gigabaytlarca veri taşımanız gerektiğinde, uzak bir sunucuya büyük yedek dosyaları aktardığınızda ya da yüz binlerce küçük dosyadan oluşan bir dizini başka bir diske kopyalamaya çalıştığınızda cp komutunun sınırları çok net şekilde ortaya çıkar. Çünkü cp size aktarımın ne kadar sürdüğünü, hangi hızda ilerlediğini, işlemin nerede takıldığını veya kesinti yaşanırsa kaldığı yerden devam edip edemeyeceğini söylemez.

Bu nedenle Linux’ta büyük veri taşıma, yedekleme ve sunucular arası dosya senkronizasyonu için daha güçlü araçlar kullanmak gerekir. rsync, pv, dd, parallel ve checksum kontrolleri bu noktada sistem yöneticilerinin hayatını ciddi anlamda kolaylaştırır.

cp Komutu Neden Büyük Kopyalama İşleri İçin Yetersiz Kalır?

cp, Linux dünyasının en temel komutlarından biridir. POSIX standardı içinde yer aldığı için hemen her sistemde bulunur ve temel dosya kopyalama işlemleri için oldukça kullanışlıdır. Fakat bu komutun amacı karmaşık veri transferlerini yönetmek değil, basit şekilde dosya kopyalamaktır.

Örneğin aşağıdaki gibi bir komutla bir dizini başka bir yere kopyalayabilirsiniz:

cp -r /kaynak/dizin /hedef/dizin

Bu komut küçük işler için yeterlidir. Ancak büyük boyutlu verilerde bazı önemli eksiklikler ortaya çıkar.

Öncelikle cp varsayılan olarak ilerleme durumu göstermez. Yani 50 GB’lık bir dosya kopyalıyorsanız terminalde sessiz bir bekleyiş başlar. İşlem devam ediyor mu, takıldı mı, ne kadar kaldı, aktarım hızı nedir gibi soruların cevabını göremezsiniz.

İkinci büyük sorun ise devam etme desteğinin olmamasıdır. Kopyalama sırasında SSH bağlantınız koparsa, elektrik kesilirse, yanlışlıkla işlemi durdurursanız veya sistem yeniden başlarsa işlem baştan başlamak zorunda kalır. Bu durum özellikle büyük yedek dosyaları, veritabanı dump’ları veya çok sayıda küçük dosya ile çalışırken ciddi zaman kaybına yol açar.

Ayrıca cp tek başına uzak sunucularla çalışmaz. Uzak sisteme dosya göndermek için genellikle scp gibi farklı araçlara ihtiyaç duyulur. scp kullanışlı olsa da o da çoğu senaryoda kaldığı yerden devam etme, delta aktarımı ve ayrıntılı kontrol gibi konularda sınırlıdır.

Bu nedenle üretim ortamlarında, yedekleme süreçlerinde ve büyük veri taşıma operasyonlarında cp yerine daha gelişmiş araçlar tercih edilmelidir.

rsync: Büyük Dosya Transferlerinde En Güvenilir Araçlardan Biri

Linux’ta büyük dosya kopyalama ve senkronizasyon denildiğinde ilk akla gelen araçlardan biri rsynctir. rsync, yalnızca dosya kopyalamakla kalmaz; kaynak ve hedef arasındaki farkları analiz ederek sadece değişen verileri aktarabilir. Bu özellik onu klasik kopyalama araçlarından çok daha verimli hale getirir.

rsync hem yerel dizinler arasında hem de uzak sunuculara SSH üzerinden dosya aktarımında kullanılabilir.

Debian, Ubuntu veya Linux Mint üzerinde kurmak için:

sudo apt install rsync

RHEL, CentOS, Fedora, Rocky Linux veya AlmaLinux üzerinde:

sudo dnf install rsync

Arch Linux üzerinde:

sudo pacman -S rsync

Yerel bir dizini başka bir dizine kopyalamak için şu komut kullanılabilir:

rsync -av --progress /kaynak/dizin/ /hedef/dizin/

Buradaki parametreler oldukça önemlidir.

-a parametresi arşiv modunu etkinleştirir. Bu mod sayesinde dosya izinleri, zaman damgaları, sembolik bağlantılar ve dizin yapısı korunur. Yani sadece dosyanın içeriği değil, dosyanın Linux sistemindeki özellikleri de taşınmış olur.

-v parametresi ayrıntılı çıktı verir. Böylece hangi dosyaların aktarıldığını terminal üzerinden görebilirsiniz.

--progress ise aktarım sırasında ilerleme bilgisini gösterir. Dosyanın yüzde kaçının kopyalandığını, aktarım hızını ve kalan süreyi görmenizi sağlar.

Burada dikkat edilmesi gereken önemli bir detay vardır: kaynak dizinin sonundaki / işareti.

rsync -av /kaynak/dizin/ /hedef/dizin/

Bu kullanımda kaynak dizinin içeriği hedef dizine kopyalanır.

Ancak şöyle yazarsanız:

rsync -av /kaynak/dizin /hedef/dizin/

Bu kez dizin klasörünün kendisi hedefin içine alt klasör olarak kopyalanır. Bu küçük fark, özellikle otomasyon script’lerinde beklenmeyen dizin yapılarının oluşmasına neden olabilir.

Uzak Sunucuya rsync ile Dosya Aktarma

rsyncin en güçlü taraflarından biri SSH üzerinden güvenli şekilde uzak sunuculara veri aktarabilmesidir. Örneğin yerel bir dizini uzak sunucuya göndermek için şu komut kullanılabilir:

rsync -av --progress /yerel/dizin/ kullanici@sunucu-ip:/uzak/dizin/

Bu komut, belirtilen yerel dizindeki dosyaları uzak sunucudaki hedef dizine aktarır. Eğer bağlantı aktarım sırasında koparsa aynı komutu tekrar çalıştırmanız yeterlidir. rsync, daha önce başarıyla aktarılmış dosyaları kontrol eder ve yalnızca eksik ya da değişmiş verileri gönderir.

Bu özellik, büyük yedeklerin gece saatlerinde taşındığı ya da kararsız ağ bağlantılarının olduğu ortamlarda büyük avantaj sağlar. Çünkü aktarım yarıda kaldığında her şeyi baştan başlatmak zorunda kalmazsınız.

pv: Kopyalama İşlemlerine Görünürlük Kazandırmak

Bazı durumlarda dosya kopyalama işleminin kendisini değiştirmek istemezsiniz; yalnızca ne kadar ilerlediğini görmek istersiniz. İşte bu noktada pv, yani Pipe Viewer devreye girer.

pv, Unix pipe yapısı içinde çalışan ve veri akışını izlemeye yarayan küçük ama oldukça faydalı bir araçtır. Size aktarım hızını, geçen süreyi, toplam aktarılan veri miktarını ve tahmini kalan süreyi gösterebilir.

Ubuntu veya Debian tabanlı sistemlerde kurulum için:

sudo apt install pv

Tek bir büyük dosyayı ilerleme çubuğu ile kopyalamak için:

pv /kaynak/buyuk-dosya.iso > /hedef/buyuk-dosya.iso

Bu komut, klasik cp komutuna göre çok daha görünür bir deneyim sunar. Büyük ISO dosyaları, yedek arşivleri veya veritabanı dump dosyaları ile çalışırken işlemin hangi hızda ilerlediğini anlık olarak görebilirsiniz.

pv aynı zamanda sıkıştırma işlemleriyle birlikte de kullanılabilir:

pv /kaynak/dosya.tar | gzip > /hedef/dosya.tar.gz

Bu örnekte dosya okunur, aktarım hızı görüntülenir, ardından veri gzip ile sıkıştırılarak hedefe yazılır. Böylece hem kopyalama hem de sıkıştırma işlemini tek bir akışta gerçekleştirebilirsiniz.

dd: Disk Klonlama ve Düşük Seviyeli Kopyalama İşleri

dd, Linux dünyasında son derece güçlü ama dikkatli kullanılması gereken bir araçtır. Dosya seviyesinde değil, blok seviyesinde çalışır. Bu nedenle disk klonlama, partition yedekleme, imaj oluşturma ve ham disk aktarımı gibi işlemler için tercih edilir.

Örneğin bir diski başka bir diske klonlamak için:

sudo dd if=/dev/sda of=/dev/sdb bs=64K conv=noerror,sync status=progress

Bu komut oldukça güçlüdür, fakat aynı zamanda risklidir.

if=/dev/sda kaynak diski belirtir.

of=/dev/sdb hedef diski belirtir.

bs=64K blok boyutunu 64 KB olarak ayarlar. Varsayılan küçük blok boyutlarına göre büyük veri aktarımlarında daha iyi performans sağlayabilir.

conv=noerror,sync okuma hatalarında işlemin tamamen durmasını engeller ve sorunlu blokları uygun şekilde doldurarak işlemin devam etmesini sağlar.

status=progress ise aktarım sırasında ilerleme bilgisini gösterir.

Burada en kritik nokta şudur: dd hata affetmez. Kaynak ve hedef diskleri karıştırırsanız, yanlış diskin üzerine veri yazabilir ve geri dönüşü zor bir veri kaybı yaşayabilirsiniz.

Bu nedenle dd kullanmadan önce mutlaka diskleri kontrol etmek gerekir:

lsblk

Bu komut sistemdeki diskleri, partition’ları ve bağlantı noktalarını listeler. dd çalıştırmadan önce kaynak ve hedef disklerin doğru olduğundan emin olunmalıdır.

Milyonlarca Küçük Dosyada Sorun: Tek İş Parçacıklı Aktarım

Büyük bir dosyayı kopyalamak çoğu zaman kolaydır. Disk ve ağ hızı iyiyse işlem makul sürede tamamlanır. Ancak yüz binlerce veya milyonlarca küçük dosyadan oluşan dizinlerde durum farklıdır.

Örneğin:

  • node_modules dizinleri,
  • mail spool klasörleri,
  • küçük görsellerden oluşan arşivler,
  • log dizinleri,
  • web uygulaması cache klasörleri,
  • kullanıcı profil yedekleri,

çok sayıda küçük dosya içerdiği için klasik kopyalama yöntemleriyle oldukça yavaş aktarılabilir.

Bunun sebebi, her dosya için ayrı metadata işlemi yapılmasıdır. Dosya açılır, okunur, hedefte oluşturulur, izinleri yazılır, zaman bilgisi ayarlanır ve kapatılır. Bu işlem büyük dosyalarda çok az hissedilirken, küçük dosya sayısı yüz binlere ulaştığında toplam süreyi ciddi şekilde artırır.

parallel ve rsync ile Daha Hızlı Kopyalama

GNU Parallel, birden fazla işi aynı anda çalıştırmak için kullanılan güçlü bir araçtır. rsync ile birlikte kullanıldığında, çok sayıda küçük dosyanın bulunduğu dizinlerde kopyalama süresini ciddi oranda azaltabilir.

Kurulum için:

sudo apt install parallel

Örnek kullanım:

find /kaynak/dizin -mindepth 1 -maxdepth 1 -type d | \
parallel -j 4 rsync -a {} /hedef/dizin/

Bu komutun çalışma mantığı şöyledir:

find /kaynak/dizin -mindepth 1 -maxdepth 1 -type d komutu, kaynak dizinin altındaki birinci seviye klasörleri listeler.

parallel -j 4 aynı anda 4 işlem çalıştırır.

rsync -a {} ise bulunan her dizini hedefe ayrı bir rsync işlemiyle aktarır.

Buradaki -j 4 değeri sistem kaynaklarına göre ayarlanmalıdır. Daha hızlı diskler, SSD yapıları veya güçlü sunucularda bu sayı artırılabilir. Ancak çok yüksek değerler her zaman daha iyi performans anlamına gelmez. Disk I/O kapasitesi, CPU gücü ve ağ bant genişliği dikkate alınmalıdır.

Özellikle milyonlarca küçük dosya içeren yapılarda paralel aktarım, tek bir rsync işlemine göre çok daha hızlı sonuç verebilir.

Kopyalama Sonrası Dosya Bütünlüğü Nasıl Kontrol Edilir?

Dosyayı hızlı kopyalamak tek başına yeterli değildir. Özellikle yedekleme, sistem taşıma veya kritik veri aktarımı yapılıyorsa kopyalanan dosyanın gerçekten sağlıklı olduğundan emin olmak gerekir.

Bunun için checksum kontrolü yapılabilir. En yaygın yöntemlerden biri sha256sum kullanmaktır.

Örneğin:

sha256sum /kaynak/buyuk-dosya.iso /hedef/buyuk-dosya.iso

Bu komut hem kaynak hem de hedef dosya için SHA256 hash değeri üretir. İki değer aynıysa dosyalar birebir aynıdır. Eğer hash değerleri farklıysa aktarım sırasında hata oluşmuş olabilir.

Bu hata şu nedenlerden kaynaklanabilir:

  • disk okuma/yazma problemi,
  • ağ aktarım hatası,
  • dosya kopyalanırken kaynak dosyanın değişmesi,
  • eksik veya yarıda kalmış aktarım,
  • hatalı depolama birimi.

Kritik verilerde checksum kontrolü ihmal edilmemelidir. Çünkü bir dosyanın hedef dizinde görünmesi, onun eksiksiz ve sağlıklı şekilde aktarıldığı anlamına gelmez.

Hangi Senaryoda Hangi Araç Kullanılmalı?

Günlük küçük dosya işlemleri için cp hâlâ kullanılabilir. Bir yapılandırma dosyasını almak, birkaç belgeyi taşımak veya basit dizin kopyalamaları yapmak için yeterlidir.

Büyük dosya ve dizin aktarımlarında ise rsync daha doğru tercihtir. Hem ilerleme bilgisi verir hem de yarıda kalan işlemleri tekrar başlatmadan sürdürebilir.

Tek bir büyük dosyanın aktarım hızını görmek istiyorsanız pv oldukça pratik bir çözümdür. Özellikle komut satırında sessiz şekilde beklemek istemeyen kullanıcılar için faydalıdır.

Disk klonlama, partition yedekleme veya ham veri aktarımı gerekiyorsa dd kullanılabilir. Ancak bu araç mutlaka dikkatli kullanılmalı ve kaynak-hedef diskler birkaç kez kontrol edilmelidir.

Çok sayıda küçük dosyadan oluşan büyük dizinlerde ise parallel ile birden fazla rsync işlemi çalıştırmak ciddi performans kazancı sağlayabilir.

Linux’ta dosya kopyalama basit gibi görünse de veri miktarı büyüdükçe doğru aracı seçmek büyük önem kazanır. cp, küçük ve günlük işler için yeterlidir; fakat büyük yedekler, uzak sunucu senkronizasyonları, disk klonlama işlemleri ve milyonlarca küçük dosyadan oluşan dizinler için daha gelişmiş araçlara ihtiyaç vardır.

rsync, kaldığı yerden devam edebilmesi ve sadece değişen verileri aktarmasıyla sistem yöneticilerinin en önemli yardımcılarından biridir. pv, veri aktarımına görünürlük kazandırır. dd, düşük seviyeli disk işlemlerinde güçlü bir seçenek sunar. parallel ise özellikle küçük dosya yoğunluklu yapılarda aktarım süresini ciddi şekilde azaltabilir.

En doğru yaklaşım, her işi tek bir komutla çözmeye çalışmak yerine senaryoya uygun aracı seçmektir. Küçük dosyalarda cp, büyük ve tekrar edebilir aktarımlarda rsync, ham disk işlemlerinde dd, görünürlük ihtiyacında pv, yüksek dosya sayısında ise parallel çok daha verimli sonuç verir.

Kısacası, Linux’ta hızlı dosya kopyalamanın sırrı sadece güçlü donanımda değil; doğru komutu, doğru parametrelerle ve doğru senaryoda kullanabilmektedir.

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *