Linux 커널에 어떤 압축 해제 알고리즘이 컴파일되어 있는지 어떻게 알 수 있나요?

Linux 커널에 어떤 압축 해제 알고리즘이 컴파일되어 있는지 어떻게 알 수 있나요?

사용할 수 없는 경우 /proc/config.gz실행 중인 커널이 압축 후 사용할 수 있는 압축 해제 알고리즘을 어떻게 알 수 있습니까 cpio initramfs?

gzip커널을 구축할 때 알고리즘을 사용할 수 없더라도 알고리즘은 항상 사용할 수 있습니까 CONFIG_DECOMPRESS_GZIP?y

답변1

압축 알고리즘은 다음에서 선언됩니다.lib/decompress.c. Gzip은 다음에 정의되어 있습니다.lib/decompress_inflate.c커널이 컴파일될 때만 CONFIG_DECOMPRESS_GZIP존재하며 특별한 상태를 얻지 못합니다.y

사용 가능한 압축 알고리즘 목록은 다음과 같습니다.compressed_formats구조. 정의되어 있으므로 static다른 소스 파일에서는 사용할 수 없습니다. 따라서 이를 사용하는 유일한 함수는 decompress_method함수 lib/decompress.c자체입니다. 따라서 커널이 지원되는 알고리즘 테이블을 사용하도록 하는 유일한 방법은 적절한 2바이트 매직 시퀀스로 시작하는 항목의 압축을 풀고 함수가 알고리즘 이름을 반환하는지 확인하는 것입니다.

/proc/kallsyms커널 기호 목록( )을 검색하면 어떤 압축 해제 기능이 지원되는지 확인할 수 있습니다 . 기능은 그 자체로 식별되지 않으므로 기호 이름 목록을 구워야 합니다.

</proc/kallsyms cut -d " " -f 3 |
grep -xF -e gunzip -e bzip2 -e unlzma -e unxz -e unlzo -e unlz4

답변2

엉뚱한 승리:

samveen@x230:~ $ awk '/^name/{n=$3}/^type/{if($3=="compression"){print n}}' </proc/crypto 
lz4
lzo-rle
lzo
deflate
compress_null

설명하다:

/proc/crypto라벨이 붙은 커널 알고리즘을 인쇄합니다 type compression.

참고: /proc언제나다음과 같이 사용할 수 있습니다.모든 linuxinitrd또는 컨테이너(예: )를 통한 커널 기반 환경 docker이므로 이 방법은 모든 최신 커널에서 작동해야 합니다.

경고 사항:

  • 의견에서 지적했듯이 xz이것은 내 환경에서도 누락된 것 같습니다.
  • ~에 따르면이 스레드커널 메일링 리스트에 따르면 이 테스트는 커널 2.6 이상에만 적용됩니다.
  • 마지막으로, 주석에서 지적했듯이 커널 빌드에 암호화된 알고리즘이 포함되어 있지 않으면 거기에 포함된 알고리즘을 정확하게 얻을 수 있습니다. 예를 들어,v2.6방금 구현 deflate했지만v3.18.140deflate와 가 있습니다 lz4.

답변3

sys/power/tuxonice/compression 디렉토리로 이동하면 어떤 유형의 압축이 있는지 확인할 수 있습니다. 거기에는 알고리즘이라는 파일이 들어 있고 여기에는 압축 해제 유형이 포함되어 있습니다. 저에게는 lzo로 작성되었습니다.

관련 정보