Công cụ hoặc tập lệnh để phát hiện các tệp đã di chuyển hoặc đổi tên trên Linux trước khi sao lưu [đã đóng]


15

Về cơ bản tôi đang tìm kiếm để xem liệu có tồn tại một công cụ hoặc tập lệnh có thể phát hiện các tệp được di chuyển hoặc đổi tên để tôi có thể nhận danh sách các tệp được đổi tên / di chuyển và áp dụng cùng một hoạt động ở đầu kia của mạng để bảo toàn băng thông.

Về cơ bản lưu trữ đĩa là rẻ nhưng băng thông thì không, và vấn đề là các tệp thường sẽ được sắp xếp lại hoặc chuyển sang cấu trúc thư mục tốt hơn, do đó khi bạn sử dụng rsync để thực hiện sao lưu, rsync sẽ không nhận thấy rằng nó được đổi tên hoặc di chuyển tệp và truyền lại nó qua mạng một lần nữa mặc dù có cùng một tệp ở đầu bên kia.

Vì vậy, tôi tự hỏi nếu có tồn tại một tập lệnh hoặc công cụ có thể ghi lại tất cả các tệp và tên của chúng, thì ngay trước khi sao lưu, nó sẽ quét lại và phát hiện các tệp đã di chuyển hoặc đổi tên, sau đó tôi có thể lấy danh sách đó và áp dụng lại hoạt động di chuyển / đổi tên ở phía bên kia.

Dưới đây là danh sách các tính năng "chung" của các tệp:

  1. Tập tin không thay đổi lớn
  2. Họ có thể được đổi tên hoặc di chuyển xung quanh

[Chỉnh sửa:] Đây đều là những câu trả lời hay, và cuối cùng tôi đã xem xét tất cả các câu trả lời và sẽ viết một số mã để giải quyết vấn đề này. Về cơ bản những gì tôi đang nghĩ / làm việc bây giờ là:

  1. Sử dụng một cái gì đó như AIDE để quét "ban đầu" và cho phép tôi giữ tổng kiểm tra trên các tệp vì chúng được cho là không bao giờ thay đổi, vì vậy nó sẽ giúp phát hiện tham nhũng.
  2. Tạo một daemon inotify sẽ theo dõi các tệp / thư mục này và ghi lại mọi thay đổi liên quan đến đổi tên và di chuyển các tệp xung quanh thành một tệp nhật ký.
  3. Có một số trường hợp cạnh mà inotify có thể không ghi lại rằng đã xảy ra sự cố với hệ thống tệp, do đó, bước cuối cùng là sử dụng find để tìm kiếm hệ thống tệp cho các tệp có thời gian thay đổi sau lần sao lưu cuối cùng .

Điều này có một số lợi ích:

  1. Tổng kiểm tra / vv từ AIDE để có thể kiểm tra / đảm bảo rằng một số phương tiện truyền thông không bị hỏng
  2. Inotify giữ mức sử dụng tài nguyên ở mức thấp và không cần phải quét lại hệ thống tập tin nhiều lần
  3. Không cần phải vá rsync; Nếu tôi phải vá những thứ tôi có thể, nhưng tôi muốn tránh vá những thứ đó để giảm gánh nặng, (IE không cần phải vá lại mỗi khi có bản cập nhật).
  4. Tôi đã sử dụng Unison trước đây và nó thực sự rất hay, tuy nhiên tôi có thể thề rằng Unison không giữ các bản sao trên hệ thống tệp và các tệp "lưu trữ" của nó có thể phát triển khá lớn?

Câu trả lời:


7

6
Tại sao các bản vá này không được tích hợp? Họ chỉ thêm cờ, họ không xâm phạm. Một bản vá thú vị khác là rsyncsums , có thể giữ tổng kiểm xung quanh các lần chạy rsync.
Tobu

5

Đây là một giải pháp kỳ quặc, nhưng ... git phát hiện di chuyển và đổi tên dựa trên nội dung tệp, vì vậy nếu bạn giữ các thư mục trong câu hỏi dưới sự kiểm soát phiên bản thì git sẽ có thể phát hiện di chuyển và như vậy và tránh chuyển nội dung (vì nó đã ở cả hai phía của dây) trong khi vẫn di chuyển mọi thứ xung quanh trong cây.

Chỉ là một ý nghĩ.


2
Có, tôi đã cân nhắc điều này, nếu các tệp nhỏ và dựa trên văn bản, điều này có thể sẽ hoạt động tốt, nhưng chúng là nhị phân và tổng kích thước đang tiếp cận một Terabyte.
Pharaun

