(轉)磁碟空間滿故障排除
這裡主要講兩個使用du無法檢視的情況。
# 現象/mnt分割槽磁碟使用率達到100%
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 97G 1.5G 90G 2% /
/dev/sda1 190M 12M 169M 7% /boot
none 2.0G 0 2.0G 0% /dev/shm
/dev/sda3 97G 6.3G 85G 7% /usr
/dev/sda6 191G 408M 181G 1% /var
tmpfs 300M 300M 0 100% /mnt
/dev/loop0 190M 106M 74M 60% /mnt/foo
# 進入/mnt目錄使用du檢視/mnt下的磁碟使用率
# cd /mnt
# du -sh *
101M bar
101M foo
# troubleshooting
# 解決思路
# 有兩種情況會干擾du檢視磁碟空間使用率
# 1、刪除的檔案使用du無法檢視
# 2、磁碟分割槽的某一個目錄掛載了另外一個分割槽時,du檢視到的磁碟空間為掛載分割槽後的目錄空間。
# 在瞭解上面兩種情況後,解決這個問題會比較簡單。
# 在生產環境中某一程式的日誌檔案被刪除這一情況發生的機率會大些。
# 故障排除
# 1、查詢被刪除檔案
# 被刪除檔案,在寫程式未退出的情況下,被刪除檔案同樣會佔用磁碟空間。
# lsof -n | head -1
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
# lsof -n /mnt | grep deleted
foo.sh 32593 root 1w REG 0,18 104538112 981982 /mnt/test.out (deleted)
foo.sh 32593 root 2w REG 0,18 104538112 981982 /mnt/test.out (deleted)
# 殺掉寫檔案的程式,磁碟空間會自然釋放
# kill 32593
# df -h /mnt
Filesystem Size Used Avail Use% Mounted on
tmpfs 300M 201M 100M 67% /mnt
# 2、檢視分割槽掛載情況
# 因為分割槽的目錄下掛載有其它分割槽,被掛載分割槽的目錄本身容量無法被檢視,所以umount掉掛載分割槽的目錄後將可正常檢視此目錄下檔案所佔用的容量。
# cd /mnt
# du -sh *
101M bar
101M foo #此容量為目錄掛載分割槽後的新分割槽容量
# umount /mnt/foo
# du -sh *
21M bar
201M foo #此容量為目錄所佔用磁碟滿分割槽的容量
---------------------------------------------------------------------------
測試環境搭建過程
# 掛載300M的記憶體tmpfs到/mnt目錄
# mount -t tmpfs -o size=300m tmpfs /mnt
# cd /mnt && mkdir foo bar
# 先生成兩個檔案到foo bar下,佔用一定的磁碟空間
# dd if=/dev/zero of=foo/file.out bs=1M count=100
# dd if=/dev/zero of=bar/file.out bs=1M count=100
# 檢視磁碟當時的使用情況
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 97G 1.5G 90G 2% /
/dev/sda1 190M 12M 169M 7% /boot
none 2.0G 0 2.0G 0% /dev/shm
/dev/sda3 97G 6.3G 85G 7% /usr
/dev/sda6 191G 408M 181G 1% /var
tmpfs 300M 201M 100M 67% /mnt
# 使用空檔案建立一個檔案系統
# cd /root/shell
# 生成200M的空檔案
# dd if=/dev/zero of=foo.img bs=1M count=200
# 建立一個loop devices
# losetup /dev/loop0 foo.img
# 在loop devices上建立一個ext3檔案系統
# mke2fs -j -c /dev/loop0 200000
# 使用/mnt/foo目錄掛載/dev/loop0
# mount -t ext3 /dev/loop0 /mnt/foo
# 在/mnt/foo/目錄產生一個測試檔案file.out
# dd if=/dev/zero of=/mnt/foo/file.out bs=1M count=100
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 97G 1.5G 90G 2% /
/dev/sda1 190M 12M 169M 7% /boot
none 2.0G 0 2.0G 0% /dev/shm
/dev/sda3 97G 6.3G 85G 7% /usr
/dev/sda6 191G 408M 181G 1% /var
tmpfs 300M 201M 100M 67% /mnt
/dev/loop0 190M 106M 74M 60% /mnt/foo
# /mnt/foo目錄掛載方式偽裝已經完成
# 刪除檔案偽裝
# 編寫一個死迴圈產生測試檔案
# cat /root/shell/foo.sh
#!/bin/bash
# set -x
foo=$(seq 1 500)
while :
do
echo $foo
done
# 生成一個測試檔案test.out佔用/mnt目錄的空間
# nohup /root/shell/foo.sh >/mnt/test.out 2>&1 &
# 刪除測試檔案
# rm /mnt/test.out
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 97G 1.5G 90G 2% /
/dev/sda1 190M 12M 169M 7% /boot
none 2.0G 0 2.0G 0% /dev/shm
/dev/sda3 97G 6.3G 85G 7% /usr
/dev/sda6 191G 408M 181G 1% /var
tmpfs 300M 300M 0 100% /mnt
/dev/loop0 190M 106M 74M 60% /mnt/foo