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) 不支持 有解压工具
扩展属性 不支持 不支持 支持

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

posted @ 2023-07-18 16:57  00lab  阅读(2381)  评论(0编辑  收藏  举报