[Internal testing communication] 磐石系统空间使用分析工具
Tofloor
poster avatar
electricface
deepin
2026-02-10 15:50
Author

磐石系统空间使用分析工具.zip

依赖工具 gdu 网盘链接:https://pan.quark.cn/s/4e5e0d74f5c6

OSTree 仓库中文件大小排行工具

简介

ostree-repo-objects-top.py 是一个用于分析 OSTree 仓库硬盘空间使用情况的工具。它能够:

  • 找出占用空间最大的前 N 个对象文件(默认 100)
  • 显示对象文件的 hash 值
  • 查找这些对象属于哪些 OSTree 分支
  • 显示对象在各分支中的检出路径

依赖

  • python3 - 默认已安装
  • ostree - OSTree 版本控制系统,默认已安装
  • gdu - 磁盘使用分析工具,是 ncdu 的现代化替代品,需要手动安装

安装依赖

安装 gdu

因为仓库中 gdu 版本不够高,没有所需的 -t 选项,所以不推荐用 apt install gdu 安装。

https://github.com/dundee/gdu/releases/latest 下载对应平台的二进制文件并安装。

比如执行命令:

cd /tmp && \
curl -L https://github.com/dundee/gdu/releases/download/v5.32.0/gdu_linux_amd64.tgz -o gdu.tgz && \
tar -xzf gdu.tgz && \
sudo cp gdu_linux_amd64 /usr/local/bin/gdu && \
sudo chmod +x /usr/local/bin/gdu && \
gdu --version

输出版本:

Version:         v5.32.0
Built time:      Sat Nov 22 12:00:38 PM CET 2025
Built user:      dundee

使用方法

基本用法

系统层仓库:

python3 ostree-repo-objects-top.py --repo /sysroot/ostree/repo

数据层仓库:

python3 ostree-repo-objects-top.py --repo /persistent/ostree/repo

指定显示数量

增加 --top N 选项,比如:

python3 ostree-repo-objects-top.py --repo /persistent/ostree/repo --top 50

参数说明

  • --repo: OSTree 仓库路径(必需)
  • --top: 显示最大的前 N 个对象(可选,默认:100)

输出说明

脚本会输出占用空间最大的前 N 个对象文件,按大小降序排列,每个对象包含以下信息:

  1. 序号和大小[1] 515.2 MiB
  2. 对象文件路径 /persistent/ostree/repo/objects/13/1bee...a7ac.file
  3. Hash 值: 完整的 64 位十六进制校验码
  4. 所属分支及检出路径: 该对象在哪些分支中被引用,以及对应的文件路径

输出示例

[1] 515.2 MiB       /persistent/ostree/repo/objects/13/1bee107bc56e42c873bbd572b024fff99461b8c153a76341cb8a7207a3a7ac.file
    Hash: 131bee107bc56e42c873bbd572b024fff99461b8c153a76341cb8a7207a3a7ac
    所属分支及检出路径:
      - deployment/0/1: /opt/apps/com.qq.weixin.work.deepin/files/files.7z

[2] 515.2 MiB       /persistent/ostree/repo/objects/2c/d280dcc95855a6742accaa57a78d5db34a773ef91dd5ffe95339cd76ae083a.file
    Hash: 2cd280dcc95855a6742accaa57a78d5db34a773ef91dd5ffe95339cd76ae083a
    所属分支及检出路径:
      - deployment/0/0, deployment/0/booted, tmp/merge-cache: /opt/apps/com.qq.weixin.work.deepin/files/files.7z

[3] 252.6 MiB       /persistent/ostree/repo/objects/3a/4a5df460d7003ff9c6c355e31798da9e3cd856e6f6a21a3ba4213ec4d1e7ad.file
    Hash: 3a4a5df460d7003ff9c6c355e31798da9e3cd856e6f6a21a3ba4213ec4d1e7ad
    所属分支及检出路径:
      - deployment/0/0, deployment/0/booted, tmp/merge-cache: /opt/google/chrome/chrome

[4] 249.0 MiB       /persistent/ostree/repo/objects/92/117d8080dde7331e3175502f07a3c7f6b0b6f4397c278422e96d0575068e6a.file
    Hash: 92117d8080dde7331e3175502f07a3c7f6b0b6f4397c278422e96d0575068e6a
    所属分支及检出路径:
      - deployment/0/1: /opt/google/chrome/chrome

