df 命令未显示正确的值

df 命令未显示正确的值

这是一个 RHEL 服务器,我在上面运行一个 MySQL 服务器,数据库和日志文件(但是,日志记录已禁用)位于有/srv足够空间可用的目录中。

最近我有一个崩溃的表,所以我尝试修复它,但第二天我发现 MySQL 无法响应许多查询,并出现错误,表明没有磁盘空间:

ERROR 1030 (HY000): Got error 28 from storage engine

所以我运行以下命令来查看占用空间的内容

[root@tms /]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/server-slash
                      9.9G  9.5G     0 100% /
tmpfs                 7.8G     0  7.8G   0% /dev/shm
/dev/sda1             485M   58M  402M  13% /boot
/dev/mapper/server-var
                      739G  252G  450G  36% /srv

令人惊讶的是它的/目录。但更令人惊讶的是,下面的目录/并没有表明已使用的空间超过2GB, whiledf显示总空间9.9GB为了/

[root@tms /]# du -sh /*
7.5M    /bin
48M     /boot
200K    /dev
24M     /etc
4.0K    /home
223M    /lib
21M     /lib64
16K     /lost+found
4.0K    /media
4.0K    /mnt
183M    /opt
...deleted some file-not-found errors for files under /proc
0       /proc
144K    /root
14M     /sbin
4.0K    /selinux
252G    /srv
0       /sys
44K     /tmp
917M    /usr
259M    /var

那么为什么会df显示错误的值呢?我怎样才能找出实际占用空间的内容?

答案1

常见的编程技术是创建一个临时文件并立即 unlink() 它。这使得该文件(及其空间)在程序运行期间可用,但在使用该文件的程序终止时会自动删除该文件。优点之一是无需编写 Epilog(清理)代码。

要确定是否有进程保持未链接的文件打开,请执行以下操作:

lsof -a +L1 /dev/server_slash

(或者)

lsof +D /dev/server_slash +L1

查找 NLINK 值为零 (0) 的所有文件。这些文件的链接计数为零,当最后一个进程终止时,这些文件将消失。 SIZE/OFFSET 列将提供相关文件的字符大小。

答案2

1)df不报告 UNIX 风格文件系统上为 root 保留的空间(默认为 5%)。因此,df报告的内容总是少于应有的内容。

2)但在这里,我猜测您在没有安装 srv 分区的情况下运行了数据库。如果没有安装 srv 分区,内容将被写入安装点,即。到 /-分区中的 srv 目录下。 (根分区),因此占用了 / 分区上的大量空间。

然而,当你将 srv-partition 挂载到 srv-directory 上,/-partition 的 srv-directory 下的所有文件都会被您“挂载”在其上的分区“隐藏” - 但空间仍然已用完,尽管您无法看到它或访问它以将其删除。

尝试卸载 srv-partition(转到 singleuser-moder/runlevel 1/maintenance 模式,以便一切都停止),检查它是否确实已卸载(使用mount),并查看是否有文件隐藏在您通常用作挂载点的目录下( usr、srv、home、var、tmp、...)位于 / 分区中。我敢打赌你会在其中一些中发现一些重要的东西。完成并重新启动后,请确保 srv 分区实际上按照应有的方式安装。

这——你可以在通常被安装的分区隐藏的目录中保存东西——实际上有时是有用的。

相关内容