@Pharaun Bạn sẽ cần chỉ số git mà không cần lưu trữ blob. Có thể tách mã này ra khỏi git và thêm nó vào libgit2.
Tobu

Mã có liên quan bắt đầu với refresh_index trong read-cache.c.
Tobu

5

đề nghị thú vị ở đây. Cũng nghĩ đến việc sử dụng các khả năng của hệ thống tập tin, tức là ZFS. Tìm thấy điều kỳ lạ là không có công cụ nào làm điều đơn giản đó. Tùy chọn Unison không hoạt động trong hầu hết các trường hợp như mọi người báo cáo, cũng không phải cho tôi.

Tôi muốn tính năng này sao lưu bộ sưu tập phim của tôi trên đĩa cứng thứ hai khi đồng bộ hóa các thư mục.

Bây giờ tôi tìm thấy tập lệnh C đơn giản này http://sourceforge.net/projects/moveync/

Có vẻ để làm việc tốt. Chạy nó và sau đó đồng bộ hóa bình thường với tức là unison.


4

Bạn có thể sử dụng IDS dựa trên máy chủ như AIDE và viết tập lệnh bao bọc bằng đầu ra của nó. Bạn có thể sẽ phải viết logic phức tạp hơn khi xem xét tổng kiểm tra.

Mặt khác, một hệ thống tập tin dựa trên mạng có thể có ý nghĩa, vì những thay đổi sẽ được phản ánh tại tất cả các vị trí. Tuy nhiên, tôi nghi ngờ bạn đang chuyển qua Internet, điều này sẽ giới hạn các tùy chọn ở đây.


Đó là những gì tôi đã nghĩ làm, lấy một trong số chúng và mở rộng chúng. Ngoài ra, tôi đang chuyển nó qua internet và băng thông khá hạn chế.
Pharaun

3

Bạn có thể thử unison ; đặc biệt là

-xferbycing tối ưu hóa chuyển bằng cách sử dụng các bản sao cục bộ (mặc định là đúng)

tùy chọn được đề cập trong các tài liệu như

Khi tùy chọn này được đặt, Unison sẽ cố gắng tránh truyền nội dung tệp trên mạng bằng cách nhận ra khi một tệp có nội dung bắt buộc đã tồn tại trong bản sao đích. Điều này thường cho phép di chuyển tập tin được lan truyền rất nhanh. Giá trị mặc định là true.

Có vẻ như nó có thể làm những gì bạn muốn.


Trên thực tế, nhìn nhận lại, tôi có thể đã quá vội vàng về bình luận unison. Có unison hỗ trợ thay thế một liên kết cứng với nội dung tập tin thực tế nếu nó thay đổi? Nếu vậy thì tôi có thể thực hiện một số phép thuật với rsnapshot + unison sẽ đáp ứng yêu cầu của tôi mà không phải viết ra một tấn mã / log / etc mới để giải quyết vấn đề này.
Pharaun

3

Syrep làm những gì bạn cần. Nó giữ thông báo tiêu hóa trên cây tập tin cập nhật; giữ các tiêu hóa xung quanh làm cho nó hiệu quả hơn rsync. Nó được thiết kế cho sneakernet, do đó bạn có thể muốn thêm một trình bao bọc cập nhật / makepatch / merge cùng một lúc.


2

Tôi không chắc chắn nếu có một công cụ hiện có thực hiện điều này cho bạn, nhưng bạn có thể viết một tập lệnh đơn giản chỉ chạy findtrên thư mục cơ sở mtimemới hơn bản sao lưu cuối cùng. Điều này sẽ giúp bạn có một danh sách tất cả các tệp đã được sửa đổi . Nếu một tập tin được di chuyển đơn giản, nó sẽ không xuất hiện trong danh sách. Thật không may, danh sách này sẽ bao gồm các thư mục mà các tệp được chuyển vào, vì thư mục được cập nhật khi một tệp được thêm / xóa.

Với danh sách các tệp đó, bạn có thể sử dụng rsync để chỉ đồng bộ hóa các tệp đó. rsync có một tùy chọn để đọc trong danh sách tập tin. Đây là một thử nghiệm cho thấy ví dụ này:

$ 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

