#########################################################
# 硬盤顯示被寫滿可是用du -sh /*查看時佔用硬盤空間之和還遠
#小於硬盤大小問的解決
#date:2010-06-09
#做者:老男孩---《老男孩linux就業培訓中心 》
#QQ:31333741 MAIL:oldboy521@hotmail.com
#QQ交流羣:45039636
#blog: http://oldboy.blog.51cto.com
#psite: http://oldboy.cc(即將開放)
#pblog:http://blog.etiantian.org
##########################################################html
問題:硬盤顯示被寫滿,可是用du -sh /*查看時佔用硬盤空間之和還遠小於硬盤大小
即找不到硬盤分區是怎麼被寫滿的。mysql
今天下午接到一學生緊急求助,說生產線服務器硬盤滿了。該刪的日誌都刪掉了。可空間仍是滿的,狀況危急啊。這個問題,在多年之前直接和間接的遇到過3-4次。之前太懶惰了,此次記錄下來和你們分享。linux
相關日誌以下:web
█ 查看硬盤分區大小
[root@www ~]# cat /etc/redhat-release
CentOS release 5.3 (Final)
[root@www ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 117G 111G 0 100% /
/dev/sda1 145M 12M 126M 9% /boot
tmpfs 3.0G 0 3.0G 0% /dev/shm
這是一臺web服務器(apache+tomcat+mysql)
經過dh -h命令查看 總大小117G,使用了111G
[root@www /]# fdisk -lsql
Disk /dev/sda: 146.8 GB, 146815733760 bytes
255 heads, 63 sectors/track, 17849 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytesapache
Device Boot Start End Blocks Id System
/dev/sda1 * 1 19 152586 83 Linux
/dev/sda2 20 2108 16779892+ 82 Linux swap / Solaris
/dev/sda3 2109 17849 126439582+ 83 Linux
[root@www /]# fdisk -l /dev/sda3tomcat
Disk /dev/sda3: 129.4 GB, 129474132480 bytes
255 heads, 63 sectors/track, 15741 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytesbash
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的日誌文件,從而致使了上面問題。(有關原理細節見下文)app
引伸下:
通常狀況下,大多數服務(包括腳本)在運行時,是不能刪除當前正在寫入的日誌文件的。這點請你們要記牢。
本文的解決辦法:
查找機器自身的服務,而後重起apache和tomcat。
重起apache後:
[root@www 07]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 117G 109G 2.3G 98% /
/dev/sda1 145M 12M 126M 9% /boot
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
刪除文件原理圖:
老男孩運維班28期上述案例實戰模擬:
(1)安裝httpd web服務 yum install httpd -y /etc/init.d/httpd start lsof -i :80 /etc/init.d/iptables stop cd/etc/httpd/conf 編輯配置文件,讓日誌記錄到/app/logs下面。 sed -i's@#CustomLog logs/access_log common@CustomLog /app/logs/access_logcommon@g' httpd.conf (2)建立一個小的文件系統,用於存放上述access_log日誌。 dd if=/dev/zero of=/dev/sdc bs=8K count=10 ls -l /dev/sdc mkfs -t ext4 /dev/sdc tune2fs -c -1 /dev/sdc mount -o loop /dev/sdc /app/logs echo oldboy >/var/www/html/index.html (3)重啓httpd服務,確保日誌記錄到了上述文件系統掛載的/app/log下面 /etc/init.d/httpd restart (4)寫個循環腳本訪問httpd,使得httpd日誌充滿/app/logs整個空間。 for n in `seq 100000`;do curl -s 127.0.0.1>/dev/null;done [root@C64log]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 7.2G 2.0G 4.9G 30% / tmpfs 244M 0 244M 0% /dev/shm /dev/sda1 194M 54M 131M 30% /boot /dev/sdc 73K 73K 0 100% /app/log (5)錯誤的刪除方案 [root@oldboylogs]# rm -f /app/logs/access_log [root@oldboylogs]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.8G 1.6G 6.9G 19% / tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 190M 36M 145M 20% /boot /dev/sdc 73K 68K 1.0K 99% /app/logs 提示:此時空間並未被釋放,你可知道緣由? 查看被刪除的但仍由進程佔用的文件名。 [root@oldboylogs]# lsof|grep del httpd 6148 root 7w REG 7,0 55260 12 /app/logs/access_log (deleted) httpd 38178 apache 7w REG 7,0 55260 12 /app/logs/access_log (deleted) httpd 38483 apache 7w REG 7,0 55260 12 /app/logs/access_log (deleted) httpd 38484 apache 7w REG 7,0 55260 12 /app/logs/access_log (deleted) httpd 38752 apache 7w REG 7,0 55260 12 /app/logs/access_log (deleted) (5)解決問題 一、請先停掉模擬訪問測試腳本 forn in `seq 100000`;do curl -s 127.0.0.1 >/dev/null;done 二、重啓Http服務 [root@C64log]# /etc/init.d/httpd restart Stoppinghttpd: [ OK ] Startinghttpd: [ OK ] (6)查看處理結果 [root@C64log]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 7.2G 2.0G 4.9G 30% / tmpfs 244M 0 244M 0% /dev/shm /dev/sda1 194M 54M 131M 30% /boot /dev/sdc 73K 14K 55K 21%/app/logs (7)較好的處理方案 清空日誌而不刪除日誌。 >/app/logs/access_log