问题:
硬盘显示被写满,但是用du -sh /*查看时占用硬盘空间之和还远小于硬盘大小,即找不到硬盘分区是怎么被写满的。
今天下午接到同事紧急求助,说生产线服务器硬盘满了。该删的日志都删掉了。可空间还是满的,情况危急啊。这个问题,在多年以前直接和间接的遇到过1-2次。以前太懒惰了,这次记录下来和大家分享。
相关日志如下:
█ 查看硬盘分区大小
1 [root@www ~]# cat /etc/redhat-release 2 CentOS release 6.4 (Final) 3 [root@www ~]# df -h 4 Filesystem Size Used Avail Use% Mounted on 5 /dev/sda3 117G 111G 0 100% / 6 /dev/sda1 145M 12M 126M 9% /boot 7 tmpfs 3.0G 0 3.0G 0% /dev/shm
这是一台web服务器(apache+tomcat+mysql)
通过dh -h命令查看 总大小117G,使用了111G
1 [root@www /]# fdisk -l 2 3 Disk /dev/sda: 146.8 GB, 146815733760 bytes 4 255 heads, 63 sectors/track, 17849 cylinders 5 Units = cylinders of 16065 * 512 = 8225280 bytes 6 7 Device Boot Start End Blocks Id System 8 /dev/sda1 * 1 19 152586 83 Linux 9 /dev/sda2 20 2108 16779892+ 82 Linux swap / Solaris 10 /dev/sda3 2109 17849 126439582+ 83 Linux
11 [root@www /]# fdisk -l /dev/sda3 12 13 Disk /dev/sda3: 129.4 GB, 129474132480 bytes 14 255 heads, 63 sectors/track, 15741 cylinders 15 Units = cylinders of 16065 * 512 = 8225280 bytes 16 17 Disk /dev/sda3 doesn't contain a valid partition table
==========================================================================================
█ 使用du命令查看到底哪些目录占用了空间
[root@www /]# du -sh /* 8.6M /bin 6.1M /boot 2.8G /data ===》这里是DB目录 124K /dev 60M /etc 1.6G /home ===》这里是日志目录 120M /lib 24M /lib64 16K /lost+found 8.0K /media 0 /misc 12K /mnt 0 /net 8.0K /opt 0 /proc 614M /root 35M /sbin 8.0K /selinux 24K /server 8.0K /srv 0 /sys 24K /tmp 2.5G /usr 29G /var ==》这里是www目录
可以看出,上面所有目录之和 远小于总的空间占用111G,是什么占用了硬盘,还查不到呢?
解答:
出现上面问题原因:
在apache/tomcat服务在运行状态下,清空了运行服务的日志,这里是清理了当天或正在写入的apache及tomcat的日志文件,从而导致了上面问题。(有关原理细节见下文)引申下:一般情况下,大多数服务(包括脚本)在运行时,是不能删除当前正在写入的日志文件的。这点请大家要记牢。
本文的解决办法:
查找机器自身的服务,然后重起apache和tomcat。
重起apache后:
1 [root@www ]# df -h 2 Filesystem Size Used Avail Use% Mounted on 3 /dev/sda3 117G 109G 2.3G 98% / 4 /dev/sda1 145M 12M 126M 9% /boot 5 tmpfs 3.0G 0 3.0G 0% /dev/shm
重起tomcat后:
[root@www ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 117G 38G 74G 34% / /dev/sda1 145M 12M 126M 9% /boot tmpfs 3.0G 0 3.0G 0% /dev/shm
上面问题原理分析:
1、这是一个文件系统层面的技术
2、当前 access.log 日志正被 apache 进程占用。通过 rm 命令删除 access.log,实际只删除了文件名(该日志文件应用记数不 0,因此空间不会被释放)
3、rm 命令删除了 access.log 后 apache 依然写日志到 access.log 中,当开启 apache 进程是,已经通过 access.log 定位到文件的 inode 了就是说再写日志是不通过 access.log,因此,即使删除了 access.log,apache 依然写日志到 access.log 所在的 inode 节点,所以导致硬盘空间增加。
4、因为删除了 access.log,所以,我们人类就看不到相关文件了,也就是说找不到该文件,du 也查不到。所以就会发现磁盘满而看不到什么文件撑满的硬盘,