폐쇄망으로 반입할 때 매체 용량이나 전송 도구의 파일 크기 제한에 걸리면 압축본을 여러 조각으로 나눈다. 리눅스에서는 split 으로 나누고 cat 으로 이어 붙이는 방식이 표준이다. 분할 방식이 두 가지라 어떻게 만들었는지에 따라 푸는 방법이 달라진다.
tar 의 출력을 파이프로 split 에 넘기면 중간 파일 없이 바로 조각이 만들어진다.
# gzip
tar czf - /opt/app | split -b 1G - app.tar.gz.part-
# xz (압축률이 높고 느리다)
tar cJf - /opt/app | split -b 1G - app.tar.xz.part-
# 이미 만들어 둔 파일을 나눌 때
split -b 1G app.tar.gz app.tar.gz.part-
app.tar.gz.part-aa, app.tar.gz.part-ab … 순으로 생긴다.
숫자 접미사가 필요하면 -d 를 준다. 조각이 100개를 넘을 수 있으면 -a 로 자릿수를 늘린다.
split -b 1G -d -a 3 app.tar.gz app.tar.gz.part-
줄 수로 나눌 수도 있다. 텍스트 로그를 쪼갤 때 쓴다.
split -l 100000 access.log access_
cat app.tar.gz.part-* > app.tar.gz
tar xzf app.tar.gz
중간 파일 없이 바로 풀 수도 있다.
cat app.tar.gz.part-* | tar xzf -
tar 의 f - 는 표준 입력에서 읽으라는 뜻이다.
조각 순서가 곧 정확성이다. 셸의 * 확장은 사전 순으로 정렬하므로 part-aa, part-ab 처럼 자릿수가 같은 이름이면 문제가 없다. 그러나 part-1, part-2, … part-10 처럼 자릿수가 다르면 part-10 이 part-2 앞에 와서 조용히 깨진 아카이브가 만들어진다. 이때는 정렬을 명시한다.
cat $(ls app.tar.gz.part-* | sort -V) > app.tar.gz
합친 뒤에는 원본과 해시를 대조한다.
sha256sum app.tar.gz
tar 에는 -M(--multi-volume)과 --tape-length 로 스스로 나누는 기능이 있다. 이 방식으로 만든 것은 cat 으로 합쳐지지 않는다. 조각마다 볼륨 헤더가 들어 있기 때문이다.
# 만들기
tar cvMf archive.tar -L 1048576 /opt/app
# 풀기 — 다음 볼륨을 물어보면 경로를 입력한다
tar xvMf archive.tar
멀티볼륨은 압축과 같이 쓸 수 없고(-z 와 -M 병행 불가) 되살리기도 번거롭다. 특별한 이유가 없으면 split 방식을 쓴다.
| 파일 이름 | 방식 | 푸는 법 |
|---|---|---|
x.tar.gz.part-aa, ...ab |
split | cat ... > x.tar.gz 뒤 tar xzf |
x.tar, x.tar.1, x.tar.2 |
tar 멀티볼륨 | tar xvMf x.tar |
x.7z.001, x.zip.001 |
7-Zip · 압축 도구 자체 분할 | 7z x x.7z.001 |
첫 조각의 형식을 직접 본다.
file app.tar.gz.part-aa
head -c 16 app.tar.gz.part-aa | od -c | head -2
gzip 이면 1f 8b, xz 면 fd 37 7a 58 5a, tar 본문이면 512바이트 헤더가 보인다.