了解磁盘空间都去了哪里?

了解磁盘空间都去了哪里?

我正在使用Debian。df -h显示我正在使用大约 275GB:

 Filesystem                 Size  Used Avail Use% Mounted on
rootfs                     315G  274G   26G  92% /
udev                        10M     0   10M   0% /dev
tmpfs                      6.4G  200K  6.4G   1% /run
/dev/disk/by-label/DOROOT  315G  274G   26G  92% /
tmpfs                      5.0M     0  5.0M   0% /run/lock
tmpfs                       13G  4.0K   13G   1% /run/shm

我想知道 274GB 去哪儿了。下列的答案在这里,我可以看到文件系统正在使用大约 50GB:

$ du -h /  --max-depth 3
...
51G     /

我也碰巧知道我有一个很大的 Postgres 数据库,所以我可以去检查它使用了多少空间:

$ psql 
=> SELECT pg_database.datname, pg_database_size(pg_database.datname), pg_size_pretty(pg_database_size(pg_database.datname)) FROM pg_database ORDER BY pg_database_size DESC;
   datname   | pg_database_size | pg_size_pretty
-------------+------------------+----------------
 mydatabase  |     230809349908 | 215 GB
 postgres    |          6688532 | 6532 kB
 template1   |          6570500 | 6417 kB
 template0   |          6562308 | 6409 kB

因此,Postgres 使用了大约 215GB,文件系统使用了大约 50GB。

但如何查看剩余的 10GB 去哪儿了呢?

这不是什么大不了的事,但我只是想知道如何追踪这一点。

答案1

多余的空间很可能被分配给打开但已删除的文件。

du将仅显示那些可通过文件系统访问的文件(即:具有文件名)。删除文件时,其文件名将从目录中删除,但仅当所有进程关闭该文件的打开文件句柄时,磁盘块(和索引节点)才会被释放。遇到此问题的最简单方法是删除打开的日志文件,并期望释放空间。然后,您要么必须强制持有进程关闭其文件句柄,要么终止这些进程(退出的进程总是关闭其所有文件句柄)。进程还有其他方式使用文件(将其作为二进制文件运行、将其作为共享对象加载、将其映射到内存空间)。

要查看正在运行的进程保存了哪些打开但已删除的文件,您可以使用诸如 之类的实用程序lsof,或者您可以查看/proc/*.在那里,每个正在运行的进程都有一个目录,以其 PID 命名(例如:/proc/1PID 号为 1)。在该目录下,一个名为 的符号链接exe显示了作为进程运行的二进制文件,一个名为 的文件maps显示了映射到进程内存空间的文件,一个名为 的目录fd列出了该进程的所有打开的文件句柄。如果您在那里看到(已删除),就是这样。

答案2

为了以交互方式探索文件系统的使用情况,您可以使用诸如xdiskfree,kdiskfreebaobab

您将获得与 中基本相同的信息,du但您不必为每个子目录使用它,而只需单击目录即可查看详细信息。

答案3

如前所述,您可以使用 du -sh 命令来确定任何文件夹的总空间使用情况。

您需要使用 sudo 运行此命令,以确保它捕获文件夹中所有内容的大小信息。

-s 选项使 du 递归地检查磁盘使用情况。

-h 选项是为了使输出可读。当您掌握了窍门后,您可以尝试使用和不使用 -h 选项运行 du 并比较输出。有时您可能会发现不带 -h 的输出很有用。

您还可以向 du 命令提交通配符以评估多个文件夹的使用情况。所以:

sudo du -sh /home/*

将为您提供 /home 中每个文件夹的总使用情况

答案4

由于du /报告 51GB,因此您正在使用 51GB。可能有一些您没有看到的已用空间,例如已删除的文件或被安装点隐藏的文件(请参阅末尾为什么有这么多不同的方法来测量磁盘使用情况?——事实上,整个答案可能很有趣)。但就你的情况而言,这不太可能。

如果 PostgresQL 数据库位于您的文件系统内,那么它将显示为文件并且将计入总数。显然,由于它比您看到的文件大,因此数据库位于您有权访问的目录树之外的其他位置。

315GB 可以与其他用户共享。或者,存储空间可能是经过组织的,以便您可以使用 315GB 文件系统,但您只能看到其中的一部分作为目录树,而数据库位于您看不到的另一部分中。例如,有一个卷/clients/richard,它有两个子目录rootdatabase,并且您只能看到目录树/clients/richard/root(即您的进程是chrooted那里)。

剩余的 10GB 可能是一些恢复系统(许多 VPS 都有此服务,您可以在其中启动到恢复系统,以防您需要修复无法启动的主系统)。或者它可能是只有 root 可以使用的紧急储备(在中搜索“reserve”)为什么有这么多不同的方法来测量磁盘使用情况?)。

相关内容