Apakah ada sistem file yang menyimpan hanya satu salinan file, dan salinan lainnya hanya referensi?

18

Pertanyaannya mungkin tidak tepat sehingga saya akan mencoba menjelaskannya secara lebih rinci.

Untuk sejumlah alasan saya memiliki banyak salinan dari file yang sama di sistem file Linux saya. Banyak dari mereka cukup besar.

Katakanlah saya punya /path/to/some.filedan salinan file ini /other/path/file.namedan /yet/another/path/third.copy. Saya bertanya-tanya apakah ada sistem file yang benar-benar akan membuat dua file ini bertindak sebagai referensi ke aslinya. Secara alami, jika pengguna memodifikasi salah satunya, maka hanya mereka yang akan menjadi file independen.

PS. Saya tahu ini dapat (sebagian) diselesaikan dengan menggunakan tautan. Tetapi saya ingin fitur ini saya coba jelaskan di atas agar ditangani secara transparan oleh sistem file.

DejanLekic
sumber
Karena tampaknya belum ada jawaban yang sempurna, mengapa tidak menulis skrip (mungkin dijalankan dari cron) yang menggantikan file dengan tautan keras (atau, jika aman bagi sebagian dari mereka, symlink)? Bagaimanapun, jika Anda belum tahu di mana semua duplikat berada, periksa fdupes code.google.com/p/fdupes .
Joe
1
Saya tidak bisa melakukan itu karena ketika beberapa pengguna mengubah data dalam salah satu duplikat, mereka harus menjadi file independen karena kontennya berbeda setelah perubahan ... Jika saya membuat tautan simbolis, maka modifikasi sebenarnya akan mengubah yang asli. Pikirkan file asli sebagai nilai dalam bahasa pemrograman fungsional - ketika Anda memodifikasinya, Anda mendapatkan objek baru, dan referensi untuk itu.
DejanLekic
BAIK. Hanya beberapa ide: Apakah ada beberapa cara yang bisa Anda dapatkan antara pengguna Anda dan file-file ini? Jika Anda bisa, Anda bisa mulai dengan tautan (sym atau hard) dan kemudian memutus tautan jika mereka menulis sesuatu ke file. Anda juga dapat menggunakan sesuatu seperti diff untuk hanya menyimpan perbedaan untuk menghemat banyak ruang seperti dalam sistem kontrol versi. Jika Anda meletakkan file di salah satu dari itu, itu bisa mengelola perbedaan untuk Anda. Saya belum pernah menggunakan sistem vcs, jadi saya tidak tahu detailnya.
Joe

Jawaban:

17

Fitur ini disebut deduplikasi . Tidak ada sistem file Linux populer (ext *) yang mendukungnya, tetapi tampaknya, ZFS mendukungnya secara parsial . Ada juga daftar sistem file yang terdaftar, antara lain, deduplikasi, tetapi tampaknya tidak ada pilihan yang populer - ini adalah fitur yang direncanakan untuk Btrfs.

Saya menduga bahwa secara berkala memeriksa sistem file Anda dan membuat tautan keras yang tepat adalah yang terbaik yang dapat Anda lakukan saat ini, walaupun itu tidak menyiratkan copy-on-write.

Claudius
sumber
Saya berharap agar BTRFS memiliki alraedy. Saya tidak tahu mereka berencana untuk memiliki fitur ini - kabar baik! Terima kasih!
DejanLekic
10

Kata kunci utama yang ingin Anda cari adalah "salin saat menulis." BTRFS memang memiliki operasi klon yang melakukan persis apa yang Anda inginkan, dan cp --reflinkakan melakukan apa yang Anda cari, asalkan sistem Anda memiliki kernel dan coreutils 7.5 yang cukup modern. Sumber Wiki Juga, bedup adalah alat yang akan menggabungkan duplikat di seluruh volume. CoW juga merupakan fitur mengemudi di bawah teknologi snapshotting btrfs, IIRC.

lebih gila
sumber
Saya menyadari cp --reflinktetapi perhatikan bahwa saya sebenarnya ingin FS mendeteksi klon dan menggunakan referensi, secara transparan. Saya juga jauh dari bedupalat ini.
DejanLekic
Ketika proses tingkat pengguna membaca dari satu file dan menulis ke yang lain, bagaimana lapisan FS akan tahu bahwa itu adalah salinan yang tepat dan bukan salinan yang dimodifikasi? Itu sebabnya ada ioctl terpisah untuk kloning vs hanya membaca dan menulis. Aplikasi yang ingin mengkloning file dan ingin menggunakan Kontrak Karya harus menggunakan hal-hal seperti itu saat tersedia dan sebaliknya. Tidak ada metode sihir yang dapat diandalkan dimana lapisan FS dapat mendeteksi salinan yang terjadi dan melakukan KK. Aplikasi harus menggunakan panggilan yang tepat untuk pekerjaan ( cp --reflink/ klon) atau alat terpisah untuk menyelesaikan pekerjaan nanti (bedup).
Afrazier
Dengan membandingkan nilai hash (lebih aman) atau crc + timestamp. Menulis pasti akan menyebabkan FS membuat salinan file independen. Selanjutnya, sistem ini dapat diimplementasikan pada tingkat halaman ...
DejanLekic
Dan di mana tepatnya di kernel itu dilakukan? Apa yang Anda bicarakan bukanlah masalah sederhana. Melakukannya di tingkat halaman juga dimungkinkan, tetapi membutuhkan sejumlah besar RAM untuk melakukan inline - ZFS mungkin lebih dari 20 GB RAM per TB data [Sumber ], dan OpenDedup menginginkan 8 GB RAM per TB data dengan / 4k halaman [Sumber ]. Persyaratan ZFS dapat dikurangi dengan L2ARC dengan biaya kinerja.
Afrazier
1
WHS tidak melakukan dedup, kecuali jika Anda berbicara tentang toko cadangan. Dalam kasus perangkat lunak cadangan, klien dapat melakukan sebagian besar pekerjaan dan memeriksa hash dengan server sebelum mengirim data apa pun ke sana untuk ditulis. Layanan cadangan adalah binatang yang sangat berbeda dari sistem file. Strategi yang bekerja untuk satu mungkin tidak layak untuk yang lain.
Afrazier
4

Ada sistem file online S3QL yang dirancang untuk cadangan dengan kapasitas deduplikasi yang besar.

Daniel Fanjul
sumber
Saya seharusnya mengatakan bahwa saya memerlukan ini untuk sistem file lokal ... +1 untuk informasi bermanfaat.
DejanLekic
@DejanLekic, url seperti lokal: // ... diizinkan.
Daniel Fanjul
0

Zfs, btrfs, ext3cow, bcachefs (afaik, tetapi ada kemungkinan itu belum diimplementasikan). Microsoft memiliki satu dalam pengembangan tetapi mereka berhenti karena alasan yang tidak diketahui.

orange_juice6000
sumber