Ảnh chụp nhanh 'cp -al` có liên kết cứng được chuyển hướng đến một tệp mới khi được chỉnh sửa


11

Tôi đang cố gắng để chụp ảnh nhanh của một thư mục lớn thường xuyên.

Tôi đã đọc ở đây: http://www.mikerubel.org/computers/rsync_snapshots/#Incremental
rằng cp -alcó một bản chụp của một thư mục bằng cách đơn giản sao chép các liên kết cứng.

Đó là tất cả tuyệt vời, nhưng vấn đề là trong ảnh chụp nhanh này, nếu tôi thay đổi một tệp, nó sẽ thay đổi trong tất cả các ảnh chụp nhanh. Thay vào đó, điều tôi muốn là hệ thống tạo một tệp mới khi thay đổi và liên kết đến đó. Bằng cách đó, mỗi ảnh chụp sẽ không trở thành không hợp lệ khi chỉnh sửa tệp đầu tiên.

Làm thế nào tôi có thể đạt được điều đó?

Tôi đã thử rsync -a --delete --link-dest=../backup.1 source_directory/ backup.0/, nhưng nó có cùng một vấn đề.

Câu trả lời:


7

Đó là cách liên kết cứng hoạt động. Nhưng, có nhiều cách xung quanh nó:

Một vài lựa chọn xuất hiện trong đầu bạn:

  • Sử dụng một hệ thống tệp có hỗ trợ cho các tệp sao chép khi ghi, như btrfs. Tất nhiên, là bạn đang sử dụng btrfs, bạn chỉ cần sử dụng ảnh chụp nhanh gốc của nó ... Nếu hệ thống tệp của bạn hỗ trợ nó, bạn có thể sử dụng cp --reflink=always. Thật không may, ext4 không hỗ trợ này.
  • Chỉ chia sẻ liên kết cứng trên ảnh chụp nhanh của bạn, không phải với bản gốc. Đó là, lần đầu tiên bạn nhìn thấy một phiên bản nhất định của một tệp, sao chép nó vào ảnh chụp nhanh. Nhưng lần sau, hãy liên kết nó với ảnh chụp trong ảnh chụp trước đó. .
  • Tùy thuộc vào cách các tệp của bạn được thay đổi, bạn có thể đảm bảo rằng temp / đổi tên được sử dụng để thay đổi chúng, sau đó sẽ phá vỡ liên kết cứng, do đó phiên bản trong ảnh chụp sẽ vẫn còn nguyên sơ. Tuy nhiên, điều này ít an toàn hơn vì các lỗi có thể làm hỏng ảnh chụp nhanh của bạn.
  • Chụp ảnh nhanh LVM của toàn bộ hệ thống tập tin.

Tất nhiên, có một tùy chọn khác là sử dụng hệ thống sao lưu thích hợp. Hầu hết tất cả trong số họ có thể quản lý để chỉ sao lưu các tập tin thay đổi.


Bạn đề nghị gì như một cách để sao lưu một thư mục lớn?
Hermann Ingjaldsson

Tôi đã suy nghĩ sử dụng rsync đến một máy chủ có cronjob để thực hiện cp -al thường xuyên để chụp nhanh .. cùng với rsync-ing trở đi để có nhiều bản sao hơn. Nghe như thế nào?
Hermann Ingjaldsson

@HermannIngjaldsson tốt, nó phụ thuộc vào cách bạn thực hiện sao lưu của bạn. Cá nhân, tôi chỉ cần thêm nó vào thiết lập Bacula của mình nhưng tôi không khuyên bạn trừ khi bạn có một loạt các máy để sao lưu hoặc đã biết Bacula. Vì vậy, tôi đoán tôi khuyên bạn nên thử rsnapshot trước.
derobert

rsnapshotlà tốt
nhà phát triển xe máy

4

Những gì bạn đang tìm kiếm là một hình thức sao chép trên ghi , trong đó nhiều tệp có cùng nội dung sử dụng cùng một không gian trên đĩa cho đến khi một trong số chúng được sửa đổi. Liên kết cứng chỉ thực hiện sao chép khi ghi nếu ứng dụng ghi đó xóa tệp và tạo tệp mới có cùng tên (thường được thực hiện bằng cách tạo tệp mới bằng một tên khác, sau đó di chuyển tệp vào vị trí). Ứng dụng bạn đang sử dụng rõ ràng không làm điều này: nó ghi đè lên tệp hiện có.

