Linux unsquashfs命令详解

unsquashfs命令 - 用于解压squashfs只读压缩文件系统的工具,与mksquashfs命令相对应,支持多种解压模式和选择性文件提取

命令简介

unsquashfs 是squashfs-tools工具集的一部分,专门用于解压和提取.squashfs文件系统中的内容。与直接挂载squashfs文件不同,unsquashfs将文件系统完全解压到普通目录中,便于修改和查看原始文件结构。

核心特点: 完全解压、选择性提取、保持文件属性、支持多线程解压
  • 文件格式支持: .squashfs, .sfs, .img(squashfs格式)
  • 解压方式: 完全解压、部分解压、流式解压
  • 压缩算法支持: gzip, lzma, lzo, lz4, xz, zstd(自动检测)
  • 保持属性: 保留文件权限、时间戳、所有权等信息
  • 主要应用: 系统镜像提取、固件分析、容器镜像解压、游戏资源提取
  • 关联命令: mksquashfs(创建squashfs文件)、mount(挂载squashfs)

安装方法

# unsquashfs包含在squashfs-tools包中
# 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

# 验证安装
unsquashfs -version
# 或
unsquashfs -help
注意: unsquashfs通常与mksquashfs一起安装,无需单独安装

基本语法

# 基本语法
unsquashfs [选项] 输入文件.squashfs

# 指定解压目录
unsquashfs [选项] -d 目标目录 输入文件.squashfs

# 提取特定文件
unsquashfs [选项] -f 输入文件.squashfs "文件路径"
参数说明:
  • 输入文件.squashfs: 要解压的squashfs文件路径
  • 目标目录: 解压内容的输出目录
  • 文件路径: 要提取的特定文件或目录路径(相对于squashfs根目录)
  • 选项: 各种解压和显示选项

常用选项

选项 说明 默认值
-d 目录 指定解压目录 squashfs-root(在当前目录)
-f 解压指定的文件或目录 解压全部文件
-l, -ll 列出文件内容(类似ls/ls -l) -
-s 显示超级块信息 -
-i 显示inode信息 -
-n 解压时不覆盖已存在文件 覆盖存在文件
-da 大小 设置解压数据缓冲区大小 256K
-fr 大小 设置片段缓冲区大小 256K
-p 数量 使用指定数量的解压线程 1(单线程)
-processors 数量 使用的CPU核心数(同-p) 1
-force-uid uid 强制设置所有文件的用户ID 保留原始uid
-force-gid gid 强制设置所有文件的组ID 保留原始gid
-no-xattrs 不提取扩展属性 提取扩展属性
-no 不解压文件,仅显示信息 执行解压
-stat 显示解压统计信息 -
-version 显示版本信息 -
-help 显示帮助信息 -
-info 显示详细信息(进度等) -
-quiet 静默模式,不显示输出 显示进度信息
-no-progress 不显示进度条 显示进度条

基础使用示例

基本解压操作
# 基本解压:解压到当前目录的squashfs-root文件夹
unsquashfs filesystem.squashfs

# 指定解压目录
unsquashfs -d /tmp/extracted filesystem.squashfs

# 解压时不覆盖已存在文件
unsquashfs -n filesystem.squashfs

# 静默解压(不显示进度)
unsquashfs -quiet filesystem.squashfs

# 显示详细信息
unsquashfs -info filesystem.squashfs

# 多线程解压(使用4个线程)
unsquashfs -p 4 filesystem.squashfs
# 或
unsquashfs -processors 4 filesystem.squashfs
查看文件内容(不解压)
# 列出所有文件(类似ls)
unsquashfs -l filesystem.squashfs

# 列出所有文件及详细信息(类似ls -l)
unsquashfs -ll filesystem.squashfs

# 显示超级块信息
unsquashfs -s filesystem.squashfs

# 显示inode信息
unsquashfs -i filesystem.squashfs

# 仅显示文件列表,不解压
unsquashfs -no -l filesystem.squashfs

# 过滤显示特定类型的文件
unsquashfs -l filesystem.squashfs | grep "\.so$"
unsquashfs -ll filesystem.squashfs | grep "^d"  # 仅显示目录
选择性提取文件
# 提取单个文件
unsquashfs -f filesystem.squashfs "etc/passwd"
# 文件将提取到当前目录的squashfs-root/etc/passwd

