Cập nhật
Sau khi tìm hiểu thêm về điều này và xem xét mã này chattr
và mã khác e2fsprogs
, rõ ràng các thuộc tính được đặt bởi chattr
và các thuộc tính được đặt bởi libattr
(ví dụ với lệnh setfattr
) rất khác nhau. chattr
thiết lập các ext
cờ hệ thống tập tin mà đơn giản là không ánh xạ tới một thuộc tính hoặc không gian tên được đặt tên. Không trong số họ xuất hiện với bất kỳ cuộc gọi đến libattr
's listxattr
. Có lẽ họ nên ánh xạ tới các thuộc tính được đặt tên trong system
không gian tên như được giả định bên dưới, nhưng cho đến nay điều này hoàn toàn không được thực hiện. Ngoài ra, system.posix_acl_access
thuộc tính tôi nhầm với ánh xạ tới một trong các thuộc tính dưới đây, không liên quan gì đến các ext
cờ hệ thống tập tin và đúng hơn là làm với danh sách kiểm soát truy cập. Liên kếtstrace
tin nhắn xuất hiện cho bất kỳ tập tin và biến mất khi chỉ cp --preserve=xattr
được sử dụng.
Dường như các thuộc tính được thiết lập chattr
là dành riêng cho các ext
hệ thống tệp và cách duy nhất để ảnh hưởng đến chúng là thông qua e2fsprogs
các công cụ. Trong thực tế, man
trang không thực sự sử dụng thuật ngữ 'thuộc tính mở rộng' cho chúng, mà là 'thuộc tính tệp'. Các thuộc tính mở rộng 'Real' là các cặp tên / giá trị có thể được thay đổi bởi libattr
và được triển khai trên nhiều hệ thống tệp. Đây là những gì cp
và rsync
tìm kiếm và chuyển qua các tập tin sao chép khi các tùy chọn phù hợp được đưa ra. Tuy nhiên, dường như system
không gian tên tồn tại để ánh xạ các chattr
thuộc tính thành tên và cuối cùng là các thuộc tính tương đương trên các hệ thống tệp khác, nhưng hiện tại điều này không hoạt động.
Tôi đã để lại câu trả lời ban đầu nguyên vẹn vì có một số thông tin tốt ở đó, mặc dù nó đi khá xa ở các điểm.
Cập nhật 2
Tôi nên quay lại vấn đề này một lần nữa trước đây, nhưng theo câu trả lời này , nó chattr
hoạt động trên nhiều ext
hệ thống tập tin. Theo Wikipedia , nó tương đương với chflags
lệnh trên các hệ thống dựa trên BSD.
Tôi đã viết một tập lệnh để kiểm tra cài đặt và đọc các thuộc tính này trên một vài hệ thống tập tin và nhận được kết quả như sau:
ext4:
suS-iadAcj-t-e-- mnt/test_file
suSDiadAcj-tTe-- mnt/test_dir
reiserfs:
lsattr: Inappropriate ioctl for device While reading flags on mnt/test_file
lsattr: Inappropriate ioctl for device While reading flags on mnt/test_dir
xfs:
--S-iadA-------- mnt/test_file
--S-iadA-------- mnt/test_dir
btrfs:
--S-iadAc------C mnt/test_file
--SDiadAc------C mnt/test_dir
Lưu ý rằng tất cả các nỗ lực đọc / đặt reiserfs
cờ tệp đã đưa ra lỗi trên, mặc dù nó được liệt kê trên Wikipedia là có một số chức năng. Tôi đã không kiểm tra reiser4
. Ngoài ra trong khi c
cờ có thể được đặt trên ext4
nó không được vinh danh. Cũng có thể có các tùy chọn điều chỉnh / gắn kết ảnh hưởng đến các cờ này, nhưng tôi không thể tìm thấy bất kỳ.
Tuy nhiên, dường như hiện tại chattr
là tiện ích duy nhất trên Linux có khả năng sửa đổi các thuộc tính này và vì vậy không có tiện ích sao chép nào có khả năng bảo tồn chúng.
Câu trả lời gốc
Lý do rsync
dường như là thậm chí không thử. Từ -X
phần rsync
tài liệu:
For systems that support extended-attribute namespaces, a copy being done by a
super-user copies all namespaces except system.*. A normal user only copies
the user.* namespace.
Rất khó để ánh xạ các chữ cái thuộc tính được sử dụng bởi chattr
và lsattr
đến các thuộc tính được đặt tên cơ bản được sử dụng trong hệ thống tệp (đối với một không có danh sách trên internet). Từ các thử nghiệm của tôi, A
thuộc tính ánh xạ tới system.posix_acl_access
thuộc tính và vì đây là system
không gian tên, rsync
thậm chí sẽ không cố gắng sao chép nó.Hai không gian tên khác không được đề cập trong man
đoạn trích là trusted
và security
, các đặc quyền gốc được yêu cầu để đặt chúng (và rsync
sẽ không thử nếu không có).
Rất có thể các thuộc tính bạn đã cố gắng đặt nằm trong system
không gian tên mà rsync
bỏ qua (và có lẽ là khôn ngoan). Hoặc là hoặc bạn cần phải root để có được những cái không.
Đối với cp
, dường như có lỗi tại chơi.Chạy strace
tiếp cp -a
, tôi nhận được hai dòng thú vị sau:
fgetxattr(3, "system.posix_acl_access", 0x7fff5181c0e0, 132) = -1 ENODATA (No data available)
và
fsetxattr(4, "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff \x00\x04\x00\xff\xff\xff\xff", 28, 0) = 0
Đầu tiên, fgetxattr
cuộc gọi không trả về bất kỳ dữ liệu nào (có lẽ vì không có bất kỳ dữ liệu nào - sự tồn tại của thuộc tính là đủ), nhưng bằng cách nào đó cp
tìm thấy 28 byte dữ liệu (rác?) Để đặt làm giá trị thuộc tính trong tệp đích. Điều này có vẻ như là một lỗi trong cp
, nhưng đúng hơn là những gì gây ra vấn đề dường như là một lỗi trong libattr
khi fsetattr
cuộc gọi trả về 0
thành công mà không thực sự thiết lập thuộc tính.
Tôi nhận được hành vi này ext4
bất kể tôi gắn kết với user_xattr
. Tôi không thể tìm thấy bất kỳ tài liệu nào về điều này ngoài việc nói rằng 'một số hệ thống' cần tùy chọn gắn kết này để các thuộc tính mở rộng hoạt động. Dường như của tôi (Debian Jessie) thì không. Ngay cả có một vấn đề gắn kết tôi đã bỏ lỡ, nó là sai fsetattr
và do đó cp
để âm thầm thất bại.
Trên thực tế user_xattr
là cần thiết trên ext2
, ext3
, reiserfs
và có thể một số người khác. Nó không cần thiết choext4
Cũng lưu ý rằng các attr
công cụ setfattr
, getfattr
và attr
(sau này được ghi chép lại là chỉ dành cho XFS
duy nhất, nhưng dường như việc chỉ cũng như những người khác cho ext4
) có vấn đề làm việc trong bất cứ điều gì nhưng user
không gian tên. Tôi nhận được Operation not supported
nếu tôi cố gắng sử dụng setfattr
để đặt một thuộc tính trong system
không gian tên (hoặc không có không gian tên theo lỗi này ). setfattr
dường như thành công trong không gian tên trusted
và security
không gian, nhưng sau đó getfattr
không đọc được gì và cũng không đọc được gì từ system
không gian tên được đặt bởi chattr
. Lý do chattr
thành công là nó sử dụng một ioctl
cuộc gọi và không libattr
.
Mặc dù vậy, điều làm việc hoàn hảo là đặt các thuộc tính mở rộng trong user
không gian tên với setfattr
và sử dụng rsync
hoặc cp
sao chép nguyên vẹn chúng (thậm chí không có vấn đề gì cp
nếu bạn không chỉ định giá trị khi tạo thuộc tính). Tôi nghĩ điểm mấu chốt system
là hiện tại đang sử dụng các giá trị không gian tênlỗi và / hoặckhông được hỗ trợ, ít nhất là trong Debian và có lẽ các bản phân phối khác nữa. Có khả năng các rsync
nhà phát triển biết điều này, đó là lý do tại sao họ bỏ qua chúng.