Alat atau skrip untuk mendeteksi file yang dipindahkan atau diganti namanya di Linux sebelum cadangan [ditutup]

15

Pada dasarnya saya mencari untuk melihat apakah ada alat atau skrip yang dapat mendeteksi file yang dipindahkan atau diganti nama sehingga saya bisa mendapatkan daftar file yang diubah namanya / dipindahkan dan menerapkan operasi yang sama di ujung lain jaringan untuk menghemat bandwidth.

Pada dasarnya penyimpanan disk murah tetapi bandwidth tidak, dan masalahnya adalah bahwa file sering akan ditata ulang atau dipindahkan ke dalam struktur direktori yang lebih baik sehingga ketika Anda menggunakan rsync untuk melakukan pencadangan, rsync tidak akan melihat bahwa itu berganti nama atau memindahkan file dan mengirim ulang melalui jaringan lagi meskipun memiliki file yang sama di ujung lainnya.

Jadi saya bertanya-tanya apakah ada skrip atau alat yang dapat merekam di mana semua file berada dan namanya, maka sebelum cadangan, itu akan memindai ulang dan mendeteksi file yang dipindahkan atau diubah namanya, maka saya dapat mengambil daftar itu dan mendaftar ulang operasi pindah / ganti nama di sisi lain.

Berikut adalah daftar fitur "umum" dari file:

  1. File besar tidak berubah
  2. Mereka dapat diubah namanya atau dipindahkan

[Sunting:] Ini semua adalah jawaban yang baik, dan apa yang akhirnya saya lakukan pada akhirnya adalah melihat semua jawaban dan akan menulis beberapa kode untuk mengatasinya. Pada dasarnya apa yang saya pikirkan / kerjakan sekarang adalah:

  1. Menggunakan sesuatu seperti AIDE untuk pemindaian "awal" dan memungkinkan saya untuk menyimpan checksum pada file karena mereka seharusnya tidak pernah berubah, sehingga akan membantu mendeteksi korupsi.
  2. Membuat daemon inotify yang akan memonitor file / direktori ini dan merekam setiap perubahan yang berkaitan dengan penggantian nama & memindahkan file ke file log.
  3. Ada beberapa kasus tepi di mana inotify mungkin gagal mencatat bahwa sesuatu terjadi pada sistem file, sehingga ada langkah terakhir menggunakan find untuk mencari sistem file untuk file yang memiliki perubahan waktu lebih lama daripada cadangan terakhir .

Ini memiliki beberapa manfaat:

  1. Checksums / etc dari AIDE untuk dapat memeriksa / memastikan bahwa beberapa media tidak rusak
  2. Inotify menjaga penggunaan sumber daya tetap rendah dan tidak perlu memindai ulang sistem file berulang kali
  3. Tidak perlu menambal rsync; Jika saya harus menambal hal-hal yang saya bisa, tetapi saya lebih suka menghindari menambal hal-hal untuk menjaga beban lebih rendah, (IE tidak perlu menambal kembali setiap kali ada pembaruan).
  4. Saya telah menggunakan Unison sebelumnya dan ini sangat bagus, namun saya bisa bersumpah bahwa Unison menyimpan salinan di sistem file dan bahwa file "arsip" -nya dapat tumbuh menjadi agak besar?
Firaun
sumber

Jawaban:

7

Unison http://www.cis.upenn.edu/~bcpierce/unison/ mengklaim dapat mendeteksi gerakan dan penggantian nama.

Ada beberapa tambalan untuk rsync untuk menambahkan deteksi pindah / ganti nama:

http://gitweb.samba.org/?p=rsync-patches.git;a=blob;f=detect-renamed-lax.diff;h=1ff593c8f97a97e8970d43ff5a62dfad5abddd75;hb=master

http://gitweb.samba.org/?p=rsync-patches.git;a=blob;f=detect-renamed.diff;h=c3e6e846eab437e56e25e2c334e292996ee84345;hb=master

Entri Bugzilla melacak masalah ini: https://bugzilla.samba.org/show_bug.cgi?id=2294

Mark Wagner
sumber
6
Mengapa tambalan ini tidak terintegrasi? Mereka hanya menambahkan bendera, mereka tidak mengganggu. Patch lain yang menarik adalah rsyncsums , yang dapat menjaga checksum tetap ada di antara rsync run.
Tobu
5

Ini sedikit solusi yang aneh, tapi ... git mendeteksi gerakan dan penggantian nama berdasarkan konten file, jadi jika Anda ingin menyimpan direktori yang dipertanyakan di bawah kontrol versi maka git akan dapat mendeteksi gerakan dan semacamnya dan menghindari mentransfer konten (karena sudah ada di kedua sisi kawat) sementara masih bergerak di pohon.