# 提取单个文件到指定目录
unsquashfs -d /tmp/extract -f filesystem.squashfs "etc/passwd"

# 提取目录
unsquashfs -f filesystem.squashfs "etc/"
unsquashfs -f filesystem.squashfs "usr/bin/"

# 提取多个文件
unsquashfs -f filesystem.squashfs "etc/passwd" "etc/group" "etc/hosts"

# 使用通配符提取
unsquashfs -f filesystem.squashfs "usr/lib/*.so"
unsquashfs -f filesystem.squashfs "var/log/*.log"

# 提取并保持目录结构
unsquashfs -d /backup -f filesystem.squashfs "etc/nginx/nginx.conf"
# 结果:/backup/etc/nginx/nginx.conf
文件权限和所有权处理
# 强制设置所有文件的用户ID和组ID
unsquashfs -force-uid 1000 -force-gid 1000 filesystem.squashfs

# 不提取扩展属性
unsquashfs -no-xattrs filesystem.squashfs

# 查看文件所有权信息
unsquashfs -ll filesystem.squashfs | head -20

# 提取时保留原始权限(默认行为)
unsquashfs filesystem.squashfs

# 如果遇到权限问题,可以使用root权限
sudo unsquashfs filesystem.squashfs

高级使用技巧

性能优化解压
# 使用多线程加速大文件解压
unsquashfs -processors $(nproc) large.squashfs

# 增加数据缓冲区大小(提高大文件解压性能)
unsquashfs -da 1M huge.squashfs

# 增加片段缓冲区大小
unsquashfs -fr 512K filesystem.squashfs

# 结合多个优化参数
unsquashfs -p 8 -da 2M -fr 1M -quiet filesystem.squashfs

# 自动使用所有CPU核心
unsquashfs -processors 0 filesystem.squashfs

# 显示解压统计信息
unsquashfs -stat filesystem.squashfs
批量处理和脚本集成
# 批量解压多个squashfs文件
for file in *.squashfs; do
    unsquashfs -d "extracted_${file%.*}" "$file"
done

# 从指定文件中提取特定文件列表
cat filelist.txt | while read file; do
    unsquashfs -f system.squashfs "$file"
done

# filelist.txt内容示例:
# etc/passwd
# etc/group
# etc/hosts
# etc/ssh/sshd_config

# 使用find结合unsquashfs
find /path/to/images -name "*.squashfs" -exec unsquashfs -d /tmp/extract {} \;

# 在脚本中检查解压是否成功
if unsquashfs -d /tmp/extract image.squashfs; then
    echo "解压成功"
else
    echo "解压失败"
    exit 1
fi
与其他命令结合使用
# 解压后直接查找文件
unsquashfs -ll system.squashfs | grep "config"

# 计算解压后文件总大小
unsquashfs -ll system.squashfs | awk '{sum += $5} END {print sum}'

# 提取配置文件并立即查看
unsquashfs -f system.squashfs "etc/nginx/nginx.conf" && cat squashfs-root/etc/nginx/nginx.conf

# 将squashfs内容转换为tar归档
unsquashfs -f system.squashfs | tar -cf system.tar -T -

# 比较两个squashfs文件的差异
diff <(unsquashfs -ll v1.squashfs) <(unsquashfs -ll v2.squashfs)

# 管道结合:从远程服务器下载并解压
curl -s http://example.com/system.squashfs | unsquashfs -d /tmp/extract -
标准输入支持(从管道读取)
# 从标准输入读取squashfs数据
cat filesystem.squashfs | unsquashfs -d /tmp/extract -

# 结合dd命令
dd if=/dev/sda1 bs=1M skip=1000 count=200 | unsquashfs -d /tmp/extract -

# 从加密文件解压
gpg --decrypt encrypted.squashfs.gpg | unsquashfs -d /tmp/extract -

# 从网络流解压
ssh user@remote "cat /path/to/image.squashfs" | unsquashfs -d /tmp/extract -
注意: 从管道读取时无法使用-f选项选择特定文件,必须完全解压

实际应用场景

分析Live CD系统镜像
# 从ISO中提取squashfs文件
mount -o loop ubuntu.iso /mnt/iso
unsquashfs -d /tmp/ubuntu-root /mnt/iso/casper/filesystem.squashfs

# 查看系统信息
cat /tmp/ubuntu-root/etc/os-release
ls -la /tmp/ubuntu-root/boot/

