mksquashfs 是一个用于创建squashfs文件系统的工具。squashfs是一种高度压缩的只读文件系统,它能够将整个目录结构压缩成一个文件,同时保持文件系统的完整性。
# Ubuntu/Debian
sudo apt install squashfs-tools
# CentOS/RHEL 7+
sudo yum install squashfs-tools
# CentOS/RHEL 8+/Fedora
sudo dnf install squashfs-tools
# Arch Linux
sudo pacman -S squashfs-tools
# openSUSE
sudo zypper install squashfs
# macOS (使用Homebrew)
brew install squashfs
# 从源码编译安装
wget https://github.com/plougher/squashfs-tools/archive/refs/tags/4.5.tar.gz
tar -xzf 4.5.tar.gz
cd squashfs-tools-4.5/squashfs-tools
make
sudo make install
# 验证安装
mksquashfs --version
# 基本语法
mksquashfs 源目录1 [源目录2 ...] 输出文件 [选项]
# 完整语法
mksquashfs [源文件列表] 目标文件 [选项] [排除模式] [额外文件]
| 选项 | 说明 | 默认值 |
|---|---|---|
-comp 算法 |
压缩算法 (gzip, lzo, lz4, xz, lzma, zstd) | gzip |
-b 大小 |
数据块大小 (默认131072字节=128K) | 131072 |
-noI, -noD |
不压缩inode表/目录表 | - |
-noF, -noX |
不压缩文件数据/扩展属性 | - |
-no-fragments |
禁用片段(fragments) | - |
-always-use-fragments |
总是使用片段 | - |
-no-duplicates |
不检测重复文件 | - |
-all-root |
将所有文件设置为root用户所有 | - |
-force-uid uid |
设置所有文件的用户ID | - |
-force-gid gid |
设置所有文件的组ID | - |
-p "伪文件定义" |
创建伪文件(设备节点、管道等) | - |
-e 模式 |
排除匹配模式的文件/目录 | - |
-ef 文件 |
从文件中读取排除列表 | - |
-wildcards |
在排除模式中使用通配符 | - |
-info |
显示压缩进度信息 | - |
-no-progress |
不显示进度条 | - |
-processors 数量 |
使用的CPU核心数 | 自动检测 |
-mem 大小 |
限制使用的内存大小 | 25%物理内存 |
-root-owned |
强制所有文件为root所有(同-all-root) | - |
-version |
显示版本信息 | - |
| 算法 | 压缩率 | 压缩速度 | 解压速度 | 内存占用 | 适用场景 |
|---|---|---|---|---|---|
| gzip (默认) | 中等 | 中等 | 快 | 低 | 通用场景,兼容性好 |
| lzo | 较低 | 极快 | 极快 | 低 | 需要快速压缩/解压 |
| lz4 | 较低 | 极快 | 极快 | 低 | 实时系统,低延迟要求 |
| zstd | 高 | 快 | 极快 | 中等 | 现代系统推荐 |
| xz | 最高 | 慢 | 中等 | 高 | 需要最高压缩率 |
| lzma | 高 | 慢 | 中等 | 高 | 传统高压缩需求 |
zstd算法,它在压缩率、速度和内存占用之间取得了良好平衡
# 基本用法:将目录压缩成squashfs文件
mksquashfs /path/to/source /path/to/output.squashfs
# 指定压缩算法
mksquashfs /source /output.squashfs -comp gzip # 使用gzip(默认)
mksquashfs /source /output.squashfs -comp lz4 # 使用lz4(快速)
mksquashfs /source /output.squashfs -comp zstd # 使用zstd(推荐)
mksquashfs /source /output.squashfs -comp xz # 使用xz(高压缩率)
# 显示详细信息
mksquashfs /source /output.squashfs -info
# 使用多个源目录
mksquashfs /dir1 /dir2 /dir3 combined.squashfs
# 排除特定文件或目录
mksquashfs /source output.squashfs -e *.tmp *.log cache/
# 使用通配符排除
mksquashfs /source output.squashfs -wildcards -e "*.swp" "*.bak"
# 从文件读取排除列表
mksquashfs /source output.squashfs -ef exclude-list.txt
# exclude-list.txt内容示例:
# *.tmp
# *.log
# .git/
# node_modules/
# __pycache__/
# 组合多个排除选项
mksquashfs /source output.squashfs -e "*.tmp" "*.log" -ef more-excludes.txt
# 调整数据块大小(影响压缩率和性能)
mksquashfs /source output.squashfs -b 256K # 256KB块
mksquashfs /source output.squashfs -b 512K # 512KB块
mksquashfs /source output.squashfs -b 1M # 1MB块(大文件效果好)
# 常见的块大小选择:
# - 128K: 默认值,通用场景
# - 256K: 平衡性能与压缩率
# - 512K-1M: 大文件多的情况
# - 4K-32K: 小文件多的情况
# 设置压缩级别(仅部分算法支持)
# zstd支持级别1-22(默认为15)
mksquashfs /source output.squashfs -comp zstd -Xcompression-level 19
# xz支持预设级别0-9(默认为6)
mksquashfs /source output.squashfs -comp xz -Xbcj x86 -Xdict-size 1M
# 使用多核CPU加速压缩
mksquashfs /source output.squashfs -processors 4
# 自动使用所有CPU核心
mksquashfs /source output.squashfs -processors 0
# 限制内存使用
mksquashfs /source output.squashfs -mem 2G
# 不压缩某些部分以加快速度
mksquashfs /source output.squashfs -noI -noD # 不压缩inode和目录
mksquashfs /source output.squashfs -noF # 不压缩文件数据
# 禁用重复文件检测(当确定没有重复文件时)
mksquashfs /source output.squashfs -no-duplicates
# 在squashfs中创建设备节点
mksquashfs /source output.squashfs \
-p "/dev/console c 666 0 0 5 1" \
-p "/dev/null c 666 0 0 1 3" \
-p "/dev/zero c 666 0 0 1 5"
# 伪文件语法:
# -p "目标路径 类型 权限 uid gid 主设备号 次设备号"
# 类型: d=目录, f=普通文件, c=字符设备, b=块设备, s=socket, p=管道
# 创建目录链接
mksquashfs /source output.squashfs -p "/var/log -> ../tmp/log"
# 创建符号链接
mksquashfs /source output.squashfs -p "/usr/bin/sh -> /bin/bash"
# 创建设备节点的完整示例
mksquashfs /source rootfs.squashfs \
-p "/dev/console c 666 0 0 5 1" \
-p "/dev/null c 666 0 0 1 3" \
-p "/dev/zero c 666 0 0 1 5" \
-p "/dev/random c 666 0 0 1 8" \
-p "/dev/urandom c 666 0 0 1 9" \
-p "/dev/tty c 666 0 0 5 0" \
-p "/dev/tty0 c 666 0 0 4 0"
# 将所有文件设置为root所有(常用于系统镜像)
mksquashfs /source output.squashfs -all-root
# 或
mksquashfs /source output.squashfs -root-owned
# 设置特定的用户ID和组ID
mksquashfs /source output.squashfs -force-uid 1000 -force-gid 1000
# 保留原始权限(默认行为)
mksquashfs /source output.squashfs # 不添加选项即保留原始权限
# 创建系统镜像时的典型用法
mksquashfs /mnt/rootfs rootfs.squashfs -comp xz -b 1M -all-root -no-progress
# 禁用片段(可能增加文件大小但提高性能)
mksquashfs /source output.squashfs -no-fragments
# 强制使用片段(可能提高压缩率但降低性能)
mksquashfs /source output.squashfs -always-use-fragments
# 设置片段大小(默认128K)
mksquashfs /source output.squashfs -fragment-size 256K
# 片段的作用:
# - 将小文件或文件尾部组合成较大的块进行压缩
# - 提高压缩率,但可能影响随机访问性能
# - 对于大文件为主的场景,可以禁用片段
# 创建Ubuntu Live CD系统镜像
sudo mksquashfs /cdrom/install/filesystem.squashfs /output/ubuntu.squashfs \
-comp xz \
-b 1M \
-Xdict-size 1M \
-no-duplicates \
-no-progress \
-processors $(nproc)
# 典型Live CD制作流程
# 1. 准备根文件系统
# 2. 使用mksquashfs压缩
# 3. 创建ISO镜像
# 4. 刻录到光盘或制作USB启动盘
# 创建容器根文件系统
mksquashfs rootfs/ container.squashfs \
-comp zstd \
-Xcompression-level 15 \
-b 256K \
-all-root \
-no-progress
# 在Dockerfile中使用
# FROM scratch
# ADD container.squashfs /
# CMD ["/bin/sh"]
# 优势:squashfs镜像比层叠的Docker镜像更节省空间,
# 且启动时无需解压整个文件系统
# 制作嵌入式Linux根文件系统
mksquashfs rootfs/ firmware.squashfs \
-comp lzo \
-b 128K \
-no-fragments \
-all-root \
-p "/dev/console c 666 0 0 5 1" \
-p "/dev/null c 666 0 0 1 3" \
-p "/dev/zero c 666 0 0 1 5" \
-e "*.pyc" "__pycache__" "*.log"
# 特点:lzo压缩速度快,适合资源受限的嵌入式设备
# 启动时解压速度快,节省内存
# 打包游戏资源文件
mksquashfs game_data/ game.squashfs \
-comp lz4 \
-b 256K \
-processors 8 \
-no-progress \
-e "*.psd" "*.blend" "source/" \
-wildcards
# 优势:
# 1. 单个文件便于分发
# 2. 压缩节省存储空间
# 3. 运行时无需解压,直接挂载访问
# 4. 防止用户修改游戏资源
# 挂载squashfs文件
sudo mount -t squashfs -o loop,ro output.squashfs /mnt/squashfs
# 带压缩算法参数的挂载(如果知道压缩算法)
sudo mount -t squashfs -o loop,ro,comp=lz4 output.squashfs /mnt/squashfs
# 查看挂载信息
mount | grep squashfs
df -h | grep squashfs
# 卸载
sudo umount /mnt/squashfs
# 基本解压
unsquashfs output.squashfs
# 解压到指定目录
unsquashfs -d /path/to/extract output.squashfs
# 仅解压特定文件或目录
unsquashfs -d /extract -f output.squashfs "path/to/file"
unsquashfs -d /extract -f output.squashfs "directory/"
# 显示squashfs文件内容而不解压
unsquashfs -ll output.squashfs # 类似ls -l输出
unsquashfs -l output.squashfs # 类似ls输出
unsquashfs -s output.squashfs # 显示超级块信息
# 多线程解压
unsquashfs -processors 4 output.squashfs
# 恢复文件权限
unsquashfs -force-uid 0 -force-gid 0 output.squashfs
# 在/etc/fstab中添加(适用于只读根文件系统)
/path/to/rootfs.squashfs / squashfs ro,defaults 0 0
# 在/etc/fstab中添加(用于挂载应用程序)
/path/to/app.squashfs /opt/app squashfs ro,loop,defaults 0 0
# 使用systemd自动挂载(更现代的方式)
# 创建/etc/systemd/system/mnt-app.mount
[Unit]
Description=Mount App SquashFS
[Mount]
What=/path/to/app.squashfs
Where=/mnt/app
Type=squashfs
Options=loop,ro
[Install]
WantedBy=multi-user.target
# 启用服务
sudo systemctl enable mnt-app.mount
sudo systemctl start mnt-app.mount
| 优化目标 | 推荐配置 | 说明 |
|---|---|---|
| 最高压缩率 | -comp xz -b 1M -Xdict-size 1M |
xz算法+大字典+大块大小 |
| 最快压缩速度 | -comp lzo -b 128K -no-fragments |
lzo算法+禁用片段 |
| 最快解压速度 | -comp lz4 -b 256K |
lz4解压速度极快 |
| 平衡性能 | -comp zstd -b 256K -Xcompression-level 15 |
zstd在速度和压缩率间平衡 |
| 大文件优化 | -comp xz -b 1M -no-fragments |
大块+禁用片段适合大文件 |
| 小文件优化 | -comp zstd -b 64K -always-use-fragments |
小块+启用片段适合小文件 |
| 多核优化 | -processors 0 |
自动使用所有CPU核心 |
| 内存优化 | -mem 2G |
限制内存使用,避免OOM |
-e排除临时文件、日志、缓存等-processors加速-mem限制内存使用| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| "内存不足"错误 | 1. 块大小太大 2. 压缩算法内存需求高 3. 系统内存不足 |
1. 减小-b参数2. 换用lzo/lz4算法 3. 使用 -mem限制内存 |
| 压缩速度太慢 | 1. 使用xz/lzma算法 2. 块大小太大 3. 单核运行 |
1. 换用lzo/lz4/zstd 2. 减小块大小 3. 使用 -processors |
| 文件大小意外大 | 1. 包含无用文件 2. 压缩算法不合适 3. 块大小太小 |
1. 检查排除列表 2. 换用高压缩率算法 3. 增大块大小 |
| 挂载失败 | 1. 文件损坏 2. 内核不支持压缩算法 3. 权限不足 |
1. 验证文件完整性 2. 更新内核或模块 3. 使用root权限 |
| 无法创建设备节点 | 1. 语法错误 2. 权限不足 3. 设备号无效 |
1. 检查-p语法2. 使用root运行 3. 验证设备号 |
| 解压时权限错误 | 1. 文件系统权限限制 2. 使用 -all-root创建 |
1. 使用root解压 2. 解压时指定 -force-uid/gid |
# 错误:mksquashfs: command not found
# 解决:安装squashfs-tools包
sudo apt install squashfs-tools # Ubuntu/Debian
# 错误:FATAL ERROR: Failed to mount filesystem
# 解决:检查内核是否支持squashfs
lsmod | grep squashfs
# 如果不支持,加载模块
sudo modprobe squashfs
# 错误:Read on filesystem failed because Input/output error
# 解决:文件可能损坏,重新创建或检查存储设备
# 错误:lz4 compression not supported
# 解决:内核版本太旧,升级内核或使用其他算法
uname -r
# 需要内核3.19+支持lz4,4.14+支持zstd
A: 主要区别在于:
A: 参考以下建议:
A: 理论最大文件大小为2^64字节(16EB),实际受限于文件系统和内核版本。现代Linux内核(2.6.29+)支持最大16TB的文件。
# 方法1:尝试挂载
sudo mount -t squashfs -o loop,ro file.squashfs /mnt/test
sudo umount /mnt/test
# 方法2:使用unsquashfs测试
unsquashfs -s file.squashfs # 显示超级块信息
unsquashfs -l file.squashfs # 列出文件内容
# 方法3:检查文件系统
sudo fsck.squashfs file.squashfs # 如果可用
# 方法4:使用file命令
file file.squashfs
# 正常输出:Squashfs filesystem, little endian, version 4.0, ...
unsquashfs - 解压squashfs文件mount - 挂载squashfs文件系统genisoimage / mkisofs - 创建包含squashfs的ISO镜像xorriso - 创建和刻录ISO镜像squashfuse - 用户空间挂载squashfs文件系统tar - 传统打包工具cpio - 另一种归档工具mksquashfs 源目录 输出文件.squashfs-comp指定(gzip,lzo,lz4,xz,zstd,lzma)-e排除不需要的文件-processors多核,-b调块大小-all-root设置root所有权-p创建伪文件mount -t squashfs -o loop,ro 文件 挂载点unsquashfs 文件.squashfs