Neden cp --reflink=auto
varsayı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?
Neden cp --reflink=auto
varsayı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?
Yanıtlar:
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.
Belki bu yüzden başka çoğaltma araçları (aynı şekilde davrandığını, varsayılan değil neden bilmiyorum rsync
, cpio
, pax
, tar
hiç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;
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.
alias cp='cp --reflink=auto --sparse=always'
kodu yamalamaktan daha mantıklı
/bin/cp
değiştirip benzer bir kabuk betiği ile değiştirebilir
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.
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ış.