XZ(1) | XZ 유틸리티 | XZ(1) |
xz, unxz, xzcat, lzma, unlzma, lzcat - .xz 파일과 .lzma 파일을 압축 또는 압축 해제합니다
xz [fI옵션...] [<파일>...]
unxz 명령은 xz --decompress
명령과 동일합니다.
xzcat 명령은 xz --decompress --stdout
명령과 동일합니다.
lzma 명령은 xz --format=lzma
명령과 동일합니다.
unlzma 명령은 xz --format=lzma --decompress
명령과 동일합니다.
lzcat 명령은 xz --format=lzma --decompress
--stdout 명령과
동일합니다.
파일 압축을 해제해야 하는 셸 스크립트를 작성할 때, unxz 와 xzcat 이름 대신 xz 명령과 적절한 인자 값(xz -d 또는 xz -dc)의 사용을 추천드립니다.
xz는 gzip(1) 과 bzip2(1) 과 비슷한 명령행 문법을 지닌 범용 데이터 압축 도구입니다. 자체 파일 형식은 .xz 형식이나, LZMA 유틸리티에서 사용하는 예전 .lzma 형식과 형식 헤더가 없는 RAW 압축 스트림도 지원합니다. 게다가, lzip에서 활용하는 .lz 형식 압축 해제도 지원합니다.
각 파일 에 대한 xz 압축 또는 압축 해제는 선택 동작 모드에 따릅니다. <파일> 값이 주어졌거나 <파일> 값이 -이면, xz 명령에서 표준 입력을 읽고 처리한 데이터를 표준 출력에 기록합니다. xz 에서는 터미널에서 활용할 경우 압축 데이터를 표준 압축으로 기록하는 동작을 거절(오류를 출력하고 <파일>을 건너뜀)합니다. 이와 비슷하게, xz 유틸리티를 터미널에서 실행하면 표준 입력의 압축 데이터 읽기를 거절합니다.
--stdout 을 지정하지 않는 한, -가 아닌 <파일>을 원본 <파일> 이름에서 가져온 새 파일 이름으로 기록합니다:
대상 파일이 이미 있으면, 오류를 나타내고 <파일>을 건너뜁니다.
표준 출력으로 기록하기 전에는, xz는 경고를 나타내며, 다음 조건에 만족할 경우 <파일>을 건너뜁니다:
<파일> 의 압축 또는 압축 해제를 성공하고 나면, xz는 소유자, 소유그룹, 권한, 접근 시각, 수정 시각 정보를 원본 <파일>에서 대상 파일로 그대로 복사합니다. 그룹 정보 복사에 실패하면, 권한을 수정하여 원본 <파일>에 접근 권한이 없는 사용자가 대상 파일로 접근하지 못하게 합니다. xz는 아직 접근 제어 목록이나 확장 속성 등의 기타 메타데이터를 복사하는 기능은 지원하지 않습니다.
대상 파일을 온전히 닫고 나면, --keep 옵션을 지원하지 않았을 경우 원본 <파일>을 제거합니다. 원본 <파일>은 출력을 표준 출력으로 기록했거나 오류가 발생했을 경우 제거하지 않습니다.
xz 프로세스에 SIGINFO 시그널 또는 SIGUSR1 시그널을 보내면 표준 출력으로 진행 정보를 출력합니다. 표준 오류가 터미널일 경우일 경우에만 제한하며 --verbose 옵션을 지정하면 진행 표시줄을 자동으로 나타냅니다.
xz 메모리 사용은 수백 킬로바이트로 시작하여 수 기가바이트까지 압축 설정에 따라 다릅니다. 압축 해제 프로그램이 필요로 하는 메모리 공간을 결정하는 파일 압축시에 설정 값을 활용합니다. 보통 압축 해제 프로그램은 파일을 만들 때, 압축 프로그램 메모리 사용량의 5% 에서 20% 정도 필요합니다. 예를 들면, xz -9로 압축한 파일 압축 해제시 현재 65MiB 메모리 용량이 필요합니다. 여전하게도, 압축 해제시 수 기가 바이트의 메모리가 필요한 .xz 파일에도 가능한 이야기입니다.
특히 이전 시스템 사용자의 경우 메모리 사용량이 엄청나게 늘어나는 점에 짜증이 날 수 있습니다. 이런 불편한 상황을 피하기 위해, xz에 기본적으로 비활성 상태인 내장 메모리 사용 제한 기능을 넣었습니다. 일부 운영체제에서 처리 중 메모리 사용을 제한하는 수단을 제공하긴 하지만, 여기에 의지하기에는 충분히 유연하지 않습니다(예를 들면, ulimit(1)을 사용하면 가상 메모리를 제한하여 mmap(2)을 먹통으로 만듭니다).
메모리 사용 제한 기능은 --memlimit=<제한용량> 명령행 옵션으로 사용할 수 있습니다. 종종 XZ_DEFAULTS=--memlimit=150MiB와 같이 XZ_DEFAULTS 환경 변수를 설정하여 제한 기능을 켜는게 더 편합니다. --memlimit-compress=<제한용량> 옵션과 --memlimit-decompress=<제한용량> 옵션을 활용하여 압축 및 압축 해제시 별도로 한계 값을 설정할 수 있습니다. 이 두 가지 옵션의 XZ_DEFAULTS 환경 변수 밖에서의 사용은, xz를 단일 실행할 때 압축 및 압축 해제 동작을 동시에 수행하지 않으며, 앞서 언급한 두가지 옵션을 명령행에 입력하기에는 --memlimit=<제한용량>(또는 -M <제한용량>)이 더 짧기 때문에 별로 쓸모가 없습니다.
압축 해제시 메모리 사용 제한 지정 한계를 초과하면, xz 유틸리티에서 오류를 나타내며 파일 압축 해제는 실패합니다. 압축을 실행할 때 사용 제한 지정 한계를 넘어서면 xz에서는 설정 값을 줄여서 어쨌든 한계를 넘지 못하게 합니다(--format=raw 옵션 또는 --no-adjust 옵션 사용시 제외). 설정 한계 값이 엄청 작지 않은 이상 이 방식대로 처리하면 어쨌든 실패하지 않습니다. 설정 값조정은 압축 래벨 사전 설정과 일치하지 않을 때 단계적으로 진행하는데, 이를테면, xz -9 명령 수행에 필요한 양보다 한계 값이 약간 작으면, 설정 값을 xz -8에 못미치게 약간 줄여서 진행합니다.
.xz 파일을 있는 그대로 합칠 수 있습니다. xz는 .xz 파일을 단독 파일일 때 처럼 압축해제합니다.
결합 부분과 마지막 부분 뒤에 패딩을 추가할 수 있습니다. 패딩은 널 바이트로 구성해야 하며 패딩 길이는 4바이트로 구성해야 합니다. 512 바이트 블록으로 파일 크기를 이루는 매체에 .xz 파일을 저장했을 경우에 요긴할 수 있습니다.
.lzma 파일 또는 원시 스트림의 경우 결합과 패딩을 허용하지 않습니다.
정수 인자값이 필요한 대부분 위치에서는, 큰 정수값을 나타내기 쉽게 하도록 추가 접미사를 지원합니다. 정수와 접미사 사이에 어떤 공백이 있으면 안됩니다.
특수 값 max는 옵션에서 지원하는 정수 최대 값을 나타낼 때 사용할 수 있습니다.
여러 동작 모드를 보여드리겠습니다만, 마지막에 주어진 동작 모드로 동작합니다.
Preset | DictSize | CompCPU | CompMem | DecMem |
-0 | 256 KiB | 0 | 3 MiB | 1 MiB |
-1 | 1 MiB | 1 | 9 MiB | 2 MiB |
-2 | 2 MiB | 2 | 17 MiB | 3 MiB |
-3 | 4 MiB | 3 | 32 MiB | 5 MiB |
-4 | 4 MiB | 4 | 48 MiB | 5 MiB |
-5 | 8 MiB | 5 | 94 MiB | 9 MiB |
-6 | 8 MiB | 6 | 94 MiB | 9 MiB |
-7 | 16 MiB | 6 | 186 MiB | 17 MiB |
-8 | 32 MiB | 6 | 370 MiB | 33 MiB |
-9 | 64 MiB | 6 | 674 MiB | 65 MiB |
Preset | DictSize | CompCPU | CompMem | DecMem |
-0e | 256 KiB | 8 | 4 MiB | 1 MiB |
-1e | 1 MiB | 8 | 13 MiB | 2 MiB |
-2e | 2 MiB | 8 | 25 MiB | 3 MiB |
-3e | 4 MiB | 7 | 48 MiB | 5 MiB |
-4e | 4 MiB | 8 | 48 MiB | 5 MiB |
-5e | 8 MiB | 7 | 94 MiB | 9 MiB |
-6e | 8 MiB | 8 | 94 MiB | 9 MiB |
-7e | 16 MiB | 8 | 186 MiB | 17 MiB |
-8e | 32 MiB | 8 | 370 MiB | 33 MiB |
-9e | 64 MiB | 8 | 674 MiB | 65 MiB |
개별 필터 체인은 사전 설정에 엮인 설정에 의존하는 대신 압축 설정을 세부적으로 하나하나 설정할 수 있게 합니다. 개별 필터 체인을 지정하면, 명령행에 앞서 지정한 사전 설정 옵션(-0 ... -9 과 --extreme)은 무시합니다. 사전 설정 옵션을 하나 이상의 필터 체인 옵션 다음에 지정하면, 새 사전 설정을 취하며, 앞서 지정한 개별 필터 체인 옵션은 무시합니다.
필터 체인은 명령행 파이핑에 비교할 수 있습니다. 압축할 때, 압축하지 않은 입력을 첫번째 필터로 놓고, 출력 대상(이 있으면)을 다음 필터로 지정합니다. 최종 필터의 출력은 압축 파일로 기옥합니다. 체인의 최대 필터 수는 4이지만, 필터 체인상 필터 갯수는 보통 1~2개입니다.
수많은 필터가 필터 체인 상에서 제약점을 가지고 있습니다. 일부 필터는 체인의 마지막 필터로만 동작하며, 일부 다른 필터는 마지막이 아닌 필터로, 어떤 동작은 체인의 어떤 위치에든 둡니다. 필터에 따라, 이 제한은 필터 설계를 따르거나 보안 문제를 막기 위해 존재하기도 합니다.
개별 필터 체인은 필터 체인에서 원하는 순서대로 하나 이상의 필터 옵션을 사용하여 지정합니다. 이는, 필터 옵션 순서가 중요하다는 뜻입니다! 원시 스트림을 디코딩할 때(--format=raw), 필터 체인은 압축할 때 지정했던 동일한 순서대로 지정합니다.
필터는 쉼표로 구분하는 필터별 <옵션>이 있습니다. <옵션>에 추가로 입력한 쉼표는 무시합니다. 모든 옵션 값에는 기본값이 있어, 값을 바꾸려면 지정해야합니다.
전체 필터 체인과 <옵션>을 보려면 xz -vv (--verbose 두 번)명령을 사용하십시오. 이 명령은 사전 설정이 사용하는 필터 체인 옵션도 볼 수 있습니다.
필터 | 정렬 | 참고 |
x86 | 1 | 32-bit 또는 64-bit x86 |
ARM | 4 | |
ARM-Thumb | 2 | |
ARM64 | 4 | 4096 바이트 정렬이 가장 좋습니다 |
PowerPC | 4 | 빅엔디안 전용 |
IA-64 | 16 | Itanium |
SPARC | 4 |
로봇 모드는 --robot 옵션으로 동작합니다. xz 출력을 다른 프로그램에서 해석하기 쉽게 해줍니다. 현재로서는 --robot 옵션은 --version, --info-memory, --list 옵션하고만 사용할 수 있습니다. 앞으로는 압축 및 압축 해제 동작에 대해서도 지원합니다.
xz --robot --version 은 xz 버전 번호와 liblzma 버전 번호를 다음 형식으로 나타냅니다:
XZ_VERSION=XYYYZZZS
LIBLZMA_VERSION=XYYYZZZS
xz 명령과 liblzma이 동일한 XZ 유틸리티 릴리스에서 나왔다면 두 행의 XYYYZZZS 값은 같습니다.
예제: 4.999.9beta는 49990091이며, 5.0.0은 50000002입니다.
xz --robot --info-memory 명령은 탭으로 나뉜 컬럼 셋의 단일 행을 나타냅니다:
차후, xz --robot --info-memory 출력에는 더 많은 내용이 들어가지만, 한 줄 이상은 넘어가지 않습니다.
xz --robot --list 명령은 탭으로 구분한 출력 형태를 활용합니다. 모든 행의 첫번째 컬럼에는 해당 행에서 찾을 수 있는 정보의 형식을 나타냅니다:
파일 행 컬럼:
스트림 행 컬럼:
블록 행 컬럼:
--verbose를 두 번 지정하면, 추가 컬럼을 블록 행에 넣습니다. --verbose 단일 지정시에는 이 정보를 볼 때 탐색을 여러번 수행해야 하기 때문에 실행 과정이 느려질 수 있어서 나타내지 않습니다.
요약 행 컬럼:
xz 5.1.2alpha 부터:
총계 행 컬럼:
--verbose 옵션을 두 번 지정하면, 총계 행에 추가 컬럼이 들어갑니다:
xz 5.1.2alpha 부터:
차후 버전에서는 새 행 형식을 추가하고 기존 행 형식에 추가할 수 있는 새 컬럼을 넣기 까지는 알 수 있겠지만, 기존 컬럼은 바꾸지 않을 예정입니다.
표준 오류에 출력하는 알림(경고 또는 오류 아님)는 종료 상태에 영향을 주지 않습니다.
xz는 빈칸으로 구분한 옵션 값 목록을 XZ_DEFAULTS, XZ_OPT 환경 변수에서 순서대로, 명령행에서 옵션을 해석하기 전에 불러옵니다. 참고로 환경 변수에서 옵션만 해석하며, 옵션이 아닌 부분은 조용히 무시합니다. 해석은 getopt_long(3)으로 가능하며, 명령행 인자로 활용하기도 합니다.
XZ_OPT=-2v tar caf foo.tar.xz foo
XZ_OPT=${XZ_OPT-"-7e"} export XZ_OPT
xz의 명령행 문법은 실제로 LZMA 유틸리티 4.32.x에서 찾을 수 있는 lzma, unlzma lzcat의 상위 집합입니다. 대부분의 경우 LZMA 유틸리티를 XZ 유틸리티로 기존에 작성한 스크립트를 깨지 않고도 바꿀 수 있습니다. 몇가지 비호환성 문제 때문에 문제가 일어날 수는 있습니다.
압축 수준 사전 설정의 번호 부여 방식은 xz와 LZMA 유틸리티가 동일하지 않습니다. 가장 중요한 차이는 다른 사전 설정에 대해 딕셔너리 크기를 어떻게 대응했느냐 여부입니다. 딕셔너리 크기는 압축 해제시 메모리 사용량과 거의 비슷합니다.
단계 | xz | LZMA 유틸리티 |
-0 | 256 KiB | 없음 |
-1 | 1 MiB | 64 KiB |
-2 | 2 MiB | 1 MiB |
-3 | 4 MiB | 512 KiB |
-4 | 4 MiB | 1 MiB |
-5 | 8 MiB | 2 MiB |
-6 | 8 MiB | 4 MiB |
-7 | 16 MiB | 8 MiB |
-8 | 32 MiB | 16 MiB |
-9 | 64 MiB | 32 MiB |
딕셔너리 크기 차이는 압축 프로그램 메모리 사용에 영향을 주지만, LZMA 유틸리티와 XZ 유틸리티에서 사용량이 늘어나는 다른 차이점이 있습니다:
단계 | xz | LZMA 유틸리티 4.32.x |
-0 | 3 MiB | 없음 |
-1 | 9 MiB | 2 MiB |
-2 | 17 MiB | 12 MiB |
-3 | 32 MiB | 12 MiB |
-4 | 48 MiB | 16 MiB |
-5 | 94 MiB | 26 MiB |
-6 | 94 MiB | 45 MiB |
-7 | 186 MiB | 83 MiB |
-8 | 370 MiB | 159 MiB |
-9 | 674 MiB | 311 MiB |
XZ 유틸리티의 기본 사전 설정 수준값은 -6이지만 LZMA 유틸리티의 기본 사전 설정 수준값은 -7입니다. 두 프로그램의 딕셔너리 메모리 기본 사용량은 8MiB입니다.
파일을 압축하지 않은 크기는 .lzma 헤더에 저장합니다. LZMA 유틸리티는 일반 파일을 압축할 때 압축하지 않은 파일의 크기를 저장합니다. 이 대신 압축하지 않은 크기를 '알 수 없음' 으로 저장하고 압축 해제 프로그램이 멈춰야 할 지점에 end-of-payload 마커를 사용하는 방법도 있습니다. LZMA 유틸리티는 파이프로 들어온 입력과 같이 압축하지 않은 파일의 크기를 알 수 없을 때 이런 방식을 활용합니다.
xz는 .lzma 파일을 end-of-payload 마커의 유무와 관계없이 압축 해제 방식을 모두 지원하지만, xz로 만든 모든 .lzma 파일은 end-of-payload 마커를 사용하며, .lzma 헤더에 압축하지 않은 파일 크기를 '알 수 없음'으로 표기합니다. 이 방식은 드문 상황에서 문제를 야기할 수 있습니다. 예를 들면, 임베디드 장치의 .lzma 압축 해제 프로그램은 압축을 해제했을 때 크기를 알아야 동작합니다. 이 문제를 만나면, LZMA 유틸리티 또는 LZMA SDK를 활용하여 .lzma 파일에 압축 전 파일 크기 정보를 저장해야합니다.
.lzma 형식은 lc 값을 8까지 받아들이며, lp 값은 4까지 받아들입니다. LZMA 유틸리티는 어떤 lc 값과 lp 값을 받아들이고도 압축을 해제할 수 있지만, 파일을 만들 때는 늘 lc=3 값과 lp=0 값을 활용합니다. 다른 lc 값과 lp 값으로의 파일 압축은 xz와 LZMA SDK에서만 가능합니다.
liblzma의 LZMA1 필터 구현체에서는 lc 값과 lp 값의 합이 4를 넘어가면 안됩니다. 그래서 .lzma 파일의 경우 이 제한을 넘어가면 xz로 압축을 해제할 수 없습니다.
LZMA 유틸리티는 2^n (2의 승수)크기를 지닌 딕셔너리를 가진 .lzma 파일만 만들지만 받아들이는 파일의 딕셔너리 크기는 어떤 크기든 상관 없습니다. liblzma에서는 2^n, 2^n + 2^(n-1) 딕셔너리 크기를 가진 .lzma 파일 만 받아들입니다. 이로 인해 .lzma 파일을 확인할 때 거짓 양성율이 늘어납니다.
모든 .lzma 파일을 liblzma 에서 받아들일 수 있도록 압축하기 때문에 이 제한이 실제로는 문제가 되지 않습니다.
압축 해제할 때, LZMA 유틸리티는 .lzma 스트림 처음 부분 다음 나머지를 다 조용히 무시합니다. 대부분의 경우, 버그입니다. LZMA 유틸리티에서 .lzma 결합 파일 압축 해제를 지원하지 않음을 의미하기도 합니다.
.lzma 스트림 처음부분 바로 다음에 데이터가 남아있을 경우, xz 에서는 --single-stream 옵션을 사용하지 않으면 깨진 파일로 간주합니다. 이 동작으로 하여금 뒤따라오는 쓰레기 값을 무시하도록 간주하는 애매한 스크립트 동작을 깰 수가 있습니다.
압축하지 않은 입력 파일로부터 얻어낸 정확한 압축 출력 결과물은 압축 옵션이 완전히 동일하더라도 XZ 유틸리티의 버전에 따라 달라질 수 있습니다. 파일 형식에 영향을 주지 않고 인코더 그 자체를 개선(더 빠르게 하거나 더 나은 압축율로)하기 때문입니다. XZ 유틸리티 버전이 동일하더라도 빌드 옵션을 달리하여 빌드 상태가 제각각인 경우 출력 결과물이 달라질 수 있습니다.
--rsyncable 기능을 넣었을 경우 동일한 xz 버전에서 이전 파일과 새 파일로 별도로 압축하지 않는 한 결과 파일을 (두 파일이 서로 다른 파일이 아니므로) rsync 처리할 필요가 없습니다. 이 문제는 인코더 구현체 기능 개발이 끝나서 xz 버전이 다르더라도 안정적인 rsync 가능한 출력 결과물을 유지할 수 있을 때여야 해결할 수 있습니다.
XZ 임베디드와 같은 내장 .xz 압축 해제 구현체는 지원 파일의 무결성 검사 형식을 none과 crc32 이외의 설정으로 만들 필요가 없습니다. 기본값이 --check=crc64일 경우에만, 임베디드 시스템에서 파일을 만들 때 --check=none 또는 --check=crc32 옵션을 사용해야합니다.
임베디드 시스템이 아니라면, 모든 .xz 형식 압축 해제 프로그램에서는 모든 검사 형식을 지원하거나, 일부 검사 방식을 지원하지 않는다면, 최소한, 무결성 검사로 검증하지 않고 압축을 해제할 수 있습니다.
XZ 임베디드는 BCJ 필터를 지원하지만, 기본 시작 오프셋만 지정할 수 있습니다.
foo 파일을 기본 압축 수준 (-6) 으로 foo.xz 파일에 압축해 넣고, 압축 과정이 무사히 끝나면 foo를 삭제합니다:
xz foo
bar.xz를 bar 에 압축을 해제한 후 압축 해제가 무사히 끝나도 bar.xz를 삭제하지 않습니다:
xz -dk bar.xz
기본 사전 설정 -6 보다는 느리지만, 압축 및 압축 해제시 메모리를 적게 차지(각각 48 Mib, 5B)는 -4e 사전 설정(-4 --extreme)을 활용하여 baz.tar.xz 파일을 만듭니다:
tar cf - baz | xz -4e > baz.tar.xz
압축 및 비압축 파일을 단일 명령으로 표준 출력에 압축해제할 수 있습니다:
xz -dcf a.txt b.txt.xz c.txt d.txt.lzma > abcd.txt
GNU와 *BSD에서는 find(1) 명령과 xargs(1) 명령으로 여러 파일의 압축을 병렬 처리할 수 있습니다:
find . -type f \! -name '*.xz' -print0 \ | xargs -0r -P4 -n16 xz -T1
xargs(1) 의 -P 옵션으로 xz 프로세스의 병렬 처리 갯수를 지정합니다. -n 옵션의 최적 값은 압축할 파일 수에 달려있습니다. 압축할 파일이 몇개밖에 없다면 1이어야합니다. 파일이 수천 수만개 정도 된다면 xargs(1) 이 어쨌든지간에 만들어낼 xz 프로세스의 겟수를 100으로 하거나 아니면 적당한 값을 지정하여 줄이는게 좋습니다.
xz에 -T1옵션을 지정하면 단일-스레드 모드로 강제합니다. xargs(1) 에서 병렬 처리 갯수를 제어할 수 있기 때문입니다.
여러 파일을 압축한 후 저장할 바이트 용량을 계산합니다:
xz --robot --list *.xz | awk '/^totals/{print $5-$4}'
이 스크립트에서는 충분히 최신의 xz 명령을 사용하는지 알아보려 합니다. 다음 sh(1) 스크립트에서는 xz 도구의 버전 번호가 최소한 5.0.0인지 여부를 검사합니다. 이 방식은 --robot 옵션을 지원하지 않는 오래된 베타 버전과도 호환성이 있습니다:
if ! eval "$(xz --robot --version 2> /dev/null)" || [ "$XZ_VERSION" -lt 50000002 ]; then echo "Your xz is too old." fi unset XZ_VERSION LIBLZMA_VERSION
XZ_OPT 환경 변수로 압축 해제시 메뢰 사용량 한계를 설정하지만, 한계 값을 이미 설정했다면, 값을 늘리지 않습니다:
NEWLIM=$((123 << 20)) # 123 MiB OLDLIM=$(xz --robot --info-memory | cut -f3) if [ $OLDLIM -eq 0 -o $OLDLIM -gt $NEWLIM ]; then XZ_OPT="$XZ_OPT --memlimit-decompress=$NEWLIM" export XZ_OPT fi
개별 설정 필터 체인의 초단순 사용방식은 LZMA2 사전 설정 값을 별도로 설정하는 방식입니다. 사전 설정은 잠재적으로 쓸만한 압축 설정 조합만 다루기 때문에 꽤 쓸모가 있을 수도 있습니다.
-0 ... -9 옵션의 설명에서 테이블의 CompCPU 컬럼과 --extreme 옵션은 LZMA2 사전 설정을 개별적으로 맞췄을 때 쓸만할 수도 있습니다. 여기 관련내용을 테이블 둘로 정리해서 모아보았습니다.
Preset | CompCPU |
-0 | 0 |
-1 | 1 |
-2 | 2 |
-3 | 3 |
-4 | 4 |
-5 | 5 |
-6 | 6 |
-5e | 7 |
-6e | 8 |
어떤 파일을 압축할 때 상당히 큰 딕셔너리(예: 32MiB)가 필요 하다는걸 알아채셨지만, xz -8 명령이 압축할 때보다 더 빠른 속도로 압축하려 한다면, 더 큰 딕셔너리 사용을 위해 더 낮은 CompCPU 사전 설정 값(예: 1)으로 수정할 수 있습니다:
xz --lzma2=preset=1,dict=32MiB foo.tar
각 파일에 대해, 위 명령은 압축율이 더 좋아지면서도 xz -6보다 더 빨라집니다. 그러나, CompCPU 값을 낮게 유지하는 대신 큰 딕셔너리에서 일부 파일을 강조해야 합니다. 큰 딕셔너리가 대부분의 도움을 주는 매우 명백한 상황에서는 최소한 몇 메가바이트의 매우 유사한 각 파일이 아카이브에 들어갑니다. 딕셔너리 크기는 LZMA2가 연속으로 존재하는 각 파일의 유사성으로부터 얻는 장점을 취할 수 있을 때 일부 개별 파일보다 훨씬 더 커집니다.
압축 프로그램과 압축 해제 프로그램에서 메모리를 엄청 많이 사용해도 상관 없고, 파일을 수백 메가 바이트 메모리 용량을 활용하여 압축한다면, xz -9 명령에 64MiB 용량을 초과하는 딕셔너리를 사용할 수 있게 하는 방법도 쓸만할 지도 모릅니다:
xz -vv --lzma2=dict=192MiB big_foo.tar
위 예제에서와 같이 -vv (--verbose --verbose) 옵션을 사용하면 압축 및 압축 해제 과정에서 필요한 메모리 용량을 살펴보는데 요긴할 수 있습니다. 압축 해제한 파일 크기보다 더 큰 딕셔너리를 사용하면 불필요한 메모리 소모량이 발생하여 위 명령이 작은 파일에는 쓸모 없음을 기억하십시오.
때로는 압축 시간이 딱히 상관이 없을 수도 있습니다만, 압축 해제시 메모리 사용량을 적게 유지해야 할 수도 있습니다. 예를 들면, 임베디드 시스템에서 파일 압축을 해제할 수도 있습니다. 다음 명령의 경우 -6e (-6 --extreme) 옵션을 기반 옵션을 사용하며 딕셔너리 크기를 64KiB만 사용하도록 제한합니다. 결과 파일은 XZ 임베디드(이게 --check=crc32 옵션이 있는 이유)로 100KiB 메모리 용량을 활용하여 풀어낼 수 있습니다.
xz --check=crc32 --lzma2=preset=6e,dict=64KiB foo
가능한 한 수 바이트를 더 쥐어 짜내고 싶을 때, 리터럴 문맥 비트 수(lc)와 위치 비트 수(pb)를 조정하면 도움이 될 수도 있습니다. 리터럴 위치 비트 수(lp)를 조금 건드리는 것 또한 도움이 될 지도 모르겠지만 보통 lc 값과 pb 값이 더 중요합니다. 예를 들면, 소스 코드 저장 파일에는 US-ASCII 텍스트가 대부분이기에, 다음과 같은 경우는 xz -6e 명령을 실행했을 때부다는 아주 약간(거의 0.1% 수준) 작은 파일을 얻어낼 수도 있습니다(lc=4를 빼고도 시도해보십시오):
xz --lzma2=preset=6e,pb=0,lc=4 source_code.tar
LZMA2와 다른 필터를 함께 사용하면 일부 파일 형식에 대해 압축율을 개선할 수 있습니다. 예를 들면 x86-32 또는 x86-64 공유 라이브러리를 x86 BCJ 필터를 활용하여 압축할 경우:
xz --x86 --lzma2 libfoo.so
참고로 필터 옵션의 순서는 상당히 중요합니다. --x86을 --lzma 이전에 지정하면 xz에서 오류가 나는데, LZMA2 다음에는 어떤 필터든 설정할 수 없고, 옵션 체인상 마지막 필터로 x86 BCJ 필터를 사용할 수 없기 때문입니다.
LZMA2와 델타 필터는 비트맵 그림에 최적의 결과를 가져다줄 수 있습니다. PNG에 보통 안성맞춥인데, PNG에는 단순 델타 필터보단 약간 더 고급진 필터를 사용하지만, 실제 압축을 진행할 때는 Deflate를 사용하기 때문입니다.
예를 들어 이미지를 압축하지 않은 비압축 TIFF로 저장해야 하는 경우가 있습니다. 델타 필터의 거리 매개변수는 그림에서 픽셀당 바이트 수에 일치하도록 설정합니다. 예를 들면, 24비트 RGB 비트맵의 경우 dist=3 거리 매개변수 값을 설정해야 하며, LZMA2 압축시 3바이트 정렬을 따르도록 pb=0 값을 전달하는 방법도 바람직합니다.
xz --delta=dist=3 --lzma2=pb=0 foo.tiff
여러 이미지를 단일 아카이브로 넣고 싶다면(예: .tar), 모든 이미지에 대해 동일한 픽셀당 바이트 수가 들어가는 경우에도 델타 필터가 동작합니다.
xzdec(1), xzdiff(1), xzgrep(1), xzless(1), xzmore(1), gzip(1), bzip2(1), 7z(1)
XZ 유틸리티:
<https://tukaani.org/xz/>
XZ 임베디드:
<https://tukaani.org/xz/embedded.html>
LZMA SDK: <http://7-zip.org/sdk.html>
2022-12-01 | Tukaani |