输出字段解释

  • 序号: 按大小排序的序号,从大到小
  • 大小: 对象文件的实际大小(MiB、GiB 等)
  • 对象路径: OSTree 仓库中的对象存储路径
  • Hash: 对象的完整校验码(由目录名前两位 + 文件名组成)
  • 所属分支及检出路径: 显示该对象在哪些 OSTree 分支中被引用,以及对应的文件系统路径
    • 格式: 分支名: 文件路径
    • 当多个分支引用同一个文件路径时,分支名会用逗号分隔显示在同一行(如 deployment/0/0, deployment/0/booted: /opt/apps/...

工作原理

  1. 扫描对象: 使用 gdu -p -t N 扫描仓库,找出占用空间最大的前 N 个对象文件
  2. 提取 Hash: 从对象文件路径中提取对象的 hash 值(ostree checksum值)
  3. 枚举分支: 执行 ostree refs 获取所有分支列表
  4. 建立索引: 对每个分支执行 ostree ls -RC ,然后建立 hash 到检出路径的映射
  5. 输出结果: 显示每个大对象所属的分支和检出路径

使用场景

  • 诊断 OSTree 仓库磁盘空间占用问题
  • 查找重复或冗余的大文件
  • 分析不同分支间的文件共享情况

重复文件诊断工具

简介

dup_file_check.py 是一个用于不可变系统的重复文件诊断工具。它可以帮助你了解某个路径的文件在系统各层中的分布情况、硬链接关系,以及与 OSTree 仓库的一致性。

对于 ostree 仓库中体积排名靠前的文件,可以使用本工具进行识别和确认。

它具有以下功能:

  • 多层文件检查:检查文件在上修改层、下修改层、数据层、系统层这些层的状态
  • 硬链接检测:识别多个路径是否指向同一个文件
  • OSTree 校验:验证文件与相关 OSTree 仓库的对象文件的 inode 一致性

使用方法

python3 dup_file_check.py <路径>

路径必须以 /etcopt/usr 开头。

示例

# 检查 /usr 下文件
python3 dup_file_check.py /usr/bin/python3.12

输出说明

1. 原始路径信息

显示指定路径的当前状态:

检查路径: /usr/bin/python3.12
原始路径信息:
--------------------------------------------------------------------------------
状态: ✓ 存在
  路径: /usr/bin/python3.12
  Inode: 9223372036855339774 (真实 inode: 563966)
  硬链接计数: 4
  大小: 7.7 MB
  Hash: a5ff20fa863ed2d141084efe38d08768f96832b62f39771355b8832d876ae5d3
  /ostree/repo:
    Object: ✓ 存在
    Inode 一致性: ✓ 一致 (Object Inode: 563966)

字段说明:

  • 状态:文件是否存在(✓ 存在 / ✗ 不存在)
  • Inode:文件在文件系统中的唯一标识(括号内为真实 inode,用于 OverlayFS 场景)
  • 硬链接计数:有多少个路径指向该文件 inode
  • 大小:文件大小(人类可读格式)
  • Hash:文件的 OSTree checksum
  • /persistent/ostree/repo/ostree/repo:显示文件在两个 OSTree 仓库中的对象状态
    • Object:对象文件是否存在(✓ 存在 / ✗ 不存在)
    • Inode 一致性:比较原文件与仓库对象的 inode 是否一致(用于检测硬链接关系)

2. 各 Deploy 层信息

按 Deploy 显示文件在各层的状态:

Deploy 0 3dc0a91fe55ba7b1b57fe30b8ddb8557bfb56ddd0f78b30adae303f82941aea6.0

上修改层: ✗ 不存在
  路径: /persistent/overlay/data/layer-7eeb967e66872c77/usr/bin/python3.12

下修改层: ✗ 不存在
  路径: /persistent/overlay/data/layer-403c140718d1abd5/usr/bin/python3.12

数据层: ✗ 不存在
  路径: /persistent/ostree/data/3dc0a91fe55ba7b1b57fe30b8ddb8557bfb56ddd0f78b30adae303f82941aea6.0/checkout/usr/bin/python3.12

系统层: ✓ 存在
  路径: /ostree/deploy/deepin/deploy/223fcc7cd4f4c25729928471f9de747a819719810f6ec960f209dcac20b810b3.1/usr/bin/python3.12
  Inode: 563966
  硬链接计数: 4
  大小: 7.7 MB
  Hash: a5ff20fa863ed2d141084efe38d08768f96832b62f39771355b8832d876ae5d3
  /ostree/repo:
    Object: ✓ 存在
    Inode 一致性: ✓ 一致 (Object Inode: 563966)
  ...

层级说明:

  • 上修改层:上修改层目录,Overlay FS 的上层目录,系统修改暂存之处
  • 下修改层:下修改层目录,Overlay FS 的更下一层目录,也是缓存系统修改。
  • 数据层:数据层 OSTree 仓库检出的文件
  • 系统层:系统层 OSTree 仓库检出的文件

3. 汇总信息

显示硬链接检测结果:

汇总信息:
文件路径数量: 4
检测到硬链接: 有 4 个文件路径指向 1 个 inode

  真实 inode 563966:
    硬链接计数: 4
    大小: 7.7 MB
    路径列表:
      - /ostree/deploy/deepin/deploy/223fcc7cd4f4c25729928471f9de747a819719810f6ec960f209dcac20b810b3.1/usr/bin/python3.12
      - /ostree/deploy/deepin/deploy/223fcc7cd4f4c25729928471f9de747a819719810f6ec960f209dcac20b810b3.0/usr/bin/python3.12
      - /ostree/deploy/deepin/deploy/ceba75ed79795c22b64c81f0e57f07fc00831e4559b75e7a40c0796e0537a798.0/usr/bin/python3.12
      - /ostree/repo/objects/a5/ff20fa863ed2d141084efe38d08768f96832b62f39771355b8832d876ae5d3.file

汇总说明:

  • 文件路径数量:总共找到的文件路径数(包含各部署 Deploy 的所有层级)
  • 检测到硬链接:多个路径指向同一个 inode,表示它们是同一个文件(节省磁盘空间)
  • 硬链接计数:系统记录的硬链接总数(可能包含本工具未扫描到的路径)
  • 路径列表:本工具发现的该 inode 对应的所有文件路径

注意事项

  • 可能需要 root 权限:访问某些文件可能需要加 sudo
  • 路径限制:只支持 /etc/opt/usr 三个目录

权限不足

使用 sudo 运行:

sudo python3 dup_file_check.py /usr/xxx/yyy

路径不支持

只支持以下路径格式:

# ✅ 正确
python3 dup_file_check.py /etc/fstab
python3 dup_file_check.py /usr/bin/python3

# ❌ 错误
python3 dup_file_check.py /home/user/file
Reply Favorite View the author
All Replies
jjcui8595
deepin
2026-02-10 18:19
#1

like

Reply View the author