Linux mksquashfs命令详解

mksquashfs命令 - 用于创建只读压缩文件系统squashfs的工具,广泛用于Live CD/DVD、系统恢复盘、嵌入式系统和容器镜像

命令简介

mksquashfs 是一个用于创建squashfs文件系统的工具。squashfs是一种高度压缩的只读文件系统,它能够将整个目录结构压缩成一个文件,同时保持文件系统的完整性。

核心优势: 高压缩率、只读安全性、随机访问性能好、支持多种压缩算法
  • 文件格式: .squashfs, .sfs
  • 文件系统类型: 只读压缩文件系统
  • 压缩算法: 支持gzip, lzma, lzo, lz4, xz, zstd
  • 最大文件大小: 支持最大2^64字节(16EB)
  • 主要应用: Live CD/DVD、系统恢复盘、嵌入式系统、容器镜像、游戏光盘
  • 关联命令: unsquashfs(解压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 [源文件列表] 目标文件 [选项] [排除模式] [额外文件]
参数说明:
  • 源目录: 要压缩的目录路径,可以指定多个
  • 输出文件: 生成的.squashfs文件路径,通常以.squashfs、.sfs或.img为扩展名
  • 选项: 各种压缩和优化选项
  • 排除模式: 指定要排除的文件或目录
  • 额外文件: 可以添加配置文件或指定特殊处理规则

常用选项

选项 说明 默认值
-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文件
# 基本用法:将目录压缩成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
片段(Fragments)优化
# 禁用片段(可能增加文件大小但提高性能)
mksquashfs /source output.squashfs -no-fragments

# 强制使用片段(可能提高压缩率但降低性能)
mksquashfs /source output.squashfs -always-use-fragments

# 设置片段大小(默认128K)
mksquashfs /source output.squashfs -fragment-size 256K

# 片段的作用:
# - 将小文件或文件尾部组合成较大的块进行压缩
# - 提高压缩率,但可能影响随机访问性能
# - 对于大文件为主的场景,可以禁用片段

实际应用场景

创建Live CD/DVD系统镜像
# 创建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启动盘
制作Docker/容器镜像
# 创建容器根文件系统
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文件

挂载squashfs文件系统
# 挂载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解压
# 基本解压
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排除临时文件、日志、缓存等
  • 合理选择块大小: 大文件用大块(1M),小文件多用小块(64K-128K)
  • 考虑使用场景: 实时系统用lzo/lz4,存储用xz/zstd
  • 利用多核: 大文件压缩时使用-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

常见问题解答

Q: squashfs和普通压缩文件(如.tar.gz)有什么区别?

A: 主要区别在于:

  1. 文件系统: squashfs是一个完整的文件系统,支持权限、设备节点等
  2. 随机访问: squashfs支持随机访问文件,无需解压整个文件
  3. 只读挂载: squashfs可以直接挂载为只读文件系统
  4. 压缩粒度: squashfs按块压缩,而tar.gz是整个文件流压缩
Q: 如何选择压缩算法和块大小?

A: 参考以下建议:

  • 通用场景: zstd + 256K块
  • Live系统: xz + 1M块(压缩率高)
  • 嵌入式系统: lzo/lz4 + 128K块(解压快)
  • 测试方法: 使用实际数据测试不同组合,比较压缩率、压缩时间和解压时间
Q: squashfs支持的最大文件大小是多少?

A: 理论最大文件大小为2^64字节(16EB),实际受限于文件系统和内核版本。现代Linux内核(2.6.29+)支持最大16TB的文件。

Q: 如何验证squashfs文件的完整性?
# 方法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