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을 지원함을 의미합니다.

이유는 보존 할 수없는 오전 xattr과 cp나 rsync?

추가 정보:

  • 소스 파일 시스템과 대상 파일 시스템 모두 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사용될 때만 사라집니다 .

설정 한 속성 chattr은 ext파일 시스템에만 적용되며 영향을 미치는 유일한 방법은 e2fsprogs도구 를 사용하는 것 같습니다. 실제로 man페이지는 실제로는 오히려 '파일 특성을'그들을 위해 용어 '확장 된 속성을'사용하지 않지만. '실제'확장 속성은 libattr여러 파일 시스템에 의해 변경되고 구현 될 수있는 이름 / 값 쌍입니다 . 다음은 무엇 cp과 rsync모양을 위해 오른쪽 옵션이 부여 될 때 복사 된 파일까지 전송합니다. 그러나 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.

그것은에 의해 사용되는 속성 문자 매핑하기 어렵다 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경우) 사용하려고하면 얻을 수 있습니다. 및 네임 스페이스 에서 성공한 것으로 보이지만 다시 읽지 못하고에서 설정 한 네임 스페이스 에서 아무것도 읽지 못합니다 . 성공한 이유 는 전화를 사용하고 전화를 사용하지 않기 때문 입니다.setfattrsystemsetfattrtrustedsecuritygetfattrsystemchattrchattrioctllibattr

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

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