unsquashfs 是squashfs-tools工具集的一部分,专门用于解压和提取.squashfs文件系统中的内容。与直接挂载squashfs文件不同,unsquashfs将文件系统完全解压到普通目录中,便于修改和查看原始文件结构。
# 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 [选项] 输入文件.squashfs
# 指定解压目录
unsquashfs [选项] -d 目标目录 输入文件.squashfs
# 提取特定文件
unsquashfs [选项] -f 输入文件.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选项选择特定文件,必须完全解压
# 从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 |
mount -t squashfs |
|---|---|---|
| 工作原理 | 完全解压到磁盘 | 挂载为只读文件系统 |
| 磁盘空间 | 需要两倍空间(压缩+解压后) | 只需压缩文件空间 |
| 访问速度 | 文件访问快(已在磁盘) | 实时解压,稍慢 |
| 修改文件 | 可以修改解压后的文件 | 只读,无法修改 |
| 内存占用 | 解压时占用内存,之后不占用 | 持续占用缓存内存 |
| 选择性访问 | 可以提取特定文件 | 访问任何文件都会解压相应块 |
| 使用场景 | 需要修改文件、离线分析、资源提取 | 只读访问、节省磁盘空间、实时系统 |
| 命令示例 | unsquashfs file.squashfs |
mount -t squashfs -o loop file.squashfs /mnt |
unsquashfsmountmount避免解压占用大量磁盘空间| 优化目标 | 推荐配置 | 说明 |
|---|---|---|
| 最快解压速度 | -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值-force-uid/gid避免权限问题| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| "磁盘空间不足" | 1. 解压目录空间不够 2. 临时文件占用空间 |
1. 使用-d指定有空间目录2. 清理临时文件 |
| "权限被拒绝" | 1. 目标目录无写权限 2. 文件权限限制 |
1. 使用sudo2. 指定 -force-uid/gid |
| "无效的文件系统" | 1. 文件损坏 2. 格式不支持 3. 版本不兼容 |
1. 重新获取文件 2. 检查squashfs版本 3. 更新squashfs-tools |
| "解压速度慢" | 1. 单线程解压 2. 磁盘速度慢 3. 压缩算法复杂 |
1. 使用-processors2. 解压到SSD 3. 这是正常现象(如xz) |
| "内存不足"错误 | 1. 缓冲区设置过大 2. 系统内存不足 3. 文件系统碎片多 |
1. 减小-da/-fr2. 增加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
A: 解压后文件总大小等于原始未压缩文件的大小。可以通过unsquashfs -s file.squashfs查看解压后大小,显示在"Filesystem size"字段中。
# 查看文件列表
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"
A: unsquashfs自动检测并支持所有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 - 固件分析工具,可识别squashfsfile - 识别文件类型,包括squashfssquashfuse - 用户空间挂载squashfstar - 传统打包工具,可结合使用cpio - 另一种归档工具unsquashfs 文件.squashfsunsquashfs -d 目标目录 文件.squashfsunsquashfs -l 文件.squashfs 或 -llunsquashfs -f 文件.squashfs "路径/文件"-processors N(多线程)、-da 大小(缓冲区)-force-uid、-force-gid、-no-xattrs-s(超级块)、-i(inode)、-stat(统计)