Büyük bir dizin ağacının yerel olarak kopyalanması? cp veya rsync?


230

Yaklaşık 1.8 TB büyük bir dizin ağacı kopyalamam gerekiyor. Hepsi yerel. Alışkanlık dışında kullanırdım rsync, ancak çok fazla nokta olup olmadığını merak ediyorum ve kullanmayı tercih etmeli miyim cp.

İzinlerde ve uid / gid'de endişeliyim, çünkü kopyada saklanmaları gerekiyor (rsync'in bunu yaptığını biliyorum). Symlinks gibi şeyler gibi.

Hedef boş, bu yüzden bazı dosyaları koşullu olarak güncelleme konusunda endişelenmeme gerek yok. Hepsi yerel disk, bu yüzden ssh veya ağ hakkında endişelenmeme gerek yok.

Rsync’den uzak durmamın sebebi, rsync’in ihtiyacımdan daha fazlasını yapması olabilir. rsync sağlama toplamı dosyaları. Buna ihtiyacım yok ve cp'den daha uzun sürebileceğinden endişe ediyorum.

Peki rsyncya sen ne düşünüyorsun cp?


2
Eğer rsync tam olarak ne yapmak istiyorsa onu yaparsa, bu özel uygulama için kullanımına zaten aşina iseniz ve zevkinize uyacak kadar hızlı bir şekilde çalışıyorsa, neden dünyaya geçmek istersiniz?
eleven81

2
Çünkü rsync'in cp'den daha uzun süreceği konusunda endişeliyim, çünkü rsync, cp'nin yapamayacağı kadar çok denetleme yapıyor
Rory,

1
Sağlama toplamı cpu yükü disk / ağ g / Ç ile karşılaştırıldığında küçük. Disk aynı sistemde değilse ve işletim sistemi veri yolu denetleyicisinde bazı akıllı sürücü-sürücü kopyalarını yapabilir.
Martin Beckett

3
Büyüklük ve zaman damgası kontrolünden farklı olan dosyalarda sağlama toplamı yapılır. Paranoyaksanız (kopya sırasında elektrik kesintisinden sonra olduğu gibi), tüm dosyalar üzerinde kontrol toplamayı zorlayabilirsiniz, ancak yerel bir aktarımda, bu genellikle sıfırdan başlamaktan daha yavaştır.
korkman

3
Belki iş akışını iyileştirmeyi merak ediyor ve her şeyi bildiğini düşünerek kafasını kuma gömmüyor. Bu yorum beni gerçekten sinir ediyor.
Martin Konecny

Yanıtlar:


204

Herhangi bir nedenden dolayı kesilirse, çok az bir maliyetle kolayca yeniden başlatabileceğiniz anlamına gelir, çünkü rsync kullanırdım. Ve rsync olduğu için, büyük bir dosya üzerinden kısmi şekilde yeniden başlayabilir. Diğerlerinin de belirttiği gibi, dosyaları kolayca dışlayabilir. Çoğu şeyi korumanın en basit yolu -abayrağı kullanmaktır - 'arşiv'. Yani:

rsync -a source dest

