로 복사 cp
하면 확장 된 속성은 명시 적으로도 유지되지 않습니다.
cp -a --preserve=all /source /dest
또는
cp -a --preserve=xattr /source /dest
동일하다 rsync
, 즉
rsync -aq -A -X --delete /source /dest
그러나 대상 파일 시스템에서 확장 속성을 수동으로 만들 수 있습니다 ( chattr
). 이는 대상 파일 시스템이 xattr을 지원함을 의미합니다.
이유는 보존 할 수없는 오전 xattr
과 cp
나 rsync
?
추가 정보:
- 소스 파일 시스템과 대상 파일 시스템 모두 ext4
- 소스 및 대상 파일 시스템 모두 로컬 (nfs 아님)
- 데비안 Wheezy를 사용하고 있습니다
답변
최신 정보
좀 더이와 장난과의 코드보고 후 chattr
다른 e2fsprogs
,에 의해 설정된 속성 분명하다 chattr
및 의하여 그 세트 libattr
(명령으로 예를 들어이 setfattr
) 매우 다릅니다. 단순히 명명 된 속성이나 네임 스페이스에 매핑되지 않는 파일 시스템 플래그를 chattr
설정 ext
합니다. 아무도 그들은 어떤 호출을 표시하지 libattr
의 ‘ listxattr
. 아마도 아래에 가정 된 것처럼 네임 스페이스의 명명 된 속성에 매핑 해야system
하지만 아직 완전히 구현되지 않았습니다. 또한 아래의 system.posix_acl_access
속성 중 하나에 대한 매핑으로 잘못 생각한 속성은 ext
파일 시스템 플래그와 관련이 없으며 액세스 제어 목록과 관련이 있습니다. 관련strace
메시지는 모든 파일에 대해 나타나고 cp --preserve=xattr
사용될 때만 사라집니다 .
설정 한 속성 chattr
은 ext
파일 시스템에만 적용되며 영향을 미치는 유일한 방법은 e2fsprogs
도구 를 사용하는 것 같습니다. 실제로 man
페이지는 실제로는 오히려 ‘파일 특성을’그들을 위해 용어 ‘확장 된 속성을’사용하지 않지만. ‘실제’확장 속성은 libattr
여러 파일 시스템에 의해 변경되고 구현 될 수있는 이름 / 값 쌍입니다 . 다음은 무엇 cp
과 rsync
모양을 위해 오른쪽 옵션이 부여 될 때 복사 된 파일까지 전송합니다. 그러나 system
네임 스페이스가 chattr
속성을 이름과 궁극적으로 다른 파일 시스템의 동등한 속성에 매핑하는 것으로 보이지만 현재는 작동하지 않습니다.
좋은 정보가 있기 때문에 원래 답변을 그대로 두었습니다.
업데이트 2
나는 지금까지 이것으로 다시 돌아 왔어 야했지만, 이 답변chattr
에 따라 단순한 ext
파일 시스템 이상 에서 작동합니다 . Wikipedia 에 따르면 chflags
BSD 기반 시스템 의 명령 과 동일 합니다.
몇 가지 파일 시스템에서 이러한 속성의 설정 및 읽기를 테스트하는 스크립트를 작성하고 다음 결과를 얻었습니다.
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
reiserfs
파일 플래그 를 읽거나 설정하려는 모든 시도 는 Wikipedia에 일부 기능이있는 것으로 표시되어 있지만 위의 오류가 발생했습니다. 나는 테스트하지 않았다 reiser4
. 또한 c
깃발을 세울 ext4
수는 있지만 명예는 없습니다. 이 플래그에 영향을주는 튜닝 / 마운트 옵션이있을 수 있지만 찾을 수 없습니다.
그러나 현재 chattr
Linux에서 이러한 속성을 수정할 수있는 유일한 유틸리티 인 것으로 보이 므로 복사 할 수있는 복사 유틸리티는 없습니다.
원래 답변
그 이유는 rsync
시도조차하지 않는 것 같습니다. 로부터 -X
의 섹션 rsync
문서 :
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.
그것은에 의해 사용되는 속성 문자 매핑하기 어렵다 chattr
및 lsattr
파일 시스템에 사용되는 기본이라는 속성에을 (하나 인터넷에 아무런 목록이 없습니다). 내 테스트에서 A
속성 은 속성에 매핑되며 system.posix_acl_access
이것이 system
네임 스페이스이므로 rsync
복사조차 시도하지 않습니다.man
스 니펫에 언급되지 않은 다른 두 네임 스페이스 는 trusted
및이며 security
,이를 설정하려면 루트 권한이 필요합니다 rsync
.
설정하려고 시도한 속성이 system
네임 스페이스에 포함 rsync
되어있을 가능성이 높습니다. 그렇지 않거나 그렇지 않은 것을 얻으려면 루트 여야합니다.
에 관해서는 실행 cp
, 버그가있는 것 같습니다.strace
에 cp -a
, 나는 다음과 같은 두 가지 흥미로운 라인을 얻을 :
fgetxattr(3, "system.posix_acl_access", 0x7fff5181c0e0, 132) = -1 ENODATA (No data available)
과
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
먼저 fgetxattr
호출은 데이터를 반환하지 않습니다 (아마도 존재하지 않기 때문에 속성이 충분하기 때문에) cp
대상 파일의 28 바이트 (정크?) 데이터를 속성 값으로 설정합니다. 이 버그 것 같아 cp
, 오히려 문제의 원인이 무엇에서 버그가 수 있도록 보인다 libattr
는 AS fsetattr
호출이 반환 0
실제로 속성을 설정하지 않고 성공.
로 ext4
마운트 여부 에 관계 없이이 동작을 얻 습니다 user_xattr
. ‘일부 시스템’에는 확장 속성이 작동하기 위해이 마운트 옵션이 필요하다고 말하는 것 외에 다른 문서를 찾을 수 없습니다. 겉보기에 내 (데비안 제시)는 그렇지 않습니다. 심지어 내가 놓친 장착에 문제가있다, 그것은 잘못이다 fsetattr
, 따라서 cp
자동으로 실패 할 수 있습니다.
사실 user_xattr
에 필요하다 ext2
, ext3
, reiserfs
그리고 아마도 몇 가지 다른 사람. 필요하지 않습니다ext4
있음을 유의하십시오 attr
도구 setfattr
, getfattr
그리고 attr
(후자만을위한 것으로 설명되어 XFS
뿐 아니라 업무 단지뿐만 아니라에 대한 다른 것 같다 ext4
) 아무 것도 있지만에서 작업 문제가 user
네임 스페이스를. 네임 스페이스에 속성을 넣거나 (이 버그에 따라 네임 스페이스가없는 Operation not supported
경우) 사용하려고하면 얻을 수 있습니다. 및 네임 스페이스 에서 성공한 것으로 보이지만 다시 읽지 못하고에서 설정 한 네임 스페이스 에서 아무것도 읽지 못합니다 . 성공한 이유 는 전화를 사용하고 전화를 사용하지 않기 때문 입니다.setfattr
system
setfattr
trusted
security
getfattr
system
chattr
chattr
ioctl
libattr
완벽하게 작동하는 것은 user
네임 스페이스 에서 확장 속성을 설정 하고 그대로 setfattr
사용 rsync
하거나 cp
그대로 cp
사용하는 것입니다 (속성을 만들 때 값을 지정하지 않으면 아무런 문제 가 없습니다). 결론은 system
네임 스페이스 값 을 사용하는 것이 현재버기 및 / 또는적어도 데비안과 다른 배포판에서는 지원되지 않습니다. rsync
개발자가이 사실을 알고있을 가능성이 높기 때문에이를 무시합니다.