Neden cp --reflink = auto varsayılan davranış değil?


31

Neden cp --reflink=autovarsayılan davranış değil? Etkinleştirmek için herhangi bir zarar verebilir mi?

Derleme zamanında etkinleştirmek mümkün mü, bu nedenle sadece etkileşimli mermilerde değil, tüm sistemde mi kullanılıyor?


4
Evet, güzel soru. IMHO olacaktır, çünkü sadece BTRFS varsayılan bir Linux dosya sistemi olmaya başlar.
Adam Ryczkowski

Yanıtlar:


38

Sağlamlık nedeniyle, verilerin bozulmasına karşı korunmak için bir kopyanın alınmasını isteyebileceği varsayılan değildir. Ayrıca performans nedenleriyle, yazma işleminin bir CoW dosyası üzerinde çalışan ve muhtemelen bir mekanik diskin farklı bir bölümüne yazılan gecikmelerden dolayı gecikme sürecine girmesinden ziyade yazma işleminin kopyalama zamanında gerçekleşmesini isteyebilirsiniz. Coreutils v8.24 mv'nin yukarıdaki kısıtlamalara sahip olmadığından varsayılan olarak yansıtacağını unutmayın.


8
(Pádraig, GNU coreutils'in bir koruyucusu olduğu için bu yetkili bir cevap olarak kabul edilebilir).
Stéphane Chazelas

8
Bu cevabın doğru olduğuna şüpheliyim, en azından btrfs'de. Dosya daha sonra yazılırsa, btrfs CoW nedeniyle yeni veriler yine de farklı bir disk sektörüne yazılır, bu nedenle, geri dönüş yapmamanın gecikme avantajı yoktur. NoDataCoW ayarlanmış olan dosyalar yine de yansıtılamaz. Ve veri bozulmalarına karşı korumak istiyorsanız, farklı bir bölüme kopyalamanız gerekir ve aynı zamanda bazı hatalar da işe yaramaz.
JanKanis

3
BTRFS'nin yazma zamanında yer bulması ve tahsis etmesi gerektiği için gecikme sorunları var. Bu bile mevcut olmayabilir ve bu nedenle ENOSPC hatalarını yazma zamanında atıyor
Pádraig Brady

1
Mv'nin yansıması için ne yararı var?
Macil

1
btrfs üzerinde çapraz alt ses isimleri
Pádraig Brady

17

Belki bu yüzden başka çoğaltma araçları (aynı şekilde davrandığını, varsayılan değil neden bilmiyorum rsync, cpio, pax, tarhiçbir desteğe sahip ...) için (veya dosyaları bir arayüz üzerinden kopyalandığında buna izin vermez (NFS, samba, sigorta dosya sistemleri katmanları gibi ...).

Birkaç yıl önce aynı durumdaydım ve GNU cp koduna hızlıca baktım, yine aynı, farklı bir varsayılan davranış elde etmek için kodu yamalamalısınız:

--- coreutils-8.21/src/cp.c~    2013-06-22 21:50:26.265639114 +0100
+++ coreutils-8.21/src/cp.c     2013-06-22 21:51:06.880513924 +0100
@@ -775,7 +775,7 @@ cp_option_init (struct cp_options *x)
   x->interactive = I_UNSPECIFIED;
   x->move_mode = false;
   x->one_file_system = false;
-  x->reflink_mode = REFLINK_NEVER;
+  x->reflink_mode = REFLINK_AUTO;

   x->preserve_ownership = false;
   x->preserve_links = false;

4

En büyük sorunlardan biri, yazarken kopya yapmak için boş alan kalmamasıdır.

Normal bir kopya ile, o zaman kopya tamamlanır tamamlanmaz, dosyanın başarısız olan kısımlarına yazma konusunda endişelenmenize gerek kalmaz: alan tamamen tahsis edilir ve dosyayı silene kadar kaybolmaz. Ancak, yansımalı bir kopyayla, yoldan birkaç hafta veya ay sonra, dosyanın varolan bir bölümüne yazmanın başarısız olması riski vardır, çünkü kopyalamak için yeterli alan bulunmaz.

Böyle bir işlem başarısız olduğunda, sisteminizin arkanızdaki kopyalara yansımış olduğunu keşfetmek, çok kötü bir sürpriz olurdu.


Btrfs üzerinde En azından hatta ... ENOSPC ile başarısız olabilir dosyanın zaten tahsis kısmına yazma
graywolf

2
alias cp='cp --reflink=auto --sparse=always'

kodu yamalamaktan daha mantıklı


6
Derleme zamanında etkinleştirmek mümkün mü diye gözardı ettiniz , bu yüzden sadece OP'nin sorusu üzerine etkileşimli mermilerde değil tüm sistemde kullanılır .
Stéphane Chazelas 26:13

5
@StephaneChazelas Biri her zaman adını /bin/cpdeğiştirip benzer bir kabuk betiği ile değiştirebilir
goncalopp

0
  1. Sağlamlık nedenleri, bir verinin "kaybolmasına" karşı korumak için bir kopyanın gerçekleşmesini isteyebilir.

    Sebep olduğunu bilmiyoruz, ancak olabilecek kötü şeyler medyayı imha etmekle sınırlı. Tüm blok cihazlarının çoğu, hata düzeltmeyi (parite) yapmazsa, bir tür yolsuzluk tanıma (crc) özelliğine sahip olacaktır.

  2. Performans nedeniyle değil.

    CoW? Silme işleminin yalnızca bir kısmı gerçekleştiğinde olur. blok yazılmıştır. Modern! donanım bloğu boyutu 4k katıdır. 4k'nin bir kısmının değiştirilmesi sürücünün 4k'nin tamamını okumasına ve tekrar yazmasına neden olur, ancak bunun üzerine çekirdeğin aynı şeyi yapması gerekir, böylece blok cihaza, SSD'ye veya diğerlerine ulaşan herhangi bir kısmi yazma olmaz . Çekirdeğin aynı nedenlerle CoW gerçekleştirmesi gerekir, önbelleğe alınmış bir kopya olmadıkça, cihazın diğer bölümlerinde bulunan verileri oluşturamayız, bir dosyanın masal sonuna kadar saklarız fakat sonra tartışma. Ancak bir dosyanın bir kopyasını önbelleğe almak ve bir dosyayı kopyalamak farklı işlemlere tabidir, birincisi daha ucuzdur.

    Yazının adresi önemsizdir, ancak “aygıtın kullanılmayan bir kısmının” keşfedilmesinin “dosyanın bloklarının bulunduğu yerde” bulunmasından daha ucuz olduğunu bilmesini sağlayın.

Gerçek şu ki, herhangi bir CoW metodu, bir blok cihazının güncellenmesi için daha ucuz veya eşittir. Şimdi blok cihazlarından bahsetmeseydik, o zaman başka bir hikaye olurdu ... Kasette bir yere yazılmış.

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.