UID / GID ve sembolik bağlantılar her ne kadar korunmuş olsa da -a(bkz. -lpgo), Sorunuz dosya sistemi bilgilerinin tam bir kopyasını isteyebileceğinizi ; ve -asabit bağlantılar, genişletilmiş öznitelikler veya ACL'ler (Linux'ta) veya üstü veya kaynak çatallar (OS X'te) içermez. Bu nedenle, bir dosya sisteminin sağlam bir kopyası için, bu bayrakları eklemeniz gerekir:

rsync -aHAX source dest # Linux
rsync -aHE source dest  # OS X

Varsayılan cp yeniden başlayacaktır, ancak -ubayrak "yalnızca SOURCE dosyası hedef dosyadan daha yeni olduğunda veya hedef dosya eksik olduğunda kopyalayacaktır" . Ve -a(arşiv) bayrağı özyinelemelidir, izinleri yeniden başlatmanız ve korumanız gerekirse dosyaları yeniden kopyalamaz. Yani:

cp -au source dest

5
Cp'nin -u bayrağı, kısmen kopyalanmış / bozulmuş bir dosyayı algılayamayacağından muhtemelen en iyi çözüm değildir. Rsync ile ilgili güzel olan şey, farklılıkları tespit etmek için dosyaları toplamına md5 ekleyebilmesidir.
Chad Huneycutt

3
-W (--whole-file) seçeneğinin eklenmesi, kesilmiş bir rsync'i hızlandıracaktır, çünkü sadece checksumming yerine dosyayı kopyalayacak.
hayalci

13
Aslında, rsync yerel aktarımları algılar ve otomatik olarak sağlama toplamı olmadan tam dosya kopyalamayı sağlar.
korkman

22
ve - gerçekten kullanışlı olan ilerleme!
Matt

12
-P veya - progress, her bir dosya için ayrı ayrı ilerleme gösterir. Çok fazla (binlerce) küçük dosya için değil, okuyamayacağınız daha fazla çıktı anlamına geldiğinden büyük dosyaların kopyalanması için kullanışlıdır. Kombine tüm dosyaların genel ilerlemesini göstermiyor.
SPRBRN

106

Yerel dosya sistemine kopyalama yaparken daima aşağıdaki rsync seçeneklerini kullanıyorum:

# rsync -avhW --no-compress --progress /src/ /dst/

İşte benim akıl yürütmem:

-a is for archive, which preserves ownership, permissions etc.
-v is for verbose, so I can see what's happening (optional)
-h is for human-readable, so the transfer rate and file sizes are easier to read (optional)
-W is for copying whole files only, without delta-xfer algorithm which should reduce CPU load
--no-compress as there's no lack of bandwidth between local devices
--progress so I can see the progress of large files (optional)

Başka bir cevabın önerdiği şekilde aşağıdaki tar komutu üzerinden yukarıdaki rsync ayarlarını kullanarak% 17 daha hızlı transfer gördüm:

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

1
Aşağıdaki hatayı yaşıyorum: rsync: --no-compress: unknown option@Ellis Percival.
Alper

Bu hızlı bir şekilde hafifliyor. Bunu yapmaktan daha hızlı rm -rf /src/.
dgo

2
@Alper gibi --no-compress rsync versiyonum için bir seçenek değildi (CentOS 7'de); Bunun yerine --compress-level = 0 kullandım.
Paul,

79

Çok miktarda veri kopyalamak zorunda kaldığımda genellikle tar ve rsync kombinasyonunu kullanıyorum. İlk geçiş, bunun gibi bir şey yapmaktır:

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

Genellikle büyük miktarda dosya olduğunda, herhangi bir sebeple katranın kaldıramayacağı bazı şeyler olacaktır. Ya da belki süreç kesintiye uğrayabilir ya da bir dosya taşıma sistemi ise, ilk kopyayı fiili taşıma adımından önce yapmak isteyebilirsiniz. Her halükarda, ilk kopyadan sonra, hepsini senkronize etmek için bir rsync adımı yapıyorum:

# cd /dst; rsync -avPHSx --delete /src/ .

Sondaki eğik çizginin /src/önemli olduğunu unutmayın.


6
+1 Büyük kopyalarda genellikle rsync'ten daha hızlı olduğunu tar olarak buldum. Ben de son rsync ile bitirme fikrini seviyorum.
Geoff Fritz

2
dest dir boşsa tar iyi bir seçimdir. Benim yolum olsa da: cd $ DSTDIR; tar c -C $ SRCDIR. | tar
asdmin

19
Bu, bu yöntemin güzelliği. Boşluğa iki kat gerek yok çünkü hiçbir zaman bir ara tar dosyası oluşturmazsınız. Borunun önündeki katran, verileri paketler ve onu stdout'a akıtır, borunun ardından katran ise onu stdin'den alır ve ambalajından çıkarır.
Chad Huneycutt

4
12 gb aktarım için cp -a ve 42 gb aktarım için bu yöntem kullandım. Katran metodu yaklaşık 1/4 zaman aldı.
NGaida

3
Ayrıca pv, ilerlemeyi izleyebilmek için tüm verileri kullanarak tahmin edebilmek için de orta noktaya koydum df. Ayrıca --numeric-ownerkaynak disk başka bir sistemden targeldiği için sahiplerini karıştırmak istemedim ve sahiplerini karıştırmak istemedim :tar -C /old-path --numeric-owner -S -c . | pv -tpeba -s 100G | tar -C /new-path --numeric-owner -S -xp
Petr Pudlák

14

rsync

İşte kullandığım rsync, basit komutlar için cp'yi tercih ederim, bu değil.

$ rsync -ahSD --ignore-errors --force --delete --stats $SRC/ $DIR/

cpio

İşte daha güvenli bir yol, cpio. Katran kadar hızlı, belki biraz daha hızlı.

$ cd $SRC && find . -mount -depth -print0 2>/dev/null | cpio -0admp $DEST &>/dev/null

katran

Bu da iyidir ve okuma başarısızlıklarına devam eder.

$ tar --ignore-failed-read -C $SRC -cf - . | tar --ignore-failed-read -C $DEST -xf -

Bunların hepsinin sadece yerel kopyalar için olduğuna dikkat edin.


Neden -S ve -D bayraklarını rsync için kullanıyorsunuz?
miyalys

7

Sen neyi tercih edersen. Sadece -akullanmaya karar verirken anahtarı unutma cp.

Gerçekten bir cevaba ihtiyacınız olursa: rsync kullanırım çünkü çok daha esnektir. Kopyalama tamamlanmadan önce kapatmanız mı gerekiyor? Sadece ctrl-c ve arkanıza en kısa sürede devam edin. Bazı dosyaları dışlamanız mı gerekiyor? Sadece kullan --exclude-from. Mülkiyet veya izinleri değiştirmeniz mi gerekiyor? rsync bunu senin için yapacak.


-P bayrağı tekrar ne yapar?
Rory,

1
Preserver sahipliği, zaman damgaları ve izinleri koruyacaktır.
innaM

5
cp -a daha iyi olurdu.
David Pashley

Aslında. Cevap buna göre değişti.
innaM

7

rsyncKomut hep aktaran her bayt sağlama toplamlarını hesaplar.

Komut satırı seçeneği, --checksumyalnızca dosya aktarımlarının hangi dosyaların aktarılacağını belirlemek için kullanılıp kullanılmadığı ile ilgilidir, yani:

-c, --checksum "mod-time & size değil sağlama toplamına göre atla"

Manpage ayrıca şunu söylüyor:

Rsync'nin her zaman tüm dosya sağlama toplamını kontrol ederek alıcı tarafa doğru şekilde yeniden yapılandırıldığını doğruladığını, ancak otomatik aktarım sonrası doğrulamanın bu seçeneğin aktarımdan önce yapabileceği bir şey olmadığını unutmayın. Bu dosyanın ihtiyacı var mı? güncellenecek? " Kontrol.

Bu nedenle rsync, her zaman, -c/ --checksumseçenek "kapalı" olsa bile, alıcı tarafındaki tüm dosyanın sağlama toplamını hesaplar .


14
Gönderiniz burada bazı ilginç bilgiler eklerken, saldırganlar ve hakaretler gönderinizin değerini düşürür. Bu site yapıcı olmayan rantlar için bir forum değildir. Kaynağı değiştirebildiyseniz, değişikliklerinizi bir düzeltme eki olarak gönderdiniz mi? Sürümünüzü github ya da başka bir şey üzerine gönderdiniz mi? Bu konuda çok kuvvetli hissediyorsanız, gereksiz yere hakaret etmek yerine biraz daha yapıcı bir şeyler yapmaya çalışsanız daha iyi olabilir.
Zoredache

Evet, son paragraf gerçekten gerekli değildi.
Sherwin Flight

6

rsync -aPhW --protocol=28RSYNC ile bu büyük kopyaların hızlanmasına yardımcı olur. Ben her zaman rsync'e giderim çünkü 90GiB'de ortada olma düşüncesi ve kırılması beni CP'den korkutuyor


2
Bu komut dizesinde eski protokolü kullanmanın değeri nedir?
whwhite

1
Bir mac makinesinde, Rsync'in eski sürümü, 29 gibi bazı daha yeni rsync protokolü devirlerinde askıda kalıyor. Eski protokole geçmesini söylemek, tekrar tekrar kontrol etmemesini sağlıyor.
oneguynick

Sanırım bu 28 numara artık geçerli değil mi?
SPRBRN

5

rsync harika, ancak ağaçları büyük miktarda sakladığı için büyük dizin ağaçları ile ilgili sorunları var. Sadece bu konuyu bulduğumda bu sorunu çözüp çözmeyeceklerini görmek istiyordum.

Ben de buldum:

http://matthew.mceachen.us/geek/gigasync/

Ayrıca ağacı el ile ayırabilir ve birden çok rsyncs çalıştırabilirsiniz.


12
Eğer sürüm 3'ü kullanıyorsanız, eğer büyükse bütün ağacı bellekte tutmaz, artan bir özyineleme algoritması kullanır: samba.org/ftp/rsync/src/rsync-3.0.0-NEWS
Kyle Brandt

5

Bu iş parçacığı çok yararlı oldu ve sonucu elde etmek için çok fazla seçenek olduğu için, birkaç tanesini kıyaslamaya karar verdim. Sonuçlarımın başkalarına daha hızlı neyin işe yaradığını anlama konusunda yardımcı olabileceğine inanıyorum.

1.753.200 dosya arasında dağıtılan 532Gb veriyi taşımak için şu saatlerde:

  • rsync 232 dakika sürdü
  • tar 206 dakika sürdü
  • cpio 225 dakika sürdü
  • rsync + parallel 209 dakika sürdü

Benim durumumda kullanmayı tercih ettim rsync + parallel. Umarım bu bilgi daha fazla insanın bu alternatifler arasında karar vermesine yardımcı olur.

Komple kriter burada yayınlandı


404 sayfa bulunamadı
Amedee Van Gasse

1
Thanks @AmedeeVanGasse URL, bildirdikten sonra kısa bir süre önce düzeltildi :)
arjones

Neden kıyaslama yapmıyorsun cp? Sorunun adı bu!
calandoa

@calandoa Sanırım cpgüvensiz, yani: kırıldığında, baştan başlaman gerekecek, bu şekilde devam edebilecek seçenekleri tercih ediyorum, ergo rsyncbenim favorim :)
arjones

