/proc kcore 文件很大

Posted

技术标签:

【中文标题】/proc kcore 文件很大【英文标题】:/proc kcore file is huge 【发布时间】:2014-02-05 21:24:22 【问题描述】:

经历DDOS攻击后,不知为何/proc/kcore非常庞大,我用一个小的php类查看当前磁盘空间,已经使用了多少。

显示如下:

Total Disk Space: 39.2 GB
Used Disk Space: 98 GB
Free Disk Space: 811.6 MB

我的问题是,删除/proc/kcore 文件是否安全?或者有没有办法让它恢复到正常大小。

/proc/kcore的文件大小为140.737.486.266.368字节

我在 DigitalOcean 托管了我的服务器。

如果需要了解更多信息,请询问;)

非常感谢!

编辑...

df -h 返回:

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda         40G   37G  755M  99% /
udev            993M   12K  993M   1% /dev
tmpfs           401M  224K  401M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none           1002M     0 1002M   0% /run/shm

du -shx 返回:

du -shx *
8.7M    bin
27M     boot
12K     dev
6.3M    etc
4.8M    home
0       initrd.img
229M    lib
4.0K    lib64
16K     lost+found
8.0K    media
4.0K    mnt
4.0K    opt
du: cannot access `proc/3765/task/3765/fd/3': No such file or directory
du: cannot access `proc/3765/task/3765/fdinfo/3': No such file or directory
du: cannot access `proc/3765/fd/3': No such file or directory
du: cannot access `proc/3765/fdinfo/3': No such file or directory
0       proc
40K     root
224K    run
8.0M    sbin
4.0K    selinux
4.0K    srv
0       sys
4.0K    tmp
608M    usr
506M    var
0       vmlinuz

lsof | grep deleted的结果:

mysqld     1356      mysql    4u      REG              253,0           0    1835011 /tmp/ib4jBFkc (deleted)
    mysqld     1356      mysql    5u      REG              253,0           0    1835012 /tmp/ibcE99rr (deleted)
    mysqld     1356      mysql    6u      REG              253,0           0    1835013 /tmp/ibrxYEzG (deleted)
    mysqld     1356      mysql    7u      REG              253,0           0    1835014 /tmp/ibK95UJV (deleted)
    mysqld     1356      mysql   11u      REG              253,0           0    1835015 /tmp/iboOi8Ua (deleted)
    nginx     30057       root    2w      REG              253,0           0     789548 /var/log/nginx/error.log (deleted)
    nginx     30057       root    5w      REG              253,0 37730323404     268273 /etc/nginx/off (deleted)
    nginx     30057       root    6w      REG              253,0           0     789548 /var/log/nginx/error.log (deleted)
    nginx     30058   www-data    2w      REG              253,0           0     789548 /var/log/nginx/error.log (deleted)
    nginx     30058   www-data    5w      REG              253,0 37730323404     268273 /etc/nginx/off (deleted)
    nginx     30058   www-data    6w      REG              253,0           0     789548 /var/log/nginx/error.log (deleted)
    nginx     30059   www-data    2w      REG              253,0           0     789548 /var/log/nginx/error.log (deleted)
    nginx     30059   www-data    5w      REG              253,0 37730323404     268273 /etc/nginx/off (deleted)
    nginx     30059   www-data    6w      REG              253,0           0     789548 /var/log/nginx/error.log (deleted)

【问题讨论】:

/proc 应该是虚拟文件系统吗?如果你在那里删除某些东西,你不应该得到任何实际的磁盘空间...运行df -h 以查看实际使用的磁盘空间。 @Wrikken 我已经更新了帖子,还剩 755 mb。 是的,似乎是个问题,但在删除proc 中的内容时无法解决(请参阅mount 的输出,它只是procfs)。它也比您在kcore 中声称拥有的 127TB 小得多。似乎有一些清理工作要做,但不是在/proc。我通常使用du -shx * 从根目录向下钻取,查看大目录是什么,然后再深入到其他du -shx * 等目录,以找到真正的 源。顺便说一句:在 DDOS 之后,将日志转走可能不是一个坏主意,通过运行 logrotate -f /etc/logrotate.conf 可能会充满废话 好的,这意味着有很多实际删除的文件,但仍然没有从文件系统中清除,因为某些进程使它们保持打开状态(它们的 inode 仍然存在/尚未解除分配)。你能看看lsof | grep deleted 吗?它会告诉你哪些已删除的文件仍然存在,以及哪个进程 id 仍然有对它的引用。通常,停止或重新启动该进程会清理 inode。 我知道这有点老了,但解决巨大的/proc/kcore 的一种解决方案是重新启动机器,这会立即将“文件”的大小减小到更小的大小。 【参考方案1】:

回答你原来的问题:

“删除/proc/kcore文件安全吗?还是有解决办法 让它恢复到正常大小。”

不,这不安全。好吧,我不想打赌如果你还是删除它会发生什么!

/proc 目录是 procfs 的挂载点(运行 mount 并查看如下输出:)

proc on /proc type proc (rw)

procfs 有点黑魔法;其中没有文件是真实的。它看起来像一个文件系统,行为像一个文件系统,并且是一个文件系统。但不是存储在磁盘(或其他地方)上的。

