어떤 맥락에서 저는 루트가 아닌 사용자로 패키지 빌드를 지원하는 패키지 관리자와 유사한 유틸리티를 개발 중입니다. 아카이브를 사용 tar
하고 메타데이터를 무시하는 대신 루트로 빌드된 패키지가 루트가 아닌 패키지와 완전히 구별되지 않도록 하고 싶습니다 .
tar
아카이브 내의 파일과 디렉터리에 권한 비트, 타임스탬프, 소유권 관련 정보와 같은 메타데이터가 포함되지 않는(이상적으로는 포함할 수 없는) 형식/유틸리티가 있습니까 ? 나는 아카이브가 그 안에 있는 디렉토리와 파일, 그리고 파일 내용으로 완전히 설명되기를 원합니다(따라서 심볼릭 링크나 하드 링크도 저장할 수 없습니다).
또한 절대 경로와 상대 경로를 구분하지 않는 아카이브 형식도 괜찮습니다(즉, 아카이브 경로 개념이 Unix 경로와 다르기 때문에 동일한 것으로 /a/b
매핑됩니다 ).a/b
답변1
tar(또는 cpio)를 사용할 때 사용자 정보를 제거할 수 있는 방법은 없지만, 패키지를 만든 사람이 누구인지 구별하지 못하도록 강제할 수는 있습니다. 패키지를 만든 사용자를 구별하지 않도록 tar를 사용하고 일부 매개변수를 강제 적용합니다(참고자료 참조 man tar
).
-P
,--absolute-names
: tar가 선행 "/"를 제거하지 않도록 강제합니다(기본적으로 이 작업을 수행함). 명령줄에 절대 경로를 입력할 수 없는 경우 언급한 경로가 유지됩니다(원하는 루트 디렉터리에서 cd할 수 없는 경우 -C 또는 --change-directory를 사용해 보십시오).--owner
: 파일/디렉토리의 실제 소유자를 무시하고 사용자를 tar 파일에 강제로 저장합니다(예: --owner=root).--group
: 그룹을 tar 파일에 강제로 저장합니다(예: --group=root).--no-acls
: tar 파일에 자체 ACL이 중복되지 않도록 하세요.--numeric-owner
,--numeric-group
: UID/GID만 로컬에 저장된 계정의 실제 이름을 마스킹합니다(루트가 항상 0이므로 루트를 강제하는 경우에는 필요하지 않음).--mtime
: 실제로 수정되었을 때 모든 파일/디렉터리의 수정 시간을 강제로 마스크합니다.
절대 경로가 있는 심볼릭 링크는 있는 그대로 저장됩니다. 그러나 패키지 트리 내부를 가리킬 때는 항상 상대 심볼릭 링크를 사용하는 것이 가장 좋습니다.
답변2
내가 찾은 최고는 다음과 같습니다.
- 파일 목록 정렬
- 소유자와 그룹을 나타내려면 숫자 0을 사용하십시오.
- 소유자를 위해 제거 및 비트
r
, 그리고w
모두다른 사람의 권한 mtime
UNIX 에포크에서는 수정될 예정입니다.
find <files> -print0 \
| sort -z \
| tar -cf <output>.tar \
--format=posix \
--numeric-owner \
--owner=0 \
--group=0 \
--mode="go-rwx,u-rw" \
--mtime='1970-01-01' \
--no-recursion \
--null \
--files-from -
나는 이것에 대해 더 많은 글을 썼습니다:http://h2.jaguarpaw.co.uk/posts/reproducible-tar/