前几天,我们的 samba 服务器(ubuntu 8.04 ltr)共享已满,但当我查看时,我发现没有哪个共享有太多内容
我们有 5 个群组共享,每个用户都有一个个人共享
一个用户有 22GB 的东西,其他几个用户有 10-20MB 的东西,其他人都是空的
所以可能总共 26gig
我昨天删除了几个文件,释放了大约 250mb 的空间,今天当我检查它时,它又完全满了,我删除了一些旧文件,释放了大约 170mb 的东西,但我可以看到它在可用空间中慢慢减少。
我一直在跑df -h
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 241690180 229340500 169200 100% /
varrun 257632 260 257372 1% /var/run
varlock 257632 0 257632 0% /var/lock
udev 257632 72 257560 1% /dev
devshm 257632 52 257580 1% /dev/shm
lrm 257632 40000 217632 16% /lib/modules/2.6.24-28-generic
/易挥发的
我该怎么做才能找出到底是什么占用了我的硬盘空间?(我对 unix 还不是很熟悉,所以如果没有解释清楚,我深表歉意)
答案1
(这是针对 Linux 的答案。其他 UNIX 变体可能有所不同。)
有两条信息与您的问题相关:(1)哪些文件正在填满您的文件系统,以及(2)哪些进程正在写入这些文件。
笔记
下面,当我将$
字符放入命令中时,这可能是一个占位符,您需要在其中替换一个实际值。希望您能清楚地知道在哪里可以替换,在哪里不能替换。
哪些文件?
请注意,大多数文件系统类型中实际上有两种资源可被单个文件使用:元数据(例如 inode)和实际数据。您可以使用以下命令查看 inode 的数量(在 Google 上搜索定义,但它们是指向构成文件的结构的“指针”):
df -i
...正如您所知,如下所示将显示真实数据所使用的空间:
df -h
另外,请注意文件系统空间可能会被磁盘上不存在的文件占用。这些文件仍处于某个进程的打开状态,但已被删除(我们将在下面介绍)。
确定了完整的文件系统后,您需要开始查找大量小文件、少量大文件或两者兼有。元数据资源耗尽通常是由于小文件过多造成的,而实际数据资源耗尽通常是由于少量大文件造成的。我喜欢使用以下命令来帮助查找大文件:
sudo find $file_system -mount -ls | awk '{print $7, $11}' | sort -rn > $output
...这个命令可以帮助查找包含大量小文件的目录(更新::添加了空终止符以改进文件名处理):
sudo find . -mount -print0 | xargs -0n 1 dirname | sort | uniq -c | sort -rn > $output
...请注意,这些命令可能需要一段时间才能运行,并且会执行大量 I/O,具体取决于情况。运行后,您可以通读$output
以查找有问题的文件或目录。每个文件或目录的名称和位置可能会提示您数据来自何处,但需要一些 Linux 经验。
一旦确定了罪犯,你就可以rm $file
摆脱问题。
哪些流程?
查找可能填满文件系统的进程最直接的方法是运行以下命令:
fuser -c $file_system 2>/dev/null
... 它将告诉您具有给定文件系统的打开文件描述符(文件和网络套接字)的进程的 PID(该2>/dev/null
部分删除了一些您不需要的信息)。您可能能够仅从这些 PID 推断出哪个进程正在填满您的文件系统。使用以下命令搜索进程:
ps -ef | grep $pid
您还可以尝试运行此命令,它将为您提供更多详细信息(并帮助识别磁盘上没有相应文件名的打开文件 - 我上面提到过这一点):
sudo lsof $file_system | grep $directory_filling_up
...如果您从命令中识别出可疑 PID fuser
,您可以执行以下操作:
sudo lsof -p $pid
fuser
和的问题lsof
在于,它们只能提供运行命令时的系统快照。如果运行它们时有问题的进程没有写入,那你就没戏了。你可以通过在一段时间内反复运行它们并保存输出来解决这个问题。这将需要通读输出以找到模式,或者编写一个程序来为你做这件事。另一种方法是使用类似系统水龙头SystemTap 允许您捕获各种有用的信息,并且是“可编程的”。它甚至附带一些示例源文件,可让您查看在一段时间内哪些进程正在写入哪些文件。这将是完美的,但它是一种高级工具,需要大量的 Linux 知识。
一旦确定了有问题的进程,您就可以终止(并可能重新启动它们)。如果该进程与操作系统或某些打包好的软件相关联,则可能会有重新启动它们的机制,但这取决于您的 Linux 发行版(我认为 Ubuntu 将允许您运行类似 的程序/etc/init.d/$init_script restart
,但您必须查看发行版的文档)。否则,如果它没有运行,您可以使用kill $pid
或终止它kill -9 $pid
。请注意进程的运行方式(例如, 中显示的参数是什么ps -ef
),以防您需要重新启动它(您可能需要参考该软件的文档)。
答案2
用于du
追踪包含填满磁盘的文件的目录。
cd /
du -h --max-depth 1
将显示 / 中哪个目录占用了最多的空间。运行 du 命令遍历文件系统以找到罪魁祸首。
例如
cd /
du -h --max-depth 1
显示 /usr 占用了系统已使用的 3.5G 中的 2.3G。
cd /usr
du -h --max-depth 1
显示 /usr/lib 使用了 /usr 中 2.3 中的 1.1G ...
这也可能是由于已删除的打开的文件造成的。
您可以使用lsof查找已打开但未链接(已删除)的文件
lsof +L1
应该可以解决问题。正如手册页所述:
格式为 的规范
+L1
将选择已取消链接的打开文件。格式为 的规范+L1 <file_system>
将选择指定文件系统上未链接的打开文件。
答案3
有东西正在填满 / 分区。可能是/var/log
或 中的某些东西/home
。这取决于您的设置。还要查看您的用户可以访问的位置。
在每个相关目录中运行以下命令。这将向您显示占用空间最大的子目录。
cd /directory
du -cks -x * .* |sort -n
这个想法借鉴了ducks
剧本(du -cks
)Linux 服务器黑客来自 O'Reilly。我经常运行这个命令。
根据我的经验,这几乎总是由于日志文件很大且不断增长而导致的。在这种情况下,使用日志旋转, 和确保使用压缩。使用默认压缩率的 gzip 压缩,您的日志文件将缩小 80-95%(1GB 的 /var/log/messages 可以轻松压缩到 200MB 或更小)。这会给 CPU 带来中等程度的负载,但我很少看到这会影响服务器的实际性能。有些人更喜欢使用 Bzip2 压缩,或者使用,gzip --best
但根据我的经验,这会导致大量 CPU 开销而几乎没有额外的好处。gzip
使用默认比率通常就足够了。
显然,这个问题有时是由于用户做了坏事造成的。使用du
上面的命令来找到罪魁祸首。
答案4
可能的罪魁祸首是日志,但这里有一个命令可以按大小对最近修改(或创建)的文件进行排序:
D=$(date --rfc-3339 date);
sudo sh -c 'find / -xdev -mtime -1 -type f -print0 |xargs -0 du -0sbc' \
|tee ~/recent-files.$D |sort -zn |tee ~/recent-by-size.$D |xargs -0n1
您可以每天运行此命令;可能有一种方法可以执行一些 SQL 式的操作来按每日增长情况对这些文件进行排序。
(编辑)要监测增长,使用GT5
sudo aptitude install gt5
cd /
gt5
一天后;寻找 ± 符号
gt5