为什么Flatpak软件包仓库文件夹这么大?

有人知道为什么$HOME/.local/share/flatpak/repo目录下有这么多文件(69k)而且这么大(2Gb)吗?那是什么东西?反正我几乎不怎么用flatpaks....

我猜备份(deja-dup)中不包括flatpak目录也没关系。

顺便说一句,看起来里面有硬链接,因为flatpak文件夹的文件数量是原来的两倍,但总大小相同。


1我有一个单一的0c对象文件,大小为1.1G! - xgdgsc
你是用--user安装的吗?提供flatpak list --show-details --app --runtime的输出来列出所有应用程序和运行时的安装详细信息(包括所有列)。运行sudo flatpak uninstall --unused(使用--user只针对用户范围)来卸载未使用的引用(在测试之前/之后使用du -sh ~/.local/share/flatpak/repo)。repair --user修剪对象。顺便说一句,你可以随时清理缓存(sudo rm -rfv /var/tmp/flatpak-cache-* ~/.cache/flatpak/**)。 - Pablo Bianchi
@PabloBianchi 那个列表命令真是太棒了。能否查看一个软件包所依赖的内容呢?我有六个 org.gnome.Platform 的版本,每个占用了大约1GB的空间,但几乎没有实际需要这些版本的应用程序。 - Oli
1@Oli 这是可用运行时之一,也是应用程序的基本依赖项。您可以使用flatpak list --app --columns=application,runtime列出哪个应用程序使用哪个运行时,或者使用--app-runtime=列出使用特定运行时的应用程序。flatpak uninstall –unused应该删除(系统和用户)未使用的运行时。您是否有早于1.9.1的flatpak版本? - Pablo Bianchi
2个回答

Flatpak软件包以沙盒模式运行:因此,按设计,即使是较小的应用程序,flatpak也会占用相当多的磁盘空间,因为它会拉取应用程序的所有依赖项并独立运行。这种设计的优点是您不需要担心可能破坏您的应用程序的系统依赖项和更新。然而,它占用了大量的磁盘空间。

因此,用户唯一能做的就是监控flatpak的大小并定期进行清理。个人而言,我有一个名为“spring-cleaning”的脚本,我定期使用它来清理系统(其中包含与flatpak相关的部分)。

通用清理

  • Flatpak应用程序可能共享一些运行时包,这些包代表着应用程序的基本依赖关系:如果一个运行时已经安装在您的系统中,但没有被任何Flatpak应用程序使用(flatpak list --app --columns=application,runtime可以列出哪个应用程序使用了哪个运行时),您可以使用flatpak uninstall --unused命令将其删除。这是一次清理操作,第一次运行时可能会产生很大的效果,但是随后的清理可能不会有显著的影响。
  • Flatpak应用程序可能在/var/lib/flatpak/repo/objects文件夹中创建对象,这些对象可能会占用相当大的空间。要清理这些没有明确引用其应用程序的对象,您需要运行以下命令(使用sudo,因为您正在清理系统文件夹中的对象):sudo flatpak repair。每次运行该命令时,此清理操作的影响可能是显著的。
  • Flatpak缓存文件也可以在系统和用户文件夹中删除。您可以运行sudo rm -rfv /var/tmp/flatpak-cache-*rm -rfv ~/.cache/flatpak/*
具体清理
- 您可以卸载您不需要的应用程序,或者如果可行的话,用.deb版本的应用程序替换那些占用空间较大的应用程序。您可以通过大小对flatpak应用进行排序 flatpak --columns=name,size --user list,然后使用应用程序名称卸载应用程序 flatpak uninstall <flatpak_app_name> 结合在一个脚本中(以sudo权限运行)
#!/bin/bash

# Error status variables
STATUS_OK=0
STATUS_ERROR=1

# Definitions
USER_NAME="${SUDO_USER:-${USER}}"
USER_DIR="/home/${USER_NAME}"

# Execute it as root user
if [ "${USER}" != root ]; then
  echo "ERROR: must be root! Exiting..."
  exit "${STATUS_ERROR}"
fi

# Current status
USED_BEFORE="$(df -k / | awk 'NR>1 {print $3}')"

# flatpak cleanup
if [ -n "$(command -v flatpak)" ]; then
  flatpak repair &> /dev/null
  # Remove flatpak cache
  rm -rf /var/tmp/flatpak-cache-*
  sudo -u "${USER_NAME}" rm -rf "${USER_DIR}"/.cache/flatpak/*
  # Remove unused flatpak runtimes
  if [ -n "$(flatpak list --runtime)" ]; then
    flatpak uninstall --unused
  fi
fi

# Current status
USED_AFTER="$(df -k / | awk 'NR>1 {print $3}')"

# Summary
echo "Freed up space: $(( (USED_BEFORE - USED_AFTER)/1024 )) MB"
exit "${STATUS_OK}"

1非常好的回答和方便的脚本!只有一个注意事项:虽然这个脚本没有问题,但建议不要使用全大写来命名变量,以免意外覆盖任何环境或内部变量,因为按照惯例它们都使用全大写。你可以在以下帖子中阅读更多信息:Shell脚本的变量命名规范正确的Bash和shell脚本变量大小写 - BeastOfCaerbannog
1谢谢你的积极反馈 :-) 我知道你在我的脚本中观察到了什么,可以说我使用这种约定是因为我想立即区分出我的脚本中的变量。这也是我使用花括号的原因,虽然它们并非必需。 - Lorenz Keel

Flatpaks are "sandboxed", 意味着应用程序需要的任何缓存、大型库等都存储在这些目录中。这意味着这些目录的文件大小通常非常大。