Herhangi bir dosya sistemi CP için Yazma Mekanizmasına Kopyalama uygular mı


16

Bir işlemi çatallarken işletim sisteminin Kopyala Yazma optimizasyonunu yaptığını gördük. Çoğu zaman çatalın exec tarafından yürütülmesi nedeni budur, bu nedenle sayfa ayırma maliyetine katlanmak ve verileri gereksiz yere arayan adres alanından kopyalamak istemiyoruz.

Bu, ext4 veya xfs (günlük kaydı) dosya sistemlerine sahip bir linux üzerinde CP yaparken de olur. Eğer olmazsa, neden olmasın?


Birisi bu ilginç soruya cevap vereceğini umuyoruz
Karim Manaouil

Ancak, sanmıyorum çünkü, örneğin, büyük bir dosya coying (veri yeni bloklara kopyalama) oldukça uzun zaman alacaktır. Bu tür dosya sistemlerinde bir COW varsa (en azından ext3 / ext4) zaman gecikmesini fark etmezsiniz (belki de böyle bir durumda inode sadece veri bloklarına işaretçiler olmadan ve bazı COW bayrağını işaretlemeksizin kopyalanır).
Karim Manaouil

Kopyalama-Yazma ZFS'de uygulanır ve gerçekten çok ucuz dosya sistemi / birim klonları vardır. ext4 / xfs inanıyorum ki, bunu desteklemek için çok ilkel bir disk biçimine sahip
myaut

Yanıtlar:


7

Aranacak anahtar kelime reflink. Son zamanlarda XFS'de uygulandı.

EDIT: XFS uygulaması başlangıçta EXPERIMENTAL olarak işaretlendi. Bu uyarı, yukarıdakini yazdıktan birkaç ay sonra 4.16 çekirdeğinde kaldırıldı :-).


11

Gönderen cp adam sayfası :

--Reflink [= always] belirtildiğinde, veri bloklarının yalnızca değiştirildiğinde kopyalandığı hafif bir kopya gerçekleştirin. Bu mümkün değilse kopya başarısız olur veya --reflink = auto belirtilirse, standart bir kopyaya geri dönün.

Destekleyen dosya sistemleri üzerindeki bu çalışmalar Kopyala-on-yazma ( referans linkinizi ), esas olarak şu anda btrfs. XFS reflink uygulaması geliştirilmektedir [1] [2] .


1
NFS, CIFS, OCFS2 gibi bazı ağ dosya sistemleri bunları sunucuya da iletebilir.
Stéphane Chazelas

2

Linux, kullanıcı alanı işlemlerinin çekirdeğe dosyaların yazılı kopyalarına kopya yapmasını söylemesini sağlayan bir sistem çağrısına sahiptir. FICLONERANGE ve FICLONE, ioctl seçeneği olarak kullanılan dosyaların ve aralıkların dosyaların içindeki kopyalarının kopyalanmasına izin verir.

Bu, cp --reflink tarafından dosya sisteminin bunu desteklediği yerlerde kopyalar oluşturmak için kullanılır.


1

Bir sistem çağrısı yapmadığınız sürece cp(veya en azından bir bloğu kopyalamak için), işletim sisteminin, cpprogramın yazacağı verilerin başka bir bloktan okuduğu verilerle aynı olduğunu anlamakta zorlanır . Bunun da ötesinde, "birkaç dosya aynı blokları paylaşıyor" senaryosunu yönetmek için ek yükünüz olacaktır. Sadece birkaç blokta farklılık gösteren büyük benzer dosyalar nadiren gerçekleşir. Bu nedenle, bu blokları kopyalamak, daha sonra bu yönetim yükünü tüm dosyalara eklemek genel olarak daha ucuzdur .

Şimdi BTRFS'ye dosya sisteminin başka bir kopyasını / anlık görüntüsünü ekleyerek dosyaları "kopyalarsanız", durum farklıdır: Şimdi dosya sistemindeki tüm dosyaları ve tüm değişiklikleri "kopyaladınız" yazma üzerine kopyalanırlar. Bu var, ancak ext4'te yok.

"Yolculuk" bundan tamamen bağımsız bir kavramdır, önemli olan dosyaların idari yapılarıdır.


Büyük dosyalar, diğer son derece nadir zamanların ikili kopyası olan tek bir bitte farklılık gösterir ve bunun nedeni bir hatadan kaynaklanır.
bitifet

Kopya için bir sistem çağrısı getirildi (cevabıma bakın).
Platypus Q
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.