각각 크기가 50GB인 두 개의 파일 A와 B와 무시할 수 있는 크기의 약 100개 파일이 있다고 가정해 보겠습니다. 디스크 공간이 120GB밖에 없습니다(이 중 100GB는 파일 A와 B가 차지함). 파일 A와 B, 그리고 100개의 다른 파일을 포함하는 tar 아카이브를 만들고 싶습니다. 남은 디스크 공간이 20GB 미만인 경우에도 가능합니까?
tar 아카이브는 장기 클라우드 스토리지 솔루션(예: Amazon S3 Glacier Deep Archive, Google Cloud Archive Storage 등)에 업로드됩니다.
답변1
tar 아카이브는 장기 클라우드 스토리지 솔루션(예: Amazon S3 Glacier Deep Archive, Google Cloud Archive Storage 등)에 업로드됩니다.
아! 그래서 디스크에 tar 아카이브가 필요하지 않습니다!
대신 Amazon S3 또는 다른 곳에 업로드하는 동안 즉시 tar 아카이브를 생성할 수 있습니다. 게다가 당신은진짜용량에 따라 비용을 지불하므로 압축을 원합니다.
해결책은 매우 간단해야 합니다.
tar c fileA fileB | aws s3 cp s3://mybucket/backup.tar -
: : : : : :
: : : : : \- read data from stdin
: : : : \- How to call the object
: : : \- unix pipe: the stdout of the
: : : tar command becoms the stdin
: : : of the aws command.
: \-----\- files to be compressed
\--compression command
개인적으로 특히 아주 작은 파일이 수천 개 있다고 하면 tar
포맷에 따른 오버헤드가 매우 커집니다. 나는 사용하는 것이 좋습니다
tar c --zstd file1 file2 … file1000 | aws s3 cp s3://mybucket/backup.tar.zst -
즉시 데이터를 압축합니다. 클라우드 호스트에 업로드 시간과 유료 공간을 절약하고 일반적으로 여기에서 수행하는 것이 옳은 일입니다.
답변2
논평
이 솔루션은 나중에 질문자가 두 개의 큰 파일에 관한 것도 아니고 실제로 tar 아카이브를 로컬에 저장하는 것에 관한 것도 아니라고 지적했기 때문에 부적절합니다. 하지만 여전히 문제의 원래 제목이 해결되는 것을 보니 후세에 맡기겠다고 생각했습니다.
답변
따라서 문제는 다음과 같습니다. 파일 읽기를 완료할 때까지 파일이 사용하는 공간을 "해제"할 수 없으므로 tar
기본적으로 파일을 아카이브에 저장하는 표준 방법은 작동하지 않습니다.
- 첫 번째 파일의 속성(이름, 길이, 소유자 등)을 읽습니다.
- 이 정보를 포함하는 헤더를 .tar 파일의 0 위치에 씁니다. 헤더의 길이는 512바이트입니다.
- 헤더 뒤의 첫 번째 파일 내용을 복사하고 512바이트의 다음 배수로 0으로 채워집니다(0으로 채워짐).
- 두 번째 파일의 속성 읽기
- 첫 번째 파일 끝에 두 번째 파일의 헤더를 씁니다.
- 512 B의 다음 배수에 맞춰 정렬된 두 번째 파일의 내용을 복사합니다.
- 마지막으로 이 두 파일을 삭제하세요.
보시다시피 tar 아카이브는 매우 간단하게 연결할 수 있습니다. 안타깝게도 한 파일의 내용을 tar 아카이브에 복사한 다음 해당 파일을 삭제하고 다음 파일을 아카이브할 수도 없습니다. 첫 번째 파일 쓰기가 완료되기 전에 공간이 부족해지기 때문입니다(그리고 POSIX가 없습니다). 해당 문서를 자르는 방법)시작이미 읽은 문서의 일부). 따라서 위 Camille의 의견에 대한 접근 방식은 작동하지 않습니다.
따라서 파일 시스템이 재링크를 지원하지 않는 한부분파일에서는 불가능합니다. (현재 2021년 6월 기준으로 이 기능을 지원하는 Linux 파일 시스템은 XFS와 btrfs뿐입니다. 하지만 소프트웨어를 직접 작성해야 합니다. 살펴봐야 합니다. man ioctl_ficlonerange
사용된 메모리 파일을 공유할 수 있습니다. 원본 파일과 아카이브 파일로)
그러나 100GB tar 파일을 갖는 것 자체는 쓸모가 없는 것처럼 들립니다. 그걸로 무엇을 할 건가요? 다른 장치나 네트워크를 통해 복사할 수 있습니다.안 돼요본인이 직접 운전해야 합니다!
먼저 하드 드라이브에 tar 아카이브를 구축한 다음 복사하는 대신 즉시 tar 아카이브를 생성하면 됩니다. tar
결과를 파일, 블록 장치에 쓰는지는 상관하지 않습니다( tar
예시간원숭이아르곤어쨌든 향신료! ) 또는 네트워크 소켓.
그래서 자신이 하고 싶은 일이 불가능해지면 답답할 수도 있지만, 아마도 문제가 아닌 일을 해결하고 있다고 생각합니다.
¹ 파일이 모두 동일한 XFS 또는 btrfs 파일 시스템에 있고 an ioctl
이 무엇인지 알고 코드를 작성할 의지가 없는 경우