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) | 不支持 | 有解压工具 |
扩展属性 | 不支持 | 不支持 | 支持 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战