如果我刪除 BtrFS 快照中的檔案會發生什麼情況?

如果我刪除 BtrFS 快照中的檔案會發生什麼情況?

我有一台早期使用 BtrFS 啟動的 openSUSE 計算機(如 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)似乎是根本原因。

相關內容