Squashfs文件系统
概述
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是比较老的了,不同格式的对比如下图:
特性 | Cromfs | Cromfs(1.1) | Squashfs(4.2) |
---|---|---|---|
压缩块大小 | 可调整(默认2M) | 可调整(默认4KB) | 可调整(默认128kB,最大1M) |
文件压缩形式 | 整体 | 独立 | 独立、小文件除外 |
最大文件大小 | 16EB | 16MB | 16EB |
最大文件系统大小 | 16EB | 272MB | 16EB |
重复文件检查 | 支持(包括近似重复检查) | 不支持 | 支持完全不同文件检查 |
硬链接 | 支持 | 不支持 | 支持 |
近似相同文件检查 | 支持 | 不支持 | 不支持 |
压缩算法 | LZMA | Gzip,LZMA | gzip,LZO,XZ,LZ4等 |
所有者 | uid,gid | uid,gid(截断留8位) | uid,gid |
时间戳 | 只有mtime | 无 | 只有mtime |
字节序安全 | 安全 | 安全,不可变 | 安全,不可变 |
Linux内核 | 不支持 | 支持 | 支持 |
用户态 | 支持(fuse) | 不支持 | 有解压工具 |
扩展属性 | 不支持 | 不支持 | 支持 |