2009-11-07 27 views
7

Tôi đang làm việc trên công cụ đồng bộ hóa tệp dựa trên Perl. Nó tải các tập tin vào một thư mục tạm thời (được bảo đảm trên cùng một hệ thống tập tin như các tập tin thực) và sau đó di chuyển các tập tin tạm thời vào vị trí cũ, bảo quản siêu dữ liệu như quyền, quyền sở hữu và ACL. Tôi đang tự hỏi làm thế nào để đạt được bước cuối cùng trên Linux.Tệp nguyên tử lưu trên Linux mà không làm mất siêu dữ liệu

Trên Mac OS X, ít nhất là trong C, tôi sẽ sử dụng chức năng exchangedata. Điều này có hai tên tập tin như là đối số và hoán đổi nội dung của chúng, để lại tất cả các siêu dữ liệu (bên cạnh mtime) nguyên vẹn. Nó đảm bảo rằng hoạt động này là nguyên tử - tất cả người đọc sẽ thấy tệp cũ hoặc tệp mới, không bao giờ có gì đó ở giữa. Thật không may, tôi không nghĩ rằng nó có sẵn trên Linux.

Tôi biết rằng rename di chuyển nguyên tử, nhưng không bảo toàn siêu dữ liệu. Mặt khác, tôi có thể mở tệp và ghi đè lên dữ liệu với nội dung của tệp mới, sẽ giữ lại tất cả siêu dữ liệu nhưng sẽ không phải là một hoạt động nguyên tử. Bất kỳ đề xuất nào về giải quyết vấn đề này?

+2

Loại siêu dữ liệu nào bạn đang nỗ lực làm việc để bảo tồn? Tất cả có trong Unix là chủ sở hữu/nhóm và quyền cho chủ sở hữu/nhóm/tất cả mọi người. Điều đó có thay đổi quá nhiều đến mức nó sẽ là một vấn đề cho bạn? –

+0

Nhiều hệ thống tệp Linux cũng hỗ trợ các thuộc tính mở rộng và ACL và người dùng không có đặc quyền có thể không có quyền cần thiết để thay đổi người dùng và nhóm của tệp tạm thời thành nhóm cũ. Về cơ bản, có rất nhiều tinh tế tham gia ở đây, và tôi tự hỏi nếu một cái gì đó đã tồn tại để xử lý nó. –

Trả lời

6

Cách tiếp cận duy nhất tôi thấy ở đây là đọc siêu dữ liệu từ tệp bạn đang thay thế, áp dụng tệp đó vào tệp tạm thời và sau đó đổi tên tệp tạm thời trên tệp cũ. (rename bảo tồn các thuộc tính tập tin nguồn, rõ ràng.)

+0

Thật khó để biết tất cả các siêu dữ liệu thích hợp là gì. Có các thuộc tính tệp, thuộc tính mở rộng, ACL, nhãn bảo mật, khả năng tệp và các hệ thống tập tin hoặc hệ thống cụ thể khác ... – ephemient

+2

Điều đó nghe như một danh sách tốt để bắt đầu. "Kẻ thù tốt là tuyệt vời." – jrockway

+0

Vâng, nếu không có giải pháp hoàn chỉnh (có vẻ như không có, cho đến nay), sau đó nhận được vấn đề ít nhất một phần là tốt hơn không có gì. Ngay cả 'rsync' cũng có một bộ siêu dữ liệu giới hạn mà nó biết/quan tâm. – ephemient

4

Filesystem cụ thể, nhưng ...

Các XFS_IOC_SWAPEXT ioctl giao dịch hoán đổi các mức độ của hai file descriptor trên XFS.

#include <xfs/xfs.h> 
#include <xfs/xfs_dfrag.h> 

xfs_swapext_t sx = { 
    ..., 
    .sx_fdtarget = fd1, 
    .sx_fdtmp = fd2, 
    ... 
}; 
xfs_swapext(fd1, &sx); 

Xem nguồn tới xfs_fsr để sử dụng ví dụ.

Các vấn đề liên quan