Squashfs文件系统

发布时间 2023-07-18 17:03:52作者: UFOFCZ

概述

Squashfs是一套供Linux为基础使用的GPL开源只读压缩文件系统。
1)Squashfs能压缩文件系统内的文件、inode及目录结构,支持最大1024千字节区段,以获得更大的压缩比。
2)Squashfs专门为一般的只读文件系统而设计,可应用于数据备份、系统资源紧张的硬件系统上使用。最初Squashfs采用 gzip压缩,2.6.34后的Linux内核增加了对LZMA和LZO、XZ压缩算法的支持。
3)版本 2.6.35 之后的内核包含的Squashfs增加了扩展文件属性支持。

使用

# 安装工具
sudo apt-get install squashfs-tools

# 压缩工具
常用的参数:
-comp 算法
-no-fragments 不使用碎片机制
-b 文件切分的数据块大小,必须是4K的倍数

mksquashfs /file_dir /file.squashfs

# 挂载命令 挂载后只读不能写
mount -t squashfs /file.squashfs /mnt/mount_dir
umount /mnt/mount_dir

# 解压工具:unsquashfs
常用的参数:
-d 解压的目标目录
-l  查看squashfs文件系统内包含的文件列表,不解压文件系统

unsquashfs file.squashfs

原理

内部结构大体如下

Squashfs文件的组成
superblock
  block_size
  compression
  directory_table_start → (inode table)
  inode_table_start → (directory table)
压缩文件1
  文件1压缩块1
  文件1压缩块2
  文件1压缩块N
压缩文件2
压缩文件3、4、5(多个文件一个块)
  文件3压缩块 文件4压缩块 文件5压缩块
...
压缩文件N
inode table
  uid
  gid
  Start_block (用于文件压缩块的寻址,指向一个压缩块)
  offset
  File_size (每个压缩块的大小)
  Block_list (对于大文件,可能存在多个压缩块,故有list)
directory table (用于上边的inode的寻址)
  Start_block
  offset
  name
fragment table 
export table 
uid/gid  table 
xattr table 

Squashfs的读放大缺陷:
blocksize=4k时,下表文件1较大,按4k切分后压缩成3个压缩块后紧密排列,多个文件压缩成一个压缩块,

字节序 0~4096 ~8192 ~11288 ~16384
文件1 占用 占用 占有 部分占有
文件2、3、4 1k、2.5k、0.5k
压缩后的物理磁盘分布 压缩块1、压缩块2、部分压缩块3 部分压缩块3、压缩块4、压缩块5

读取的时候,如果只想读文件1,对应物理磁盘时需要读入压缩块1、2和两个4k域的部分3,需把两个4k块一起读入,然后每个块进行解压,这个过程称之为读放大问题。
应用读取文件 → 文件x → 解压 → 读入多个压缩块

Squashfs压缩比

实测大概数据,一般数据块越大,压缩比越好

Squashfs
支持压缩类型与压缩比(128k) Gzip 40%,Lz4 50%,xz 36%
支持压缩类型与压缩比(4k) Gzip 45%,Lz4 55%,xz 43%
压缩速度 16核压缩 Gzip 0m 7s,Lz4 0m 0.5s,Lz4hc 0m 8.3s, xz 0m 16s
Xattr 支持
目录 支持
文件去重 支持

演进对比

Squashfs是比较老的了,不同格式的对比如下图:

用户态文件系统:https://github.com/vasi/squashfuse