磁盘满了如何解决

磁盘满了如何解决

我的磁盘驱动器 /dev/sdc 已满(见下文)。无论如何,是否有办法解决它消耗所有磁盘空间的原因。

我尝试过运行du -d -h 1,但我认为这不是正确的命令。

$ df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc         14G   13G     0 100% /            <--- here
devtmpfs        1.9G     0  1.9G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           1.9G  174M  1.7G  10% /run
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda1       488M  132M  321M  30% /boot
/dev/sdd         99G   25G   73G  26% /data
tmpfs           378M     0  378M   0% /run/user/0

其他日志输出:

$ du -h -d 1

52K     ./tmp
131M    ./boot
24M     ./opt
4.0K    ./mnt
34M     ./etc
1.6G    ./root
0       ./sys
44K     ./sysadmin
du: cannot access './proc/58885/task/58885/fd/4': No such file or directory
du: cannot access './proc/58885/task/58885/fdinfo/4': No such file or directory
du: cannot access './proc/58885/fd/4': No such file or directory
du: cannot access './proc/58885/fdinfo/4': No such file or directory
0       ./proc
16K     ./lost+found
0       ./dev
25G     ./data
4.0K    ./media
32K     ./home
182M    ./run
2.6G    ./usr
921M    ./var
4.0K    ./srv
31G     .
$ du -ahx --threshold=1G

1.2G    ./root/ffmpeg_sources
1.6G    ./root
2.6G    ./usr
5.2G

答案1

您需要采取多种方法来识别磁盘的意外使用。

  1. 隐藏磁盘使用

    有几个人提出了建议du -xhs /*或其一些变体。这是一个很好的起点,但它不会在安装点下查找(您可能无意中写入了数据,然后在其上安装了文件系统)。由于通配符要求包含性,该命令还报告根以外的文件系统。

    您可以通过以下方式解决这些问题绑定挂载

    mkdir -p /mnt/root
    mount --bind / /mnt/root
    shopt -s dotglob
    du -hs /mnt/root/*
    

    这将挂载根文件系统/mnt/root并报告其所有顶级目录(和文件)的摘要。与主挂载不同,/没有需要考虑(和避免)的辅助挂载文件系统。

  2. 已删除的文件

    已删除但仍打开的文件将保留其磁盘分配,直到它们被关闭。这已在另一个答案中介绍过,因此为了完整起见,我只想在这里提及它。

    lsof | grep deleted
    

答案2

我首先要做的是尝试确定驱动器中填充的内容。根据您的安装情况,我将开始检查 /home、/usr 或 /var(/var 保留日志,也许某个进程在日志中生成太多错误消息)磁盘使用情况,一旦您找到占用空间的目录,就会下降并找到子目录。

一旦你搞定了它,你就可以看看这是否是你的问题(你下载了太多视频并填满了整个驱动器),或者它是否是你正在运行的进程,创建了日志、数据文件等内容......

如果问题不是由您造成的,而是一个过程,您将必须使用从上一阶段收集的信息来识别问题,现在您也许能够解决您的问题。

编辑:回顾我的答案,我可以看到我错过了一个重要的点,如果您在作为安装点的目录上创建了文件,然后将某些内容安装到该目录上,您将无法看到这些文件,除非您卸载该目录中的设备。您可能不知道其中有文件,因此您可能需要卸载设备并查看该目录中是否有文件。

答案3

驱动器可以填充但没有显示可以看到的证据的原因之一du与私人文件有关。进程可以打开要写入的文件,开始写入,然后从其目录中删除该文件。这会留下一个打开的文件,该进程仍可以写入该文件,该文件仍然消耗磁盘空间,但通过浏览文件系统无法发现该文件。这听起来很愚蠢,但它对于为您不希望暴露给其他进程的敏感信息分配临时存储非常有用。

其他程序也可以删除此类文件,而打开该文件进行写入的程序则一无所知。有时,用户尝试通过删除所有者进程(例如syslogd)仍然打开的日志文件(或其他文件)来释放空间。结果是文件继续占用空间甚至增长,但它们变得更难去寻找。

要找到此类文件,您必须查看内核的打开文件列表。lsof是为此选择的工具。它显示所有打开的文件,以及内核当前正在读取或写入的文件的偏移量。

这是一个可能有帮助的命令:

lsof -o /dev/sdc | grep deleted

让我们了解一下这是做什么的:

  • lsof列出打开的文件
  • -o总是显示文件偏移量
  • /dev/sdc将结果限制为 /dev/sdc 块设备上的文件

当文件被删除时,将在行尾lsof显示,位于文件曾经存在的位置之后。找到那些。(deleted)grep deleted

其中一些文件可能是正常的。不过,输出的第 7 列显示了偏移量;它的前缀是0t.如果您看到有大量偏移量也被删除,则它正在消耗大量您看不到的磁盘空间。

要释放该空间,您必须终止该进程。 (根据进程,您可能需要重新启动它。)您应该很快就会看到磁盘空间增加。

相关内容