如果我删除 BtrFS 快照中的文件会发生什么?

如果我删除 BtrFS 快照中的文件会发生什么?

我有一台 openSUSE 计算机,它很早就开始使用 BtrFS(例如 Leap 42.2)。过去有一段时间,/tmp 子卷已满(一个大文件),我无法恢复空间,直到重新启动(rm触发了No space left on device)。然后一切看起来都很好,至少有一年了。

但是最近(同时在 Leap 15.1)BtrFS 又满了,我不知道该怎么办:我有许多这样的快照:

# ls -l /.snapshots/
total 4
drwxr-xr-x 1 root root  32 Dec 18  2015 1
drwxr-xr-x 1 root root  32 May 14 09:45 1820
drwxr-xr-x 1 root root  66 May 14 09:46 1821

...

drwxr-xr-x 1 root root  32 Aug  8 08:08 1926
drwxr-xr-x 1 root root  38 Aug  8 08:09 1927
drwxr-xr-x 1 root root  38 Aug  8 08:12 1928

在成功检查了所有块的校验和(没有问题)后,我开始“平衡”,希望出现一些可用空间。但平衡似乎永远无法完成,所以我试图中止它。等待平衡至少 15 分钟后,我重新启动了计算机以尝试其他方法。当时文件系统已满 99%。

1我本想使用清理最旧的快照 ( ) rm -rf /.snapshots/1。不幸的是,完成后,来自的重要程序/usr消失了,我的系统无法启动!

所以我的问题是:这是预期的行为,还是我做错了什么?如果我做错了什么,删除旧快照的正确步骤是什么?

答案1

删除后出现的问题似乎/.snapshots/1不是 BtrFS 本身的功能,而是 SUSE Linux 的一个(错误?)功能:

我不记得根文件系统是什么,但在类似的 SLES 15.0 系统上,我注意到快照1被安装为根文件系统(无论出于什么原因):

sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,size=16329060k,nr_inodes=4082265,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,size=24506344k)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
#...
/dev/sda2 on / type btrfs (rw,relatime,space_cache,subvolid=267,subvol=/@/.snapshots/1/snapshot)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=38,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=14427)
#...
/dev/sda2 on /.snapshots type btrfs (rw,relatime,space_cache,subvolid=266,subvol=/@/.snapshots)
/dev/sda2 on /opt type btrfs (rw,relatime,space_cache,subvolid=263,subvol=/@/opt)
/dev/sda2 on /usr/local type btrfs (rw,relatime,space_cache,subvolid=259,subvol=/@/usr/local)
/dev/sda2 on /var type btrfs (rw,relatime,space_cache,subvolid=258,subvol=/@/var)
#...
/dev/sda2 on /root type btrfs (rw,relatime,space_cache,subvolid=262,subvol=/@/root)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=3267512k,mode=700)

subvol=/@/.snapshots/1/snapshot)似乎是根本原因。

相关内容