Hanya pemikiran saja.

pjz
sumber
2
Ya saya mempertimbangkan ini, jika file-file itu kecil dan berbasis teks, ini mungkin akan bekerja dengan baik, tetapi mereka adalah biner dan ukuran totalnya mendekati satu Terabyte.
Firaun
@Pharaun Anda membutuhkan indeks git tanpa penyimpanan gumpalan. Mungkin merobek kode ini dari git dan menambahkannya ke libgit2.
Tobu
Kode yang relevan dimulai dengan refresh_index di read-cache.c.
Tobu
5

saran menarik di sini. Juga berpikir untuk menggunakan kemampuan filesystem yaitu ZFS. Rasanya aneh bahwa tidak ada alat yang melakukan hal sederhana itu. Opsi serentak tidak berfungsi dalam banyak kasus seperti yang dilaporkan orang, tidak untuk saya juga.

Saya ingin fitur untuk menyimpan cadangan koleksi film saya di hard disk kedua dalam sinkronisasi ketika mengatur ulang folder.

Sekarang saya menemukan skrip C sederhana ini http://sourceforge.net/projects/movesync/

Tampaknya bekerja dengan baik. Jalankan dan kemudian sinkronkan secara normal dengan mis.

groovehunter
sumber
4

Anda mungkin dapat menggunakan IDS berbasis host seperti AIDE dan menulis skrip wrapper menggunakan outputnya. Anda mungkin harus menulis logika yang lebih kompleks mengingat checksum.

Jika tidak, sistem file berbasis jaringan mungkin masuk akal, karena perubahan akan tercermin di semua lokasi. Namun demikian, saya menduga Anda mentransfer melalui Internet, yang akan membatasi opsi di sini.

Warner
sumber
Itulah yang saya pikirkan untuk dilakukan, mengambil salah satu dari itu dan memperluasnya. Juga ya saya mentransfernya melalui internet dan bandwidth sangat terbatas.
Firaun
3

Anda mungkin mencoba berbarengan ; terutama

-xferbycopying mengoptimalkan transfer menggunakan salinan lokal (default true)

opsi yang disebutkan dalam dokumen sebagai

Ketika preferensi ini diatur, Unison akan mencoba menghindari mentransfer konten file di seluruh jaringan dengan mengenali kapan file dengan konten yang diperlukan sudah ada di replika target. Ini biasanya memungkinkan perpindahan file disebarkan dengan sangat cepat. Nilai standarnya benar.

Sepertinya itu mungkin melakukan apa yang Anda inginkan.

pjz
sumber
Sebenarnya di belakang, saya mungkin terlalu tergesa-gesa pada komentar serempak. Apakah dukungan serentak mengganti hardlink dengan konten file yang sebenarnya jika itu berubah? Jika demikian maka saya mungkin dapat melakukan sihir dengan rsnapshot + serempak yang akan memenuhi persyaratan saya tanpa harus menulis satu ton kode baru / log / etc untuk menangani ini.
Firaun
3

Syrep melakukan apa yang Anda butuhkan. Itu membuat pesan intisari pada pohon file up to date; menjaga pencernaan di sekitar membuatnya lebih efisien daripada rsync. Itu dirancang untuk sneakernet sehingga Anda mungkin ingin menambahkan pembungkus yang melakukan pembaruan / membuat / menggabungkan sekaligus.

Tobu
sumber
2

Saya tidak yakin apakah ada alat yang ada yang melakukan ini untuk Anda, tetapi Anda bisa menulis skrip sederhana yang hanya menjalankan findpada direktori basis di mana mtimelebih baru dari cadangan terakhir. Ini akan memberi Anda daftar semua file yang telah dimodifikasi . Jika suatu file hanya dipindahkan, itu tidak akan muncul dalam daftar. Sayangnya, daftar ini akan menyertakan direktori tempat file dipindahkan, karena direktori diperbarui ketika file ditambahkan / dihapus.

Dengan daftar file itu, Anda dapat menggunakan rsync untuk hanya menyinkronkan file-file itu. rsync memiliki opsi untuk membaca dalam daftar file. Berikut tes yang menunjukkan contoh ini:

