Apakah ada skrip deduplikasi yang menggunakan btrfs CoW sebagai dedup?

9

Mencari alat deduplikasi di Linux ada banyak, lihat misalnya halaman wiki ini .

Allmost all scripts hanya melakukan deteksi, mencetak nama file duplikat atau menghapus file duplikat dengan menghubungkannya ke satu salinan.

Dengan munculnya btrf akan ada pilihan lain: membuat salinan file (seperti cp reflink=always) CoW (copy-on-write ). Saya belum menemukan alat yang melakukan ini, adakah yang mengetahui alat yang melakukan ini?

Peter Smit
sumber
Pembaruan: Cabang pengembangan rmlint, dan saya percaya juga master, menambahkan yang berikut: 1) hashing file tambahan. Itu tidak akan mem-hash file, kecuali itu berubah sejak jalankan terakhir [itu besar]. 2) Penambahan bertahap . Ini hanya memotong file yang belum, atau telah berubah. [Itu bahkan lebih peluk.] Dikombinasikan dengan hanya mem-hashing file setelah semua metode perbandingan cepat lainnya gagal, membuatnya tak terkalahkan. Bedup ditinggalkan dan tampaknya tidak akan dikompilasi. Saya melakukan perbandingan terperinci: docs.google.com/spreadsheets/d/…
Jim

Jawaban:

17

Saya menulis bedup untuk tujuan ini. Ini menggabungkan btree scanning tambahan dengan deduplikasi CoW. Paling baik digunakan dengan Linux 3.6, tempat Anda dapat menjalankan:

sudo bedup dedup
Gabriel
sumber
Hai @Gabriel, komentar untuk jawaban saya di bawah ini menyatakan bahwa "... bedup ... letakkan benda-benda dalam ember ukuran dan hanya baca seluruh file, untuk membuat checksum, jika perlu." Benarkah? Jika demikian, saya ingin memperbarui jawaban saya di bawah ini. (Dan gunakan bedup sendiri!) Sayangnya saya tidak dapat memverifikasi ini di mana pun. Saya sudah mencoba Google, mencari di halaman github Anda, dan pencarian pada kode. Terima kasih.
Jim
4

Saya mencoba tidur. Meskipun bagus (dan memiliki beberapa fitur berbeda yang berguna yang mungkin menjadikannya pilihan terbaik bagi banyak orang), tampaknya memindai keseluruhan semua file target untuk checksum.

Yang sangat lambat.

Program lain di sisi lain, seperti rdfind dan rmlint, memindai secara berbeda.

rdfind memiliki fitur "eksperimental" untuk menggunakan btrfs reflink. (Dan opsi "solid" untuk hardlink, symlink, dll.)

rmlint memiliki opsi "solid" untuk klon btrf, reflink, hardlink biasa, symlink, delete, dan perintah khusus Anda sendiri.

Tetapi yang lebih penting, rdfind dan rmlint secara signifikan lebih cepat. Seperti dalam, urutan besarnya. Alih-alih memindai semua file target untuk checksum, ia melakukan ini, kira-kira:

  • Pindai seluruh sistem file target, kumpulkan hanya jalur dan filesize.
  • Hapus dari pertimbangan, file dengan ukuran file yang unik. Ini saja, menghemat waktu dan aktivitas disk. ("Scads" adalah beberapa fungsi eksponensial terbalik atau sesuatu.)
  • Dari kandidat yang tersisa, pindai N byte pertama. Hapus dari pertimbangan, mereka dengan ukuran file yang sama tetapi berbeda N byte pertama.
  • Lakukan hal yang sama untuk byte N terakhir.
  • Hanya itu (biasanya sebagian kecil ) yang tersisa, pindai checksum.

Keuntungan lain dari rmlint yang saya ketahui:

  • Anda dapat menentukan checksum. MD5 terlalu menakutkan? Coba sha256. Atau 512. Atau perbandingan bit-untuk-bit. Atau fungsi hashing Anda sendiri.
  • Ini memberi Anda pilihan Btrfs "clone", dan "reflink", bukan hanya reflink. "cp --reflink = selalu" hanya sedikit berisiko, karena ini bukan atom, tidak mengetahui apa lagi yang terjadi pada file di kernel, dan tidak selalu mempertahankan metadata. "Clone", OTOH (yang merupakan istilah steno ... Saya kehabisan nama terkait API resmi), adalah panggilan tingkat kernel yang atomik dan mempertahankan metadata. Hampir selalu menghasilkan hal yang sama, tetapi sedikit lebih kuat dan aman. (Meskipun sebagian besar program cukup pintar untuk tidak menghapus file duplikat, jika tidak berhasil membuat reflink temp ke yang lain.)
  • Ini memiliki banyak pilihan untuk banyak kasus penggunaan (yang juga merupakan kelemahan).

