(转)磁盘空间满故障排除

磁盘空间满一般情况下使用du可以快速定位到那个目录占用了大量的磁盘空间。
这里主要讲两个使用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

猜你喜欢

转载自jackyrong.iteye.com/blog/1634898