# 提取特定配置文件进行分析
unsquashfs -f /mnt/iso/casper/filesystem.squashfs \
    "etc/fstab" "etc/network/interfaces" "etc/apt/sources.list"

# 查看已安装的软件包
unsquashfs -ll /mnt/iso/casper/filesystem.squashfs | grep "/usr/bin/"
提取容器镜像文件
# 从Docker镜像层中提取文件
# 首先导出Docker镜像为tar
docker save alpine:latest -o alpine.tar
tar -xf alpine.tar
# 找到layer.tar文件(实际是squashfs格式)
unsquashfs -d alpine-root layer.tar

# 或直接处理OCI镜像
unsquashfs -d container-root oci-image/blobs/sha256/abc123...

# 分析容器内容
unsquashfs -ll container-root | head -50
unsquashfs -f container-root "etc/passwd" "etc/group"

# 提取特定应用程序
unsquashfs -f container-root "usr/bin/nginx" "etc/nginx/"
固件逆向分析
# 解压路由器固件
binwalk -e firmware.bin  # 先使用binwalk提取
# 找到squashfs分区
unsquashfs -d firmware-root _firmware.bin.extracted/xxx.squashfs

# 分析固件结构
tree -L 3 firmware-root | head -30
unsquashfs -ll firmware-root | grep -E "(bin|sbin)/"

# 提取可执行文件进行分析
unsquashfs -f firmware-root \
    "sbin/httpd" "bin/busybox" "etc/config/"

# 查找敏感信息
grep -r "password\|secret\|key" firmware-root/etc/
游戏资源提取
# 提取游戏资源包
unsquashfs -d game-assets game_data.squashfs

# 仅提取纹理和模型文件
unsquashfs -f game_data.squashfs \
    "textures/" "models/" "sounds/"

# 查找特定类型的文件
unsquashfs -ll game_data.squashfs | \
    grep -i "\.png$\.jpg$\.wav$\.mp3$"