Saya membandingkan rmlint dengan deduperemove - yang juga secara buta memindai semua file target untuk checksum. Duperemove membutuhkan beberapa hari pada volume saya untuk menyelesaikan (4 saya pikir), menjadi miring penuh. fmlint membutuhkan beberapa jam untuk mengidentifikasi duplikat, kemudian kurang dari sehari untuk menyimpulkannya dengan klon Btrfs.

(Yang mengatakan, siapa pun yang berusaha untuk menulis dan mendukung perangkat lunak yang kuat dan berkualitas dan memberikannya secara gratis, pantas mendapat pujian utama!)

Btw: Anda harus menghindari pemotongan menggunakan hardlink biasa sebagai solusi pemotongan "umum", dengan segala cara.

Walaupun hardlink dapat sangat berguna dalam kasus penggunaan bertarget tertentu (misalnya file individual atau dengan alat yang dapat memindai jenis file tertentu yang melebihi beberapa ukuran minimum - atau sebagai bagian dari banyak solusi backup / snapshot gratis dan komersial), itu dapat menjadi bencana untuk "deduplikasi" pada sistem file yang umum digunakan. Alasannya adalah bahwa sebagian besar pengguna mungkin memiliki ribuan file di sistem file mereka, yang identik biner, tetapi secara fungsional sama sekali berbeda.

Sebagai contoh, banyak program menghasilkan template dan / atau file pengaturan tersembunyi (kadang-kadang di setiap folder yang dapat dilihatnya), yang awalnya identik - dan sebagian besar tetap demikian, sampai Anda, pengguna, tidak memerlukannya.

Sebagai ilustrasi khusus: File cache thumbnail foto, yang dihasilkan oleh banyak program dalam folder yang berisi foto-foto (dan karena alasan yang baik - mudah dibawa), dapat memakan waktu berjam-jam atau berhari-hari untuk menghasilkan tetapi kemudian membuat menggunakan aplikasi foto sangat mudah. Jika file-file cache awal semuanya di-hardlink bersama-sama, maka Anda kemudian membuka aplikasi pada direktori dan itu membangun cache besar ... lalu coba tebak: Sekarang SETIAP folder yang memiliki cache yang sebelumnya di-hardlink, sekarang memiliki cache yang salah. Berpotensi, dengan hasil bencana yang dapat mengakibatkan kerusakan data yang tidak disengaja. Dan juga berpotensi dengan cara yang meledak solusi cadangan yang tidak menyadari hardlink.

Selain itu, dapat merusak seluruh snapshot. Inti dari snapshot adalah agar versi "live" dapat terus berubah, dengan kemampuan untuk memutar kembali ke keadaan sebelumnya. Jika semuanya dihubungkan bersama ... Anda "memutar kembali" ke hal yang sama.

Namun kabar baiknya adalah bahwa deduping dengan Btrfs clone / reflink, dapat membatalkan kerusakan itu (saya pikir - karena selama pemindaian, itu akan melihat file yang di-link dengan identik ... kecuali ia memiliki logika untuk tidak mempertimbangkan hardlink. Mungkin tergantung pada utilitas spesifik yang melakukan deduping.)

Jim
sumber
Ini tidak benar; bedup melakukan hal yang sama, meletakkan benda-benda di ember ukuran dan hanya membaca seluruh file, untuk membuat checksum, jika perlu. Selain itu, bedup menyimpan hasil ini sehingga proses selanjutnya bahkan lebih cepat.
Peter Smit
@PeterSmit, saya ingin memperbarui jawaban saya (dan pertimbangkan untuk beralih kembali ke tempat tidur sendiri), jika saya dapat memverifikasi bagian pertama dari komentar Anda. Bedith's github readme tidak menyebutkannya, dan pencarian untuk "ukuran file" atau "filesize" tidak menghasilkan jawaban yang jelas. Bagaimana saya bisa memverifikasi?
Jim
Selain itu, bedup tampaknya ditinggalkan selama 3 tahun terakhir. Sayang sekali, karena sepertinya ide yang sangat fantastis yang ingin saya gunakan! Saya harap Anda mengambilnya kembali.
Jim