Một số ứng dụng có thể được cấu hình để sử dụng chiến lược thay thế. Một số ứng dụng sử dụng chiến lược thay thế theo mặc định, nhưng sử dụng chiến lược ghi đè khi họ thấy một tệp có nhiều liên kết cứng, chính xác để không phá vỡ các liên kết cứng. Kỹ thuật chụp nhanh hiện tại của bạn sẽ hoạt động nếu bạn có thể định cấu hình ứng dụng của mình để thay thế thay vì ghi đè.

Fl-cow sửa đổi các chương trình để sử dụng một cách có hệ thống chiến lược thay thế trên các tệp có nhiều liên kết cứng.

Ngoài ra, bạn có thể lưu trữ các tệp của mình trên một hệ thống tệp thực hiện sao chép khi ghi hoặc sao chép hoặc có tính năng chụp nhanh và không lo lắng về các liên kết cứng: Btrfs hoặc Zfs . Tùy thuộc vào sơ đồ phân vùng của bạn, sử dụng ảnh chụp nhanh LVM có thể là một tùy chọn.

Đề nghị của tôi là sử dụng một công cụ chụp nhanh thích hợp. Tạo bản sao lưu đáng tin cậy là khó khăn đáng ngạc nhiên. Bạn có thể muốn rsnapshot .


2

Sau đây là một tập lệnh ruby ​​mà tôi đã viết bao bọc "cp -al" và rsync thành một tập lệnh đẹp có thể chạy thủ công hoặc thông qua cron. Đích có thể là cục bộ hoặc từ xa (thông qua ssh):

Ghetto Timemachine

Câu trả lời cơ bản cho câu hỏi của bạn, như đã đề cập trong một bình luận trước đó, nguồn cần phải được tách ra khỏi các liên kết cứng. Ví dụ, giả sử một bản sao lưu hàng ngày của thư mục nhà của bạn:

Nguồn:

  • / nhà / flakrat

Nơi Đến:

  • / dữ liệu / sao lưu / hàng ngày
    • / thứ hai
    • / thứ ba
    • /Thứ tư
    • /Thứ năm
    • ...

Các liên kết cứng được tạo bằng cách chạy "cp -al" so với bản sao lưu của ngày hôm qua. Nói là sáng thứ ba khi bạn chạy nó:

cd /data/backup/daily

rm -rf tuesday

cp -al monday tuesday

rsync -a --delete /home/flakrat /data/backup/daily/tuesday/


0

Sao lưu dự phòng dường như làm những gì bạn muốn, hãy kiểm tra nó.

Sử dụng rsync, trước tiên bạn phải tạo một bản sao lưu đầy đủ không sử dụng các liên kết cứng. Bản sao lưu tiếp theo có thể trỏ đến bản sao lưu trước đó và liên kết cứng với nó. Bằng cách đó, các bản sao lưu của bạn không được liên kết cứng với các tệp làm việc của bạn (những tệp bạn đang sửa đổi). Thí dụ. Nếu bản sao lưu trước của tôi là sao lưu thư mục.01 tập lệnh sao lưu của tôi trước tiên sẽ tăng các thư mục bằng cách đổi tên chúng lên một để sao lưu.01 trở thành bản sao lưu.02. Sau đó, tập lệnh tạo một thư mục trống mới gọi là backup.01. sau đó nó sẽ đồng bộ hóa bản sao lưu mới vào thư mục mới và liên kết cứng đến bản sao lưu.02 để chỉ các tệp mới sẽ chiếm bất kỳ khoảng trống nào trong bản sao lưu. Lệnh rsync sẽ trông giống như thế này: rsync -rlt sourcepath backuppath / backup.01 --link-Dest = backuppath / backup.02

Vì vậy, bạn có thể thấy, tất cả các liên kết cứng đang xảy ra trên đường dẫn sao lưu. Bằng cách này, bạn không phải lo lắng về việc sao chép khi ghi khi sửa đổi tệp trong đường dẫn nguồn của mình.

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.