# 批量重命名提取的文件
unsquashfs -f game_data.squashfs "*.png"
for file in squashfs-root/*.png; do
    mv "$file" "${file%.png}_extracted.png"
done

unsquashfs vs mount 对比

对比项 unsquashfs mount -t squashfs
工作原理 完全解压到磁盘 挂载为只读文件系统
磁盘空间 需要两倍空间(压缩+解压后) 只需压缩文件空间
访问速度 文件访问快(已在磁盘) 实时解压,稍慢
修改文件 可以修改解压后的文件 只读,无法修改
内存占用 解压时占用内存,之后不占用 持续占用缓存内存
选择性访问 可以提取特定文件 访问任何文件都会解压相应块
使用场景 需要修改文件、离线分析、资源提取 只读访问、节省磁盘空间、实时系统
命令示例 unsquashfs file.squashfs mount -t squashfs -o loop file.squashfs /mnt
选择建议:
  • 需要修改文件提取特定文件时使用unsquashfs
  • 只需只读访问节省磁盘空间时使用mount
  • 大型文件系统考虑使用mount避免解压占用大量磁盘空间

性能优化指南

优化目标 推荐配置 说明
最快解压速度 -processors 0 -da 2M -fr 1M 多核+大缓冲区
最低内存占用 -p 1 -da 128K -fr 128K 单线程+小缓冲区
大文件解压 -da 4M -processors $(nproc) 大缓冲区+多核
小文件解压 -p 2 -da 256K 适中配置
仅查看信息 -no -l-s 不解压文件
批量处理 -quiet -no-progress 减少输出,适合脚本
磁盘IO优化 解压到SSD或tmpfs 加快文件写入速度
网络解压 先下载到本地再解压 避免网络延迟影响
最佳实践建议
  • 先查看后解压: 使用-l-ll查看内容,确认后再解压
  • 选择性提取: 使用-f提取所需文件,避免解压全部内容
  • 多核利用: 大文件解压时使用-processors选项加速
  • 内存管理: 内存有限时减小-da-fr
  • 磁盘空间: 确保目标目录有足够空间(通常是squashfs文件的2-3倍)
  • 权限处理: 使用-force-uid/gid避免权限问题

故障排除

问题 可能原因 解决方案
"磁盘空间不足" 1. 解压目录空间不够
2. 临时文件占用空间
1. 使用-d指定有空间目录
2. 清理临时文件
"权限被拒绝" 1. 目标目录无写权限
2. 文件权限限制
1. 使用sudo
2. 指定-force-uid/gid
"无效的文件系统" 1. 文件损坏
2. 格式不支持
3. 版本不兼容
1. 重新获取文件
2. 检查squashfs版本
3. 更新squashfs-tools
"解压速度慢" 1. 单线程解压
2. 磁盘速度慢
3. 压缩算法复杂
1. 使用-processors
2. 解压到SSD
3. 这是正常现象(如xz)
"内存不足"错误 1. 缓冲区设置过大
2. 系统内存不足
3. 文件系统碎片多
1. 减小-da/-fr
2. 增加swap空间
3. 使用-no-xattrs
"找不到文件"错误 1. 路径错误
2. 文件不存在
3. 大小写敏感
1. 先用-l查看
2. 检查路径拼写
3. 注意大小写
常见错误及解决方法
# 错误:unsquashfs: command not found
# 解决:安装squashfs-tools包
sudo apt install squashfs-tools

# 错误:FATAL ERROR: failed to write to file
# 解决:检查磁盘空间和权限
df -h /target/directory
ls -ld /target/directory

# 错误:Read on filesystem failed because Input/output error
# 解决:文件可能损坏,尝试重新下载或修复
# 首先验证文件完整性
file corrupt.squashfs
# 尝试挂载测试
mount -t squashfs -o loop,ro corrupt.squashfs /mnt/test

# 错误:lzma decompression failed
# 解决:可能是版本不兼容或文件损坏
unsquashfs -version
# 尝试更新squashfs-tools

# 错误:squashfs_read_data failed to read block
# 解决:使用-ddrescue尝试恢复数据
ddrescue -d -b 4096 corrupt.squashfs recovered.squashfs recovery.log
unsquashfs recovered.squashfs

常见问题解答

Q: unsquashfs解压后文件大小是多少?

A: 解压后文件总大小等于原始未压缩文件的大小。可以通过unsquashfs -s file.squashfs查看解压后大小,显示在"Filesystem size"字段中。

Q: 如何只查看squashfs内容而不解压?
# 查看文件列表
unsquashfs -l file.squashfs

# 查看详细信息(类似ls -l)
unsquashfs -ll file.squashfs

# 查看超级块信息
unsquashfs -s file.squashfs

# 统计文件数量
unsquashfs -l file.squashfs | wc -l

# 查找特定文件
unsquashfs -l file.squashfs | grep "filename"
Q: unsquashfs支持哪些压缩算法?

A: unsquashfs自动检测并支持所有squashfs支持的压缩算法:

  • gzip - 默认算法,兼容性好
  • lzo - 解压速度快
  • lz4 - 解压速度极快
  • xz - 高压缩率,解压较慢
  • zstd - 平衡性能,现代推荐
  • lzma - 传统高压缩算法
Q: 解压后如何重新打包成squashfs?
# 使用mksquashfs重新打包
mksquashfs extracted/ new.squashfs

# 指定压缩算法
mksquashfs extracted/ new.squashfs -comp zstd

# 保持原始压缩设置(如果知道)
# 首先查看原文件的压缩信息
unsquashfs -s original.squashfs | grep -i compression
# 然后使用相同设置打包
mksquashfs extracted/ new.squashfs -comp gzip -b 131072

相关命令

  • mksquashfs - 创建squashfs文件系统
  • mount - 挂载squashfs文件系统(只读访问)
  • binwalk - 固件分析工具,可识别squashfs
  • file - 识别文件类型,包括squashfs
  • squashfuse - 用户空间挂载squashfs
  • tar - 传统打包工具,可结合使用
  • cpio - 另一种归档工具
命令总结
  • 基本解压: unsquashfs 文件.squashfs
  • 指定目录: unsquashfs -d 目标目录 文件.squashfs
  • 查看内容: unsquashfs -l 文件.squashfs-ll
  • 选择性提取: unsquashfs -f 文件.squashfs "路径/文件"
  • 性能优化: -processors N(多线程)、-da 大小(缓冲区)
  • 权限控制: -force-uid-force-gid-no-xattrs
  • 信息显示: -s(超级块)、-i(inode)、-stat(统计)
  • 使用场景: 系统镜像分析、固件提取、容器镜像解压、资源提取