$ cd tmp
$ echo test > test
$ ls -la
total 16
drwxr-xr-x 2 root root 4096 Aug 18 11:34 .
drwxr-x--- 5 root root 4096 Aug 18 11:34 ..
-rw-r--r-- 1 root root    5 Aug 18 11:34 test
$ mkdir tmp2
$ find . -mmin 1
$ date
Wed Aug 18 11:35:10 EDT 2010
$ find . -mmin 1
$ find . -mmin 2
.
./test
./tmp2
$ mv test tmp2
$ find . -mmin 1
.
./tmp2

Harap dicatat bahwa saya menunggu sekitar 1 menit antara menjalankan setiap findperintah. Dari ini, itu menunjukkan bahwa ketika membuat file awalnya, itu terdaftar oleh find. Jika saya memindahkan file ke direktori lain dan menjalankan kembali findperintah, itu hanya menampilkan direktori tempat saya memindahkan file, dan bukan file itu sendiri. Anda dapat menggunakan kombinasi finddan rsyncperintah untuk hanya mencantumkan file yang Anda inginkan, itu mungkin dapat mencapai tujuan Anda.

Saya harap ini membantu.

vmfarms
sumber
2

Dengan alur kerja Anda, saya ingin tahu apakah bekerja di tingkat file (seperti apa yang telah diusulkan orang lain sejauh ini) adalah solusi terbaik. Anda bisa bekerja ...

Pada level sistem file

Idenya adalah untuk membuat sistem file melacak operasi antara cadangan. Alih-alih membuat cadangan sistem file, buat cadangan jurnal sistem file (dan pilih untuk memutar ulang perubahan pada mesin cadangan, jika Anda menginginkan cadangan yang siap digunakan). Jurnal filesystem secara alami mengekspresikan gerakan dan penghapusan dalam beberapa byte.

Fuse membuatnya relatif mudah untuk merancang sistem file dengan persyaratan khusus yang berada di atas "sistem file nyata". Saya tidak pernah menggunakannya, tetapi LoggedFS terlihat menjanjikan.

Dengan solusi ini, akan bermanfaat untuk memiliki beberapa bentuk kompresi jurnal. Misalnya, jika file telah ditimpa 10 kali, hanya perbarui terakhir dalam jurnal. Optimalisasi lain yang bermanfaat adalah mengenali operasi penyalinan, dan bahkan lebih baik, pengeditan (yaitu, membuat file yang sebagian besar tetapi tidak sepenuhnya identik dengan file lain). Saya tidak tahu apakah ada yang menerapkan ini. Untuk alur kerja Anda, saya pikir itu tidak akan menjadi masalah.

Di tingkat volume

Idenya adalah untuk membuat manajer volume melacak operasi antara cadangan. Alih-alih membuat cadangan sistem file, ambil snapshot dengan pengelola volume dan buat cadangan snapshot yang dinyatakan sebagai berbeda dari snapshot sebelumnya.

Ini akan bekerja dengan baik jika semua yang Anda lakukan adalah membuat file, mengubah nama file dan menghapusnya. Akan jauh lebih sulit untuk mendeteksi hal-hal seperti salinan dan pengeditan, atau untuk mengoptimalkan pembuatan file diikuti dengan penghapusannya.

Gilles 'SO- berhenti menjadi jahat'
sumber
Saya sebenarnya telah bekerja sedikit pada file "sistem" logger melalui inotify untuk melacak perubahan, tetapi jika perubahan datang lebih cepat daripada kecepatan yang daemon dapat merekamnya, itu akan kehilangan informasi, maka perlu membangun backup / scan untuk mendapatkan status awal dan jika tidak ada informasi yang hilang. Itu memang terlihat seperti gagasan memiliki sesuatu yang berada di antara sistem file & sisa sistem mungkin juga merupakan ide yang baik maka seperti yang Anda katakan, bahwa perubahan dapat diputar ulang di mesin cadangan.
Firaun
Tapi itu logFS memang terlihat seperti proyek yang menarik, satu-satunya kekhawatiran adalah mereka berhenti dev pada 2008/09. Akan harus bermain dengannya dan melihat apakah itu akan melakukan trik.
Firaun
0

Serempak baik untuk ini, tetapi masih perlu menyalin file secara lokal dan tidak dapat mendeteksi pemindahan / penggantian nama jika konten file juga berubah sedikit.

Saya membuat skrip Python sederhana untuk mendeteksi nama / memindahkan file dan direktori menggunakan nomor inode (* nix saja) dan memutar ulang perubahan ini pada mesin yang disinkronkan. Anda dapat menggunakannya dengan sendirinya atau sebagai "mengubah nama preprocessor" untuk Unison atau rsync. Itu dapat ditemukan di sini

rolicot
sumber