Apakah sistem file menerapkan Mekanisme Copy on Write untuk CP

16

Kami telah melihat OS melakukan optimasi Copy on Write ketika forking proses. Alasannya adalah bahwa sebagian besar waktu garpu diproses oleh exec, jadi kami tidak ingin mengeluarkan biaya alokasi halaman dan menyalin data dari ruang alamat pemanggil yang tidak perlu.

Begitu juga ini terjadi ketika melakukan CP pada linux dengan sistem file ext4 atau xfs (journaling). Jika tidak terjadi, mengapa tidak?

Mridul Verma
sumber
Semoga seseorang akan menjawab pertanyaan menarik ini
Karim Manaouil
Namun saya tidak berpikir demikian karena, misalnya, mengoyak file besar akan memakan waktu lebih lama (menyalin data ke blok baru). Jika ada SAP dalam sistem file tersebut (setidaknya ext3 / ext4) Anda tidak akan melihat latensi waktu (mungkin dalam kasus seperti itu hanya mereplikasi inode tanpa pointer ke blok data & menandai beberapa bendera SAP).
Karim Manaouil
Copy-on-Write diimplementasikan pada ZFS, dan memang memiliki filesystem / volume klon yang sangat murah. ext4 / xfs memiliki format on-disk terlalu primitif, saya percaya, untuk mendukung itu
myaut

Jawaban:

7

Kata kunci untuk pencarian adalah reflink. Baru-baru ini diimplementasikan dalam XFS.

EDIT: implementasi XFS awalnya ditandai EXPERIMENTAL. Peringatan ini telah dihapus pada rilis kernel 4.16, beberapa bulan setelah saya menulis di atas :-).

sourcejedi
sumber
11

Dari cp halaman manual :

Saat --reflink [= selalu] ditentukan, lakukan penyalinan ringan, di mana blok data hanya disalin saat dimodifikasi. Jika ini tidak memungkinkan, salinan gagal, atau jika --reflink = otomatis ditentukan, kembali ke salinan standar.

Ini berfungsi pada sistem file yang mendukung Copy-on-Write ( reflink ), terutama BTRFS saat ini. Implementasi reflink XFS sedang dalam pengembangan [1] [2] .

sebasth
sumber
1
Beberapa sistem file jaringan seperti NFS, CIFS, OCFS2 juga dapat meneruskannya ke server.
Stéphane Chazelas
2

Linux memiliki system call yang memungkinkan proses userspace memberitahu kernel untuk membuat salinan pada salinan file yang ditulis. FICLONERANGE dan FICLONE digunakan sebagai opsi untuk ioctl memungkinkan penyalinan pada salinan file yang ditulis dan rentang dalam file yang akan dibuat.

Ini digunakan oleh cp --reflink untuk membuat salinan yang mendukung sistem file ini.

Q the Platypus
sumber
1

Kecuali Anda memperkenalkan syscall untuk cp(atau setidaknya menyalin blok), OS mengalami kesulitan untuk mengetahui bahwa data yang cpakan ditulis oleh program sama dengan yang baru saja dibaca dari blok lain. Selain itu, Anda akan memiliki overhead tambahan untuk mengelola skenario "beberapa file berbagi blok yang sama". File besar serupa yang hanya berbeda dalam beberapa blok jarang terjadi. Jadi secara keseluruhan lebih murah hanya menyalin blok-blok itu, lalu menambahkan overhead administratif ini ke semua file.

Sekarang jika Anda "menyalin" file (banyak dari mereka) dengan menambahkan klon / snapshot lain dari sistem file di, katakanlah, BTRFS, situasinya berbeda: Sekarang Anda telah "menyalin" semua file di sistem file, dan setiap perubahan ke mereka akan menjadi copy-on-write. Ini ada, tetapi tidak di ext4.

"Journalling" adalah konsep yang sepenuhnya independen dari itu, itu adalah struktur administrasi untuk file yang diperhitungkan.

dirkt
sumber
File besar yang merupakan salinan biner dari waktu yang sangat langka lainnya berbeda dalam satu bit dan ketika itu terjadi adalah karena kesalahan.
bitifet
Panggilan sistem untuk salinan telah diperkenalkan (lihat jawaban saya).
Q the Platypus