我如何阻止这种不断丢失的可用空间?

ask*_*mpu 17 filesystem hard-drive

我像往常一样运行 Ubuntu,突然出现一个对话框,说我只剩下 1.2 GB 的可用空间。一个小时前,我有 30 GB 的可用空间。

我删除了一些东西并将可用空间增加到 25 GB。但它继续减少。我尝试删除旧的日志文件和截断日志文件等,它继续减少!

我尝试使用磁盘分析器来查找所有这些可用空间损失的来源,但没有奏效,因为它显示了应有的所有内容。我重新启动并最终 Ubuntu 进行了磁盘检查,以某种方式将可用空间恢复到 40 GB,但它仍然每天继续减少约 10 GB。我继续尝试寻找释放空间的新方法,但这就像一个自动减少磁盘空间的过程,我无法停止。

我不知道该怎么办。如何找到原因,并阻止我的可用空间减少?

这是来自的输出sudo du -sh /var/* ~/.xsession-errors

13M /var/backups
204M    /var/cache
112M    /var/crash
4.0K    /var/games
503M    /var/lib
4.0K    /var/local
0       /var/lock
9.5G    /var/log
85M     /var/mail
4.0K    /var/metrics
24K     /var/opt
0       /var/run
1.7M    /var/spool
391M    /var/tmp
11G     /var/tvmobili
20K     /var/www
224K    /home/school/.xsession-errors
Run Code Online (Sandbox Code Playgroud)

Kaz*_*Kaz 27

你有一些失控的日志。与其每天疯狂删除,不如找到快速增长的一个或多个文件,然后查看内部调查可能导致这种情况的原因。也许某些程序正在循环记录某些条件。要么禁用该程序,禁用其日志记录,要么尝试修复它所抱怨的情况。

如果一个文件在您眼前不断增长,而您不知道哪个程序正在写入它,您可能会很容易找到它。这是一个例子。谁/var/log/syslog开了?我们使用fuser命令:

# fuser /var/log/syslog
/var/log/syslog:      602
Run Code Online (Sandbox Code Playgroud)

只有一个进程/var/log/syslog打开。这是进程602。那是什么?让我们不要理会psand grep,而是/proc直接查看文件系统:

# ls -l /proc/602/exe
lrwxrwxrwx 1 root root 0 Mar 29 17:45 /proc/602/exe -> /usr/sbin/rsyslogd
Run Code Online (Sandbox Code Playgroud)

啊哈,是rsyslogd。我们并不感到惊讶,rsyslogd/var/log/syslog/开放。

不保证此方法有效。原因是程序不必为了写入文件而保持文件打开。假设您有一个进程打开一个文件,附加到它,然后关闭它。您将进行更困难的调查。您可以运行fuser多次,直到您偶然发现“红手”过程。这个过程本身可能会很快进入和消失。另一个问题是多个进程可以打开文件,但只有一个进程使它变大。在这种情况下,您可以跟踪他们的系统调用。

# fuser /var/log/huge-annoying-file
/var/log/huge-annoying-file:   1234 23459
Run Code Online (Sandbox Code Playgroud)

哎呀!两个进程打开了它:1234 和 23459。让我们看看它们在做什么:

# strace -p 1234
Process 1234 attached - interrupt to quit
select(1, NULL, NULL, NULL, {9, 922666}
Run Code Online (Sandbox Code Playgroud)

它什么都不做,只是在select通话中阻塞。Ctrl-C 中断跟踪:

select(1, NULL, NULL, NULL, {9, 922666}^C <unfinished ...>
Run Code Online (Sandbox Code Playgroud)

检查下一个:

# strace -p 23459
write(5, "Useless garbage ..."..., 512) = 512
write(5, "More useless garbage ..."..., 512) = 512
write(5, "More useless garbage ..."..., 512) = 512
write(5, "More useless garbage ..."..., 512) = 512
write(5, "More useless garbage ..."..., 512) = 512
write(5, "More useless garbage ..."..., 512) = 512
write(5, "More useless garbage ..."..., 512) = 512
^C
Run Code Online (Sandbox Code Playgroud)

哎呀,那个一直在写。那一定是坏的。我们甚至可以检查进程写入的文件描述符 5 实际上是大文件:

# ls -l /proc/23459/fd/5
lr-x------ 1 root root 64 Apr  3 23:39 /proc/23459/fd/5 -> /var/log/huge-annoying-file
Run Code Online (Sandbox Code Playgroud)

我不怀疑您的文件系统已损坏,但要强制进行全面检查,您不必启动 DVD。

首先,查看文件系统的最大挂载计数设置。使用 df 命令识别您的分区。我在这里的 Ubuntu 系统上的示例:

# df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1       18062108 5499320  11645284  33% /
udev              392152       4    392148   1% /dev
tmpfs             159768     768    159000   1% /run
none                5120       0      5120   0% /run/lock
none              399416     200    399216   1% /run/shm
/dev/sr0           43668   43668         0 100% /media/VBOXADDITIONS_4.1.4_74291
Run Code Online (Sandbox Code Playgroud)

您可以看到/文件系统安装在/dev/sda1. 所以/dev/sda1是根分区(和在该特定系统中唯一的分区)的存储装置。

让我们看看该文件系统的一些属性。即使已安装,这样做也是安全的。该命令会产生大量输出。这是摘录:

$ dumpe2fs /dev/sda1
dumpe2fs 1.42 (29-Nov-2011)
Filesystem volume name:   <none>
Last mounted on:          /
[ ... SNIP ... ]
Last mount time:          Fri Mar 29 17:45:18 2013
Last write time:          Tue Mar  5 09:08:03 2013
Mount count:              22
Maximum mount count:      22
[ ... SNIP ... ]
Run Code Online (Sandbox Code Playgroud)

嘿看,挂载数等于最大挂载数。下次我重新启动时,将进行文件系统检查。重要的是安装计数是一个正值。如果您的为零,请使用 将其更改为某个正值,例如 22 tune2fs -c 22 /dev/whatever。零意味着无论分区安装多少次都不会强制进行检查。很少重新启动的系统在这里应该具有较低的值。每年宕机一次的服务器每次重新启动时可能会使用 fsck。您还可以设置基于日期的检查间隔。

现在要强制检查,您可以将实际计数覆盖为大于或等于最大值,然后重新启动。这是用资本完成的Ctune2fs -C 1234 /dev/whatever。现在该分区看起来像是未经检查就挂载了 1234 次,这大于一位或两位数的最大值。

  • 看,正如我怀疑的那样。没有神秘的磁盘损坏上下鞭打空间。我的意思是这可以解释一个孤立的事件,但是一旦修复,就应该修复。并且驱动器出现故障,您会在内核日志和恐慌中看到一些错误。 (2认同)