如何删除旧版本的已安装快照

rkm*_*max 124 linux

我是使用 snap 的新手,我的系统上安装的应用程序很少,运行命令时我注意到了一些df -h我发现安装了同一 snap 的不同版本

/dev/loop0       143M   143M     0 100% /var/lib/snapd/snap/gravit-designer/7
/dev/loop1        82M    82M     0 100% /var/lib/snapd/snap/core/4110
/dev/loop7       198M   198M     0 100% /var/lib/snapd/snap/polarr/3
/dev/loop2        82M    82M     0 100% /var/lib/snapd/snap/core/4206
/dev/loop3       143M   143M     0 100% /var/lib/snapd/snap/gravit-designer/6
/dev/loop10      137M   137M     0 100% /var/lib/snapd/snap/gravit-designer/5
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么他们保留在那里,我发现删除旧的唯一方法是删除并重新安装快照,有什么东西prune可以维护我的系统?

小智 144

这是一个简短的脚本,它将删除所有旧版本的快照。这只会保留当前的活动版本,这应该会为您恢复一些磁盘空间:

#!/bin/bash
# Removes old revisions of snaps
# CLOSE ALL SNAPS BEFORE RUNNING THIS
set -eu

LANG=C snap list --all | awk '/disabled/{print $1, $3}' |
    while read snapname revision; do
        snap remove "$snapname" --revision="$revision"
    done
Run Code Online (Sandbox Code Playgroud)

  • `/var/lib/snapd/cache` 中有一些硬链接,因此您也必须删除它们以释放空间。您可以使用 `sudo rm /var/lib/snapd/cache/*` 安全地删除缓存 (3认同)
  • 它成功删除了所有旧版本,但没有向我的磁盘添加空间! (2认同)
  • 为什么“在运行之前关闭所有快照”? (2认同)

Mus*_*did 74

从捕捉v2.34开始以后,你可以设置通过设置存储每个包扣修订的最大数量refresh.retain的选项,它只能是数字2和20之间,并具有3缺省值

sudo snap set system refresh.retain=2 
Run Code Online (Sandbox Code Playgroud)

  • @PeterKrauss 这取决于您的存储设备容量。它与您的 RAM 容量无关。 (4认同)
  • 执行此操作后,从默认 3 移动到新设置 2,当前版本何时清除? (2认同)

Ger*_*erg 63

来自另一个答案脚本版本,作为单行,没有awk依赖:

# snap list --all | while read snapname ver rev trk pub notes; do if [[ $notes = *disabled* ]]; then snap remove "$snapname" --revision="$rev"; fi; done
Run Code Online (Sandbox Code Playgroud)

这可能需要bash[[构造兼容的外壳。

  • 这应该由可以添加快照的用户运行。在 Ubuntu Core 上,管理员用户可以工作,在普通 Ubuntu 上,可能需要一个 `sudo -i` 会话,或者可能需要使用 `sudo` 运行 `snap remove`。 (7认同)
  • @anon58192932 `#` 提示表明命令应该从 root shell 运行。(这是一个[通用约定](https://askubuntu.com/questions/706186/difference-between-and-in-linux-environment)以及提示变量中的`\$`会给出什么)另见第一条评论。 (3认同)
  • 是的, --al 输出是本地化的,但是如果您知道您的语言中“禁用”一词是什么,您可以在命令中替换它:)您可以通过 `snap list --all` 找到 (2认同)

小智 33

版本上snapd 文档指出应自动删除过时的修订版,以便安装的修订版不超过最后两个修订版。但是,我还看到安装了两个以上版本的快照。

您可以列出所有修订snap list --all以查看以下内容:

Name     Version                  Rev   Tracking  Developer  Notes
core     16-2.31.2                4206  stable    canonical  core,disabled
core     16-2.32.3                4407  stable    canonical  core,disabled
core     16-2.32.5                4486  stable    canonical  core
spotify  1.0.70.399.g5ffabd56-26  5     stable    spotify    disabled
spotify  1.0.72.117.g6bd7cc73-35  6     stable    spotify    disabled
spotify  1.0.77.338.g758ebd78-41  13    stable    spotify    -
Run Code Online (Sandbox Code Playgroud)

您可以使用snap remove spotify --revision=5.

即使对于禁用的修订版core和其他依赖项,这也是安全的,并且snap remove显式--revision=...甚至可以防止您删除非disabled快照。


小智 7

@popey 在他们的答案中共享的代码实际上有时会失败,因为一些损坏的包没有版本信息。所以我修改了代码来克服这个问题。

#!/bin/bash
# Removes old revisions of snaps
# CLOSE ALL SNAPS BEFORE RUNNING THIS
set -eu

snapsToRemove=$(LANG=en_US.UTF-8 snap list --all | awk '/disabled/{print $1, $2, $3}')

while read snapname version revision; do
    if [[ "$revision" == *[a-zA-z]* ]]; then
        # Version field is empty. Revision is in second field
        revision=$version
    fi
        snap remove "$snapname" --revision="$revision"
done <<< $snapsToRemove
Run Code Online (Sandbox Code Playgroud)