3

Yerel bir yerel dizin kopyası oluştururken, benim deneyimim "cp -van src dest" rsync'den% 20 daha hızlı olmasıdır. Yeniden başlatılabilirliğe gelince, "-n" nin yaptığı budur. Sadece kısmen kopyalanan dosyayı rm gerekir. Bir ISO veya başka bir şey olmadığı sürece acı verici değildir.


2

ARJ çok eski okul !! ARJ ve / veya rsync'in performans sağlayacağından şüpheliyim.

Kesinlikle her zaman yaptığım şey cpio kullanmak:

find . -print | cpio -pdm /target/folder

Bu neredeyse CP'den daha hızlı, kesinlikle katrandan daha hızlı ve hiçbir şey belirtmeden.


2
"Özgün cpio ve bulma programları AT & T'nin Unix Destek Grubu'nda çalışırken Dick Haight tarafından yazılmış. İlk kez 1977'de PWB / UNIX 1.0'da göründüler" - FreeBSD'nin cpioadam sayfası.
Chris S

3
cpioMaalesef dosyalar için 8GB üst sınır var.

" hiçbir şey borulamadan " [sic]. findKomutun dışında , belirttiğiniz gibi, içinde bir boru var:find . -print | cpio -pdm /target/folder
warren

1

Kesinlikle rclone'u denemek istiyorsun . Bu şey hızlı delilik:

sudo rclone sync /usr /home/fred/temp -P -L --transfers 64

Transferred:       17.929G / 17.929 GBytes, 100%, 165.692 MBytes/s, ETA 0s
Errors:                75 (retrying may help)
Checks:            691078 / 691078, 100%
Transferred:       345539 / 345539, 100%
Elapsed time:     1m50.8s

Bu, LITEONIT LCS-256 (256GB) SSD'den yerel bir kopyadır.

--ignore-checksumİlk çalıştırmayı daha da hızlı hale getirmek için ekleyebilirsiniz .



0

tar işi de yapardı, ama rsync'in yapacağı gibi yarıda kalmaya devam etmiyor.


Eski bir cevap, ancak TAR sıkıştırılmış dosya arşivleri oluşturmak için değil mi? Rsync veya cp gibi dosyaları aktarmak için nasıl kullanılabilir?
Sherwin Flight

@ SherwinFlight cd kaynağı; katranı cf -. | (cd dest; tar xf -)
pgs

0

Ya ARJ kullanıyorsanız?

arj a -jm -m1 -r -je filepack /source

-jm -m1sıkıştırma seviyeleri nerede ve -jeçalıştırılabilir hale getirir. Şimdi bir kapsüllenmiş dosya koduna sahipsiniz.

Sonra hedef haritaya çıkartma için

filepack -y  

kaynak haritanın yapılacağı yer (nerede -yher zaman kabul edilir, üzerine yaz, atla vb.)

Daha sonra dosya paketini hedef alana kopyalayabilir ve eğer mümkünse çalıştırabilir.


1
Arj? Bu 80'lerde ölmedi mi?
Michael Hampton

wikipedia inanıyorsanız belki 90'ların başında
Matt

0

Uygulanabilecek bazı hızlandırmalar var rsync:

Önlemek

  • -z/ --compress: sıkıştırma, CPU'yu yalnızca aktarım bir ağ üzerinden değil RAM üzerinden olduğundan yükler.
  • --append-verify: kesintiye uğramış bir aktarmaya devam et. Bu iyi bir fikir gibi görünüyor, ancak tehlikeli bir başarısızlık vakası var: Kaynakla aynı boyutta (veya daha büyük) herhangi bir hedef dosya IGNORED olacaktır. Ayrıca, sonunda tüm dosyayı kontrol eder, bu --no-whole-fileda tehlikeli bir arıza davası eklerken önemli bir hızlanma anlamına gelmez .

kullanım

  • -S/ --sparse: boş dizileri seyrek bloklara çevir
  • --partialveya -Phangisi --partial --progress: Gelecekte devam etmek için kısmen aktarılmış dosyaları kaydedin. Not: dosyaların geçici bir adı olmaz, bu nedenle tüm kopya tamamlanana kadar hedefi başka bir şey beklemeyin.
  • --no-whole-fileBöylece tekrar gönderilmesi gereken her şey delta transferini kullanır. Kısmen aktarılmış bir dosyanın yarısını okumak genellikle onu tekrar yazmaktan çok daha hızlıdır.
  • --inplace dosya kopyasından kaçınmak için (ancak yalnızca aktarım tamamlanıncaya kadar hedefi hiçbir şey okumuyorsa)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.