/proc/kcore 特别是一个文件,它直接映射到虚拟内存中的每个可用字节......我对细节不是很清楚; 128TB 来自 Linux,分配了 64 位中的 47 位可用于虚拟内存。

(这里有关于 128TB 限制的讨论:https://unix.stackexchange.com/questions/116640/what-is-maximum-ram-supportable-by-linux)

无论如何,抛开 Linux 硬编码的虚拟内存限制不谈 - 我们在您的问题的上下文中了解到的是:/proc/kcore 是一个系统文件,由虚拟 procfs 文件系统提供,而不是真实文件.

不要删除它;-)


更新:2016-06-03

我在这里的回答会定期被投票 - 所以我认为人们仍在寻找/proc/kcore 是什么的解释。

有一篇有用的 Wikipedia 文章,标题为 Everything is a file,它提供了一些背景知识。如果您真的很好奇,请查看 Plan9 操作系统。

希望我的原始答案足以解释 kcore 本身。我推测阅读此答案的人可能也对 /proc 中的其他文件感到好奇 - 所以这里有一些其他“有趣”的例子。

/proc/sys/* 是用户(您)从 Linux 核心(内核和相关驱动程序等)读取/写入详细信息的机制。 r/w 项目的一个可爱示例是“IP forwarding”:

读取: cat /proc/sys/net/ipv4/ip_forward0 关闭,1 开启)

写信:echo 1 > /proc/sys/net/ipv4/ip_forward

kcore 一样,这不是一个真实的文件。但它的行为就像一个。因此,当您写入它时,您实际上是在更改软件设置,而不是磁盘上的字节。

/proc/meminfo/proc/cpuinfo 是只读的。您可以在自己的应用程序中 catlessfopen()。它们向您显示有关您的硬件(内存和 CPU)的详细信息。

/proc/[0-9]+ 实际上是在您的机器上运行的进程 ID!这些是(恕我直言)迄今为止/proc 最酷的功能。在它们里面你会发现更多的假文件,比如cmdline,它告诉你使用了什么命令来启动进程。

最后还有一些“有趣的文件系统”的其他例子,比如/proc。有purely in-memory 和"user-space" 仅举两个。同样,这些(一般而言)不会占用任何实际磁盘空间,尽管像 dfls 这样的工具可能会报告实际文件大小。

【讨论】:

实际上无法删除/proc/kcore,如果您尝试它会给出“不允许操作” @tbodt 我从来不敢尝试!感谢您提供更多信息。 /proc 中的其他所有内容也是如此 Sophos 免费病毒扫描程序卡在此文件上。似乎它真的在扫描 128 TB :) 解决方法:将此添加到 savscan 命令行的末尾:-exclude /proc/kcore【参考方案2】:

运行命令sudo rm /proc/kcore 是完全安全的。它只会说rm: cannot remove '/proc/kcore': Operation not permitted

/proc 中的所有文件实际上并不存在于您的硬盘上,因此无法删除它们。这些文件代表有关系统的信息。例如,当您执行ls /proc 时,您是在向内核询问系统上的进程列表。如果你运行ls -l /proc/22/exe,你是在向内核询问进程号为 22 的可执行文件的文件路径。以此类推。

【讨论】:

【参考方案3】:

请检查您的日志文件空间。我删除了所有错误日志和访问日志文件,我的网站正在运行。

使用此命令检查哪个文件夹占用更多空间。

cd /
sudo du -sh * 2>/dev/null | sort -h

【讨论】:

【参考方案4】:

看起来您需要清理已删除但保留的文件磁盘。您可以将“tune2fs”命令与以下内容一起使用:

tune2fs -m 1 /dev/<drive>

这应该会释放保留的块空间并让您访问特权进程保留的磁盘空间。请注意,1 是之后将分配给特权进程的百分比,仅当您有足够的磁盘空间用于关键进程(如 syslog 或 ssh)时才执行此操作。

注意:从“/proc”中删除文件永远不会获得磁盘空间。那是一个与硬盘空间无关的虚拟文件系统。

【讨论】:

关于/proc的解释是正确的。我不熟悉 tune2fs;有人可以解释它的作用(以及这个答案有什么问题,如果有的话)? 我可以告诉您,我发布此答案的原因是因为它为我解决了与我认为您遇到的问题相同的问题。不知道为什么它被否决,但如果它解决了你的问题,那就太好了......由于否决票没有给出理由,也许你可以通过肯定这是否是一个有用的答案来加强答案给你。 我不是 OP,也没有遇到同样的问题,只是偶然来到这里,所以我无法强化答案 - 我只能说这对我来说似乎是合理的,而且它会如果反对者发表评论,那就太好了。除此之外,我只是好奇tune2fs 做了什么。

以上是关于/proc kcore 文件很大的主要内容,如果未能解决你的问题,请参考以下文章

/proc 目录中的主要文件的说明

如何查看linux的物理cpu信息

如何调试linux内核?

2020年06月02日_Node_exporter的docker部署方式监控网络不准确问题

2020年06月02日_Node_exporter的docker部署方式监控网络不准确问题

/proc文件系统的特点和/proc文件的说明