Xin lưu ý rằng tôi đã đợi khoảng 1 phút giữa khi chạy mỗi findlệnh. Từ đó, nó cho thấy rằng khi ban đầu tạo tệp, nó được liệt kê bởi find. Nếu tôi di chuyển tệp vào thư mục khác và chạy lại findlệnh, nó chỉ hiển thị thư mục tôi đã chuyển tệp vào chứ không hiển thị tệp. Bạn có thể sử dụng kết hợp findrsynccác lệnh để chỉ liệt kê các tệp bạn muốn, nó có thể có thể đạt được mục tiêu của bạn.

Tôi hi vọng cái này giúp được.


2

Với quy trình làm việc của bạn, tôi tự hỏi liệu làm việc ở cấp độ tệp (như những gì người khác đã đề xuất cho đến nay) là giải pháp tốt nhất. Bạn có thể làm việc ...

Ở cấp độ hệ thống tập tin

Ý tưởng là để hệ thống tập tin theo dõi các hoạt động giữa các bản sao lưu. Thay vì tạo bản sao lưu của hệ thống tệp, hãy sao lưu nhật ký hệ thống tệp (và tùy chọn phát lại các thay đổi trên máy sao lưu, nếu bạn muốn sao lưu sẵn sàng sử dụng). Một tạp chí hệ thống tập tin tự nhiên thể hiện di chuyển và xóa trong một vài byte.

Fuse giúp thiết kế một hệ thống tập tin tương đối dễ dàng với các yêu cầu cụ thể nằm trên một hệ thống tập tin thực sự thực tế. Tôi chưa bao giờ sử dụng nó, nhưng LoggedFS có vẻ đầy hứa hẹn.

Với giải pháp này, sẽ đáng để có một số hình thức nén tạp chí. Ví dụ: nếu một tệp đã bị ghi đè 10 lần, chỉ giữ bản cập nhật cuối cùng của nó trong tạp chí. Một tối ưu hóa đáng giá khác sẽ là nhận ra các hoạt động sao chép và thậm chí tốt hơn là chỉnh sửa (nghĩa là tạo một tệp hầu hết nhưng không hoàn toàn giống với tệp khác). Tôi không biết nếu có ai đã thực hiện điều này. Đối với quy trình làm việc của bạn, tôi không nghĩ nó sẽ quan trọng hơn nữa.

Ở mức âm lượng

Ý tưởng là để người quản lý âm lượng theo dõi các hoạt động giữa các bản sao lưu. Thay vì tạo bản sao lưu của hệ thống tập tin, hãy chụp ảnh nhanh với trình quản lý âm lượng và sao lưu ảnh chụp nhanh được thể hiện dưới dạng khác với ảnh chụp nhanh trước đó.

Điều này sẽ hoạt động tốt nếu tất cả những gì bạn làm là tạo tập tin, đổi tên chúng và xóa chúng. Sẽ khó hơn rất nhiều để phát hiện những thứ như bản sao và chỉnh sửa hoặc tối ưu hóa việc tạo một tệp theo sau là xóa nó.


Tôi thực sự đã làm việc một chút trên trình ghi nhật ký "hệ thống" thông qua inotify để theo dõi các thay đổi, nhưng nếu các thay đổi đến nhanh hơn tốc độ mà trình nền có thể ghi lại, thì nó sẽ mất thông tin, do đó cần phải xây dựng một sao lưu / quét để có được trạng thái ban đầu và trong trường hợp mất thông tin. Có vẻ như ý tưởng có một cái gì đó nằm giữa hệ thống tập tin và phần còn lại của hệ thống cũng có thể là một ý tưởng tốt như bạn đã nói, những thay đổi có thể được phát lại trên máy sao lưu.
Pharaun

Nhưng logFS đó trông giống như một dự án thú vị, điều đáng quan tâm là họ đã dừng phát triển vào 2008/09. Sẽ phải chơi với nó và xem nếu nó sẽ làm điều đó.
Pharaun

0

Unison là tốt cho việc này, nhưng vẫn cần sao chép tệp cục bộ và nó không thể phát hiện di chuyển / đổi tên nếu nội dung tệp cũng thay đổi dù chỉ một chút.

Tôi đã tạo một tập lệnh Python đơn giản để phát hiện các tập tin và thư mục được đổi tên / di chuyển bằng cách sử dụng số inode (chỉ * nix) và phát lại các thay đổi này trên máy được đồng bộ hóa. Bạn có thể tự sử dụng nó hoặc làm "đổi tên tiền xử lý" cho Unison hoặc rsync. Nó có thể được tìm thấy ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.