cp / rsync로 확장 된 속성 유지


12

로 복사 cp하면 확장 된 속성은 명시 적으로도 유지되지 않습니다.

cp -a --preserve=all /source /dest

또는

cp -a --preserve=xattr /source /dest

동일하다 rsync, 즉

rsync -aq -A -X --delete /source /dest

그러나 대상 파일 시스템에서 확장 속성을 수동으로 만들 수 있습니다 ( chattr). 이는 대상 파일 시스템이 xattr을 지원함을 의미합니다.

이유는 보존 할 수없는 오전 xattrcprsync?

추가 정보:

  • 소스 파일 시스템과 대상 파일 시스템 모두 ext4
  • 소스 및 대상 파일 시스템 모두 로컬 (nfs 아님)
  • 데비안 Wheezy를 사용하고 있습니다

이 대상 파일 시스템을 어떻게 마운트합니까? NFS를 통해입니까?
slm

대상 파일 시스템은 로컬 파일 시스템입니다
마틴 Vegter

mount이 파일 시스템 의 출력을 보여줄 수 있습니까 ?
slm

1
어떤 유닉스 변형과 버전에? 마운트 옵션과 함께 양쪽 끝에 어떤 파일 시스템 유형이 있습니까?
Gilles 'SO- 악의를 멈춰라'

1
@MartinVegter 파일에 샘플 속성을 부여 할 수 있습니까? 방금 두 파일로 ext4 파일 시스템을 만들고로 테스트했습니다 setfattr -n system.name0 -v "value" test_file. test_fileext4 / jfs / xfs와 to / to를 복사하고 cp --preserve=all확장 된 속성을 보존하는 데 아무런 문제가 없었습니다.
UVV

답변:


14

최신 정보

좀 더이와 장난과의 코드보고 후 chattr다른 e2fsprogs,에 의해 설정된 속성 분명하다 chattr및 의하여 그 세트 libattr(명령으로 예를 들어이 setfattr) 매우 다릅니다. 단순히 명명 된 속성이나 네임 스페이스에 매핑되지 않는 파일 시스템 플래그를 chattr설정 ext합니다. 아무도 그들은 어떤 호출을 표시하지 libattr의 ' listxattr. 아마도 아래에 가정 된 것처럼 네임 스페이스의 명명 된 속성에 매핑 해야system 하지만 아직 완전히 구현되지 않았습니다. 또한 아래의 system.posix_acl_access속성 중 하나에 대한 매핑으로 잘못 생각한 속성은 ext파일 시스템 플래그와 관련이 없으며 액세스 제어 목록과 관련이 있습니다. 관련strace메시지는 모든 파일에 대해 나타나고 cp --preserve=xattr사용될 때만 사라집니다 .

설정 한 속성 chattrext파일 시스템에만 적용되며 영향을 미치는 유일한 방법은 e2fsprogs도구 를 사용하는 것 같습니다. 실제로 man페이지는 실제로는 오히려 '파일 특성을'그들을 위해 용어 '확장 된 속성을'사용하지 않지만. '실제'확장 속성은 libattr여러 파일 시스템에 의해 변경되고 구현 될 수있는 이름 / 값 쌍입니다 . 다음은 무엇 cprsync모양을 위해 오른쪽 옵션이 부여 될 때 복사 된 파일까지 전송합니다. 그러나 system네임 스페이스가 chattr속성을 이름과 궁극적으로 다른 파일 시스템의 동등한 속성에 매핑하는 것으로 보이지만 현재는 작동하지 않습니다.

좋은 정보가 있기 때문에 원래 답변을 그대로 두었습니다.

업데이트 2

나는 지금까지 이것으로 다시 돌아 왔어 야했지만, 이 답변chattr 에 따라 단순한 ext파일 시스템 이상 에서 작동합니다 . Wikipedia 에 따르면 chflagsBSD 기반 시스템 의 명령 과 동일 합니다.

몇 가지 파일 시스템에서 이러한 속성의 설정 및 읽기를 테스트하는 스크립트를 작성하고 다음 결과를 얻었습니다.

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수는 있지만 명예는 없습니다. 이 플래그에 영향을주는 튜닝 / 마운트 옵션이있을 수 있지만 찾을 수 없습니다.

그러나 현재 chattrLinux에서 이러한 속성을 수정할 수있는 유일한 유틸리티 인 것으로 보이 므로 복사 할 수있는 복사 유틸리티는 없습니다.

원래 답변

그 이유는 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.

그것은에 의해 사용되는 속성 문자 매핑하기 어렵다 chattrlsattr파일 시스템에 사용되는 기본이라는 속성에을 (하나 인터넷에 아무런 목록이 없습니다). 내 테스트에서 A속성 은 속성에 매핑되며 system.posix_acl_access이것이 system네임 스페이스이므로 rsync복사조차 시도하지 않습니다.man스 니펫에 언급되지 않은 다른 두 네임 스페이스 는 trusted및이며 security,이를 설정하려면 루트 권한이 필요합니다 rsync.

설정하려고 시도한 속성이 system네임 스페이스에 포함 rsync되어있을 가능성이 높습니다. 그렇지 않거나 그렇지 않은 것을 얻으려면 루트 여야합니다.

에 관해서는 cp, 버그가있는 것 같습니다.실행 stracecp -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경우) 사용하려고하면 얻을 수 있습니다. 및 네임 스페이스 에서 성공한 것으로 보이지만 다시 읽지 못하고에서 설정 한 네임 스페이스 에서 아무것도 읽지 못합니다 . 성공한 이유 는 전화를 사용하고 전화를 사용하지 않기 때문 입니다.setfattrsystemsetfattrtrustedsecuritygetfattrsystemchattrchattrioctllibattr

완벽하게 작동하는 것은 user네임 스페이스 에서 확장 속성을 설정 하고 그대로 setfattr사용 rsync하거나 cp그대로 cp사용하는 것입니다 (속성을 만들 때 값을 지정하지 않으면 아무런 문제 가 없습니다). 결론은 system네임 스페이스 값 을 사용하는 것이 현재버기 및 / 또는적어도 데비안과 다른 배포판에서는 지원되지 않습니다. rsync개발자가이 사실을 알고있을 가능성이 높기 때문에이를 무시합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.