问题
阅读了许多帖子/论坛主题后,我仍然不明白我的硬盘是否还剩余一些空间......
我开始研究它,因为我今天安装了 Syncthing,并且出现一个通知错误,说我的磁盘几乎已满,并且 syncthing 无法运行,但我认为我还剩下大约 40 个 Go...
我尝试去理解和解决它
- 运行磁盘分析器(在系统根目录):显示 480 GB 磁盘上共计 470.9 Go,已占用 441.3 Go,可用 45.4 Go
- 以 sudo 身份运行磁盘分析器(在系统根目录):显示 480 GB 磁盘上共计 470.9 Go,其中 443.6 Go 已占用,45.4 Go 可用
注意:我不明白为什么只有“占用”大小不同......并且我假设 470 和 480 之间的 10 Go 差异是由于系统保留的内存或类似的东西(?)。
- 跑了
df
输出/dev/sda5 459849800 433180284 3236916 100% /
表明它已满......
- 跑了
sudo du -h --max-depth=1 /
输出:
48G /var
0 /sys
4,0K /srv
4,0K /mnt
72M /root
63G /snap
4,0K /cdrom
1,9G /opt
22M /etc
du: impossible de lire le répertoire '/proc/3353/task/3353/net': Argument invalide
du: impossible de lire le répertoire '/proc/3353/net': Argument invalide
du: impossible de lire le répertoire '/proc/6203/task/6203/net': Argument invalide
du: impossible de lire le répertoire '/proc/6203/net': Argument invalide
du: impossible d'accéder à '/proc/80737/task/80737/fd/3': Aucun fichier ou dossier de ce nom
du: impossible d'accéder à '/proc/80737/task/80737/fdinfo/3': Aucun fichier ou dossier de ce nom
du: impossible d'accéder à '/proc/80737/fd/4': Aucun fichier ou dossier de ce nom
du: impossible d'accéder à '/proc/80737/fdinfo/4': Aucun fichier ou dossier de ce nom
0 /proc
325G /home
16K /lost+found
0 /dev
368K /tmp
272M /boot
21G /usr
8,0K /media
du: impossible d'accéder à '/run/user/1000/gvfs': Permission non accordée
du: impossible d'accéder à '/run/user/1000/doc': Permission non accordée
4,0M /run
460G /
所以说 470 Go 总共有大约 10G 是免费的。
安装后
ncdu
显示du
磁盘使用情况459,2 GiB
跑了
lsof -nP +L1
输出了1413行“已删除”文件(大多数是“memfd:mozilla-ipc”……),大小不一。但我没找到如何汇总所有这些文件以检查总磁盘使用情况。
- 运行(在另一个 askubuntu 线程
find /proc/[0-9]*/fd -lname '*(deleted)' 2>/dev/null | perl -lne '($l = readlink) =~ s/ (deleted)$//; print -s, " $_ $l"' | sort -g
上找到的命令)按文件大小对结果进行排序
输出1516行,这里是前十行 - 我认为第一个数字是字节大小(?):
2482816 /proc/2758/fd/378 /memfd:gdk-wayland (deleted)
5439888 /proc/2758/fd/322 /memfd:gdk-wayland (deleted)
6031750 /proc/22782/fd/28 /tmp/.org.chromium.Chromium.7Uj5wU (deleted)
6987776 /proc/5122/fd/30 /memfd:mozilla-ipc (deleted)
8087040 /proc/2758/fd/351 /memfd:gdk-wayland (deleted)
8294400 /proc/2758/fd/224 /memfd:gdk-wayland (deleted)
8783424 /proc/2758/fd/327 /memfd:gdk-wayland (deleted)
8783424 /proc/2758/fd/360 /memfd:gdk-wayland (deleted)
9216000 /proc/2758/fd/331 /memfd:gdk-wayland (deleted)
67108864 /proc/2671/fd/6 /memfd:pulseaudio (deleted)
问题
- 我处于不知道我的磁盘是否真的已满的状态……数字中有很多不一致之处(我不是说数字是错的,我想它们并不总是意味着同一件事,但这对我来说是难以理解的)。所以如果有人能帮助我理解这一点,我将不胜感激!
- 我不知道它是否因为“已删除”文件占用空间而满了。任何关于如何测量已删除文件的磁盘使用情况的帮助也将不胜感激
- 最后,我不明白为什么我看到的
63G /snap
是du
而磁盘分析器却说它只有188,4 ko
。我知道这个文件夹中有指向 的符号链接,看起来这些符号链接(到/var/lib/snapd/snaps/
)占了 24 G。du
这 24 G 是否也在 的 63 G 中/snap
?我检查了du
的输出/snap
,看起来不像是这样……但是将 63 G 添加到磁盘分析器输出会导致总大小高于实际磁盘大小……这让我完全不知所措……
如果您需要更多信息,请告诉我,我很乐意提供给您:)
編輯
完整df
输出(/dev/sda5 的数字不同,因为我腾出了一些空间......):
Sys. de fichiers blocs de 1K Utilisé Disponible Uti% Monté sur
tmpfs 1625812 2204 1623608 1% /run
/dev/sda5 459849800 414179712 22237488 95% /
tmpfs 8129044 24768 8104276 1% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
/dev/sda1 523248 4 523244 1% /boot/efi
tmpfs 1625808 1720 1624088 1% /run/user/1000
为了更好地理解这一切,我进行了进一步调查,发现系统上的磁盘程序显示我有一个sda2
分区:
- 480 GB(479 564 137 472 字节)
但这些字节实际上是 480 GB(10^9 字节),但只有446.6 GB。该程序还显示sda5
分区有 47 GB 可用空间,与磁盘分析器给出的 46.8 GB 相对应...
我从来没有意识到磁盘存储空间是以“有利的”千兆字节(10^9)给出的,现在更好地理解了为什么我看到输出和磁盘分析器之间有如此“大”的差异df
。
您的问题混淆了很多不同的事情,这可能就是为什么您很难理解发生了什么。
让我们从最后一个开始, 中的“已删除”文件
/proc
。/proc
不是磁盘上的真实目录;它是一个虚拟文件系统,反映了系统中进程的状态。 中的“文件”/proc/xxxx/fd
表示当前由进程号打开的文件描述符。 文件描述符可能指磁盘上的实际文件,但也可能指几乎任何其他东西,因为在类 Unix 系统中,程序可以从中读取数据或向其中写入数据的几乎所有东西都表示为“文件”。xxxx
您输入的命令会在行末显示这些文件描述符引用的实际对象。如您所见,它们大多数以 开头,
/memfd:
这意味着它们只是用于程序间通信的内存块,程序已分配这些内存块,然后如另一个答案中所述“删除”(这实际上会导致内存块在程序停止使用后自动释放)。那里只有一个实际文件,即/tmp/.org.chromium.Chromium.7Uj5wU
。如果您不是对调试系统中运行的任何软件不感兴趣的程序员,那么您基本上不必关心 的内容
/proc
。同样/sys
, 也是用于与操作系统内核通信的伪目录, 和/dev
代表计算机中存在并被操作系统识别的各种设备。这将我们带到下一个主题,即
du
命令的输出。它具有误导性,因为它包含的“目录”只是其他文件系统的挂载点,而不是您感兴趣的文件系统,即放置在/dev/sda5
磁盘分区上的根文件系统,如命令的输出df
所示。(顺便说一句。您的df
输出是否只有一行引用您发布的分区?通常,df
还应该输出一大堆其他行,引用所有文件系统。)/snap
您想知道此输出中的一个误导性条目。下面的所有子目录实际上都是目录中文件/snap
中包含的虚拟文件系统的挂载点,并且该目录是它们实际占用磁盘空间的地方。磁盘分析器似乎只计算下面的实际子目录结构的大小,而忽略这些挂载,而只是将它们视为常规目录中的常规文件。因此,磁盘分析器在这一点上是正确的。*.snap
/var/lib/snapd/snaps
/snap
du
您缺少的是
-x
参数 todu
- 它指示du
忽略属于不同文件系统的目录。这样,您将摆脱du
输出中的误导性条目。顺便说一句。如果您想知道什么挂载在哪里,只需输入
mount
命令 - 它将向您显示所有文件系统及其挂载点。您可以看到有多个虚拟文件系统(或“伪文件系统”),如sysfs
、等tmpfs
,cgroup
挂载在各个目录中,您还将看到文件循环挂载到目录/var/lib/snapd/snaps
的子目录中/snap
。接下来,我们来看看您的
df
输出。它说,在根文件系统上可用的 459849800 KB 中,已使用 433180284 KB,剩余 3236916 KB 可用。但是,433180284+3236916 的总和不等于 459849800,而只有 436417200。为什么会这样?正如另一个答案中提到的,大约 5% 的磁盘空间是为 root 进程保留的,这意味着以 root 身份运行的进程可以使用剩余的 459849800-436417200=23432600 KB,而以普通用户身份运行的进程则不能。在可供用户进程使用的空间(436417200 KB)中,已使用 433180284 KB,即 99.2% -df
显然将其四舍五入为 100%。如果有任何疑问和不一致的数字,您应该依靠
df
显示的内容,因为它显示的数据与操作系统在尝试为新文件分配空间时实际“看到”的数据相同。如果df
显示 0 KB 可用,那么您将无法向磁盘写入任何内容。就您而言,您仍然有大约 3 GB 的可用空间。这df
就是您的磁盘是否已满的问题的最终答案。最后,为什么以 root 身份运行的磁盘分析器显示的占用大小与以普通用户身份运行的磁盘分析器显示的占用大小不同?简单来说,这是权限问题。如果以非 root 身份运行,程序根本无法访问某些目录,因此无法计算其中文件的大小。因此,这些文件不会计入“占用”计数。在这种情况下,磁盘分析器应该在窗口顶部向您显示一个醒目的警告,提示它无法扫描某些目录。
但是,我不明白的是,为什么它显示有 45G 可用空间,而实际上并非如此。从我的实验来看,磁盘分析器似乎考虑了为 root 保留的可用空间(省略
df
了),但在您的情况下,root 可用空间和用户程序可用空间的总和约为 26G,而不是 45。我还注意到,磁盘分析器显然使用十进制千兆字节(1000x1000x1000 字节)显示数字,而像du
和这样的工具在与参数df
一起运行时使用二进制千兆字节(1024x1024x1024 字节),因此磁盘分析器中的数字会略大(大约 1.07 倍),但这仍然不会将 26G 更改为 45G。所以我不明白 45G 是从哪里来的。也许是磁盘分析器中的一些错误,也许其他人可以解释它。-h
“磁盘空间”是每个文件系统的概念,而不是每个磁盘或每个分区的概念。
作为微型磁盘时代的遗留问题,为了防止系统管理员通宵达旦,5% 的磁盘空间被保留给
root
(UID
0
) 进程。因此,sudo df | grep -v loop
和df | grep -v loop
会得到不同的结果。(deleted)
files 是进程用来临时使用的文件(例如缓存)。一般方法是:inode
。unlink()
(删除)该文件,这将清除该文件的目录条目,但不会释放磁盘空间,因为“使用计数”已在步骤 3 中增加。close()
删除时(进程删除时关闭所有打开的文件exit
),inode中的“use-count”会减少,如果“use-count”为零,则释放磁盘空间。这是程序员管理临时文件的方式,程序结束时会自动删除这些文件。另一种不好的方式是要求程序员跟踪所有临时文件并捕获所有可能的程序故障以进行清理。