여러 폴더의 아카이브를 생성할 때 tar를 사용하여 하드 링크를 보존하는 방법은 무엇입니까?

여러 폴더의 아카이브를 생성할 때 tar를 사용하여 하드 링크를 보존하는 방법은 무엇입니까?

하위 폴더가 여러 개 있는데 그 중 일부에는 다른 하위 폴더에 대한 하드 링크가 포함되어 있습니다.

# mkdir /tmp/data
# mkdir /tmp/foo
# mkdir /tmp/foo/bar
# mkdir /tmp/foo/baz
# truncate -s 10M /tmp/foo/bar/file1
# ln /tmp/foo/bar/file1 /tmp/foo/baz/file1
# truncate -s 10M /tmp/foo/baz/file2
# ls -lah /tmp/foo/bar/
total 0
drwxrwxrwx 2 root root  60 Aug 18 13:22 ./
drwxrwxrwx 4 root root  80 Aug 18 13:22 ../
-rw-rw-rw- 2 root root 10M Aug 18 13:22 file1
# ls -lah /tmp/foo/baz/
total 0
drwxrwxrwx 2 root root  80 Aug 18 13:23 ./
drwxrwxrwx 4 root root  80 Aug 18 13:22 ../
-rw-rw-rw- 2 root root 10M Aug 18 13:22 file1
-rw-rw-rw- 1 root root 10M Aug 18 13:23 file2

루트 폴더의 tar를 생성하면 하드 링크가 유지됩니다.

# tar -cf /tmp/foo.tar /tmp/foo
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets
# tar -tvf /tmp/foo.tar
drwxrwxrwx root/root         0 2021-08-18 13:22 tmp/foo/
drwxrwxrwx root/root         0 2021-08-18 13:23 tmp/foo/baz/
-rw-rw-rw- root/root  10485760 2021-08-18 13:23 tmp/foo/baz/file2
-rw-rw-rw- root/root  10485760 2021-08-18 13:22 tmp/foo/baz/file1
drwxrwxrwx root/root         0 2021-08-18 13:22 tmp/foo/bar/
hrw-rw-rw- root/root         0 2021-08-18 13:22 tmp/foo/bar/file1 link to tmp/foo/baz/file1

그러나 각 하위 폴더에 대해 동일한 작업을 수행하면 tar가 첫 번째 아카이브에 이미 파일이 포함되어 있다는 것을 모르기 때문에 해당 폴더를 유지할 수 없습니다.

# tar -cf /tmp/bar.tar /tmp/foo/bar
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets
# tar -cf /tmp/baz.tar /tmp/foo/baz
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets
# tar -tvf /tmp/bar.tar
drwxrwxrwx root/root         0 2021-08-18 13:22 tmp/foo/bar/
-rw-rw-rw- root/root  10485760 2021-08-18 13:22 tmp/foo/bar/file1
# tar -tvf /tmp/baz.tar
drwxrwxrwx root/root         0 2021-08-18 13:23 tmp/foo/baz/
-rw-rw-rw- root/root  10485760 2021-08-18 13:23 tmp/foo/baz/file2
-rw-rw-rw- root/root  10485760 2021-08-18 13:22 tmp/foo/baz/file1

이 문제를 어떻게 해결할 수 있나요?

답변1

아카이브 외부의 다른 파일에 대한 하드 링크를 유지할 수 없습니다.

답변2

엄밀히 말하면 하드 링크는 다른 파일에 대한 링크가 아닙니다. 각 링크는 대상 inode를 가리키는 디렉토리 항목입니다. 따라서 파일 시스템에는 tmp/foo/bar/file1에 대한 링크 개념이 없습니다.tmp/foo/baz/file1

tar이러한 파일은 아카이브에 저장되는 경우 동일한 inode에 연결되며 공간 절약 최적화로 두 번째 및 후속 파일을 첫 번째 파일에 대한 링크로 저장합니다(이는 또한 다음 tar상태를 유지 하는 데 유용합니다). 아카이브의 시간은 복원될 수 있습니다). 이는 파일이 동시에 동일한 아카이브에 저장된 경우에만 발생합니다.

기술적으로 아카이브에 없는 파일에 대한 링크를 저장하는 아카이브를 생성하는 것이 가능합니다. 두 개의 파일로 아카이브를 생성한 다음 저장된 파일을 삭제합니다.파일로아카이브에서.

관련 정보