Squashfs 파일시스템

Squashfs는 리눅스 기반의 읽기 전용 압축 파일 시스템이다. 이 파일 시스템은 데이터를 압축하여 저장 공간을 절약할 수 있어 임베디드 시스템, 라이브 CD 및 기타 용량 제한이 있는 환경에서 자주 사용된다. Squashfs는 고도의 압축률을 제공하며, 필요한 데이터만 비압축하여 빠르게 접근할 수 있다. 이 글에서는 Squashfs 기본 개념과 설치, 생성 방법 등을 알아본다.

Squashfs 의 주요 특징은 다음과 같다.

  • 읽기 전용: Squashfs는 읽기 전용 파일 시스템으로, 데이터 수정이 불가능하다.
  • 고압축률: 데이터 압축을 통해 저장 공간을 절약합니다. 주로 gzip, xz, lz4 등의 압축 알고리즘을 사용한다.
  • 빠른 읽기 속도: 압축된 데이터 중 필요한 부분만 읽고 비압축하여 빠르게 접근할 수 있다.
  • 다양한 사용처: 라이브 CD, 임베디드 시스템, 컨테이너 기반 시스템 등에서 널리 사용된다.

Squashfs 툴 설치

대부분의 리눅스 배포판에서는 기본적으로 Squashfs를 지원하지만, 필요한 패키지가 설치되어 있는지 확인해야 한다. Squashfs 도구는 squashfs-tools라는 패키지에 포함되어 있으며, 이를 설치하면 Squashfs 파일 시스템을 생성하고 관리할 수 있다.

설치 방법

Ubuntu 및 Debian 계열에서 squashfs-tools 패키지를 설치하는 명령어는 다음과 같다.

sudo apt update
sudo apt install squashfs-tools -y

설치가 완료되면 SquashFS 파일 시스템을 생성하고 관리할 수 있는 mksquashfsunsquashfs 명령어를 사용할 수 있게 된다.

Squashfs 이미지 생성

Squashfs 이미지를 생성하려면 mksquashfs 명령어를 사용한다. 이 명령어를 사용하면 하나의 디렉토리를 압축하여 Squashfs 파일 시스템 이미지를 만들 수 있다.

mksquashfs /path/to/source /path/to/destination/image.squashfs
$ mksquashfs rootfs rootfs.sqfs
Parallel mksquashfs: Using 4 processors
Creating 4.0 filesystem on rootfs.sqfs, block size 131072.
[========================================================================\] 1835/1835 100%

Exportable Squashfs 4.0 filesystem, gzip compressed, data block size 131072
        compressed data, compressed metadata, compressed fragments,
        compressed xattrs, compressed ids
        duplicates are removed
Filesystem size 27030.86 Kbytes (26.40 Mbytes)
        39.44% of uncompressed filesystem size (68534.47 Kbytes)
Inode table size 18814 bytes (18.37 Kbytes)
        26.59% of uncompressed inode table size (70746 bytes)
Directory table size 20140 bytes (19.67 Kbytes)
        45.39% of uncompressed directory table size (44371 bytes)
Number of duplicate files found 13
Number of inodes 1980
Number of files 1378
Number of fragments 70
Number of symbolic links 428
Number of device nodes 0
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 174
Number of ids (unique uids + gids) 1
Number of uids 1
        jammy (1000)
Number of gids 1
        jammy (1000)

압축 알고리즘 옵션

Squashfs는 다양한 압축 옵션을 제공한다. mksquashfs 명령어에 -comp 옵션을 주어 압축 알고리즘을 지정할 수 있다.

mksquashfs myfolder myimage.squashfs -comp gzip

압축 알고리즘은 GZIP 을 기본으로, XZ, LZO, LZ4, ZSTD 등을 줄 수 있다.

$ mksquashfs rootfs rootfs.sqfs -comp zstd
Parallel mksquashfs: Using 4 processors
Creating 4.0 filesystem on rootfs.sqfs, block size 131072.
[========================================================================\] 1835/1835 100%

Exportable Squashfs 4.0 filesystem, zstd compressed, data block size 131072
        compressed data, compressed metadata, compressed fragments,
        compressed xattrs, compressed ids
        duplicates are removed
Filesystem size 25969.82 Kbytes (25.36 Mbytes)
        37.89% of uncompressed filesystem size (68534.47 Kbytes)
Inode table size 16384 bytes (16.00 Kbytes)
        23.16% of uncompressed inode table size (70746 bytes)
Directory table size 19540 bytes (19.08 Kbytes)
        44.04% of uncompressed directory table size (44371 bytes)
Number of duplicate files found 13
Number of inodes 1980
Number of files 1378
Number of fragments 70
Number of symbolic links 428
Number of device nodes 0
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 174
Number of ids (unique uids + gids) 1
Number of uids 1
        jammy (1000)
Number of gids 1
        jammy (1000)

블럭 사이즈 옵션

Squashfs는 mksquashfs 명령어에 -b <block size> 옵션을 주어 블럭 사이즈를 지정할 수 있다.

mksquashfs myfolder myimage.squashfs -b <block size>
$ mksquashfs rootfs rootfs.sqfs -b 4096
Parallel mksquashfs: Using 4 processors
Creating 4.0 filesystem on rootfs.sqfs, block size 4096.
[======================================================================-] 18048/18048 100%

Exportable Squashfs 4.0 filesystem, gzip compressed, data block size 4096
        compressed data, compressed metadata, compressed fragments,
        compressed xattrs, compressed ids
        duplicates are removed
Filesystem size 29927.02 Kbytes (29.23 Mbytes)
        43.62% of uncompressed filesystem size (68602.89 Kbytes)
Inode table size 44815 bytes (43.76 Kbytes)
        32.80% of uncompressed inode table size (136646 bytes)
Directory table size 20294 bytes (19.82 Kbytes)
        45.65% of uncompressed directory table size (44455 bytes)
Number of duplicate files found 13
Number of inodes 1980
Number of files 1378
Number of fragments 325
Number of symbolic links 428
Number of device nodes 0
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 174
Number of ids (unique uids + gids) 1
Number of uids 1
        jammy (1000)
Number of gids 1
        jammy (1000)

Squashfs 파일 시스템 마운트

Squashfs 파일 시스템은 읽기 전용으로 마운트할 수 있다. 이래와 같이 생성된 filesystem.squashfs 파일을 특정 디렉토리에 마운트하여 사용할 수 있다.

mkdir mountpoint
sudo mount -t squashfs rootfs.sqfs mountpoint
$ mkdir mountpoint
sudo mount -t squashfs rootfs.sqfs mountpoint
[sudo] password for jammy:
$ mount | grep mountpoint
/home/jammy/rootfs.sqfs on /home/jammy/mountpoint type squashfs (ro,relatime,errors=continue)

Squashfs 파일 시스템 내용 추출

읽기 전용으로 생성된 SquashFS 파일 시스템에서 내용을 추출하려면 다음과 같이 unsquashfs 명령어를 사용한다.

unsquashfs -f -d /extracted_dir filesystem.squashfs
$ mkdir extracted_dir
$ unsquashfs -f -d extracted_dir rootfs.sqfs
Parallel unsquashfs: Using 4 processors
1809 inodes (18476 blocks) to write

[======================================================================|] 18476/18476 100%

created 1378 files
created 174 directories
created 428 symlinks
created 0 devices
created 0 fifos
created 0 sockets
$ ls extracted_dir/
bin  boot  dev  etc  home  lib  media  mnt  proc  run  sbin  srv  sys  tmp  usr  var

참고 사이트

답글 남기기