磁盘空间不足案例 ` No space left on device`

单个文件过大(block不足)

模拟环境

#模拟一个块文件并挂载
dd if=/dev/zero of=/test_sda count=1 bs=1G
mkfs.xfs /test_sda
mkdir /test_dir
mount /test_sda /test_dir/
df -hT /test_dir/

Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/loop0     xfs  1014M   33M  982M   4% /test_dir

模拟故障

#创建一个大文件
dd if=/dev/zero of=/test_dir/1.txt bs=1100M  

dd: error writing ‘/test_dir/1.txt’: No space left on device
1+0 records in
0+0 records out
1028587520 bytes (1.0 GB) copied, 1.13068 s, 910 MB/s

排查思路;当遇到文件空间不足时

#首先查看磁盘分区的使用率
df -h  

#对磁盘使用率较高的分区挂载点进行查看
du -sh /test_dir/*      | sort -hr 
du -sh /test_dir/xxx/*  | sort -hr 
由此方法一层一层的查找较大的文件

#对查找到的一个或多个较大的文件 判断是否可以删除

小文件较多(inode不足)

模拟环境

#模拟一个块文件并挂载
dd if=/dev/zero of=/test_sdb count=1 bs=10M
mkfs.ext4 /test_sdb
mkdir /inode_dir
mount /test_sdb /inode_dir/

df -i /inode_dir/
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/loop1       2560    11  2549    1% /inode_dir

模拟故障

#创建比分区inode数更多的文件
cd /inode_dir/

echo {1..2555} |xargs touch
touch: cannot touch ‘2550’: No space left on device
touch: cannot touch ‘2551’: No space left on device
touch: cannot touch ‘2552’: No space left on device
touch: cannot touch ‘2553’: No space left on device
touch: cannot touch ‘2554’: No space left on device
touch: cannot touch ‘2555’: No space left on device

排查思路

#首先查看磁盘分区的使用率;       (这里磁盘使用率仅百分之三,所以排除是因为 block不足导致的故障)
df -h /inode_dir/
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop1      8.7M  216K  7.8M   3% /inode_dir

#查看分区的inode使用率;        (inode使用率为百分之百,所以导致文件不可创建)
df -i /inode_dir/
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/loop1       2560  2560     0  100% /inode_dir

#查找分区中,哪一个目录下的文件过多,-size可调整
find /xxx -type d -size +1M 

#注: 目录的大小表示的是,目录下的文件个数的大小。
#	 目录大小为2.3M;该目录下大概会有10万个文件。
#     echo {1..100000} |xargs touch

因为文件没有被彻底删除

因为文件没有被彻底删除导致的磁盘空间不足案例

什么是彻底删除文件?(文件删除原理)

  • 文件删除条件:
    • 硬链接数为0
    • 进程调用数为0

模拟环境

#模拟一个块文件并挂载
dd if=/dev/zero of=/test_delete count=1 bs=1G
mkfs.xfs /test_delete
mkdir /delete_dir
mount /test_delete /delete_dir/

df -h  /delete_dir
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop2     1014M   33M  982M   4% /delete_dir

模拟文件没有被彻底删除–硬链接数不为0

模拟故障

#创建一个文件撑满分区
dd if=/dev/zero of=/delete_dir/1.txt count=1 bs=980M

#可用容量剩余1.8M
df -h /delete_dir/
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop2     1014M 1013M  1.8M 100% /delete_dir

#为文件创建一个硬链接
ln /delete_dir/1.txt /delete_dir/1.txt_ln

#磁盘空间不足
dd if=/dev/zero of=/delete_dir/2.txt count=1 bs=10M
dd: error writing ‘/delete_dir/2.txt’: No space left on device

#删除原文件
rm -rf /delete_dir/1.txt	

#再次查看,磁盘可用容量剩余,依旧为1.8M
df -h /delete_dir/
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop2     1014M 1013M  1.8M 100% /delete_dir

排查思路

#查看磁盘的容量
df -h

#排查分区中,文件大小
du -sh /xxx/*      |sort -hr
du -sh /xxx/xxx/*  |sort -hr

#将找到的文件确认,是否可以删除
#若删除后 磁盘可用量不变,再次使用 du -sh /xxx/* |sort hr 方法寻找

总结:文件删除的条件之一:硬链接数为0.

模拟文件没有被彻底删除–文件被进程调用

模拟故障

#写入数据
seq 100000000 >> /delete_dir/1.txt
ll -h /delete_dir/1.txt
-rw-r--r--. 1 root root 848M May 10 14:52 /delete_dir/1.txt

#查看磁盘使用率
df -h /delete_dir
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop2     1014M  880M  135M  87% /delete_dir

#打开一个新的终端连接,并访问此文件(使用tail -f 进程调用该文件)
tail -f /delete_dir/1.txt 
99999991
......

#删除该文件
rm -rf /delete_dir/1.txt 
ll -d /delete_dir/1.txt
ls: cannot access /delete_dir/1.txt: No such file or directory

#再次查看磁盘使用率(可以看到磁盘空间并没有被释放)
df -h /delete_dir
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop2     1014M  880M  135M  87% /delete_dir

排查思路

#查看磁盘的使用率
df -h

#查看分区下的文件大小(大致计算下,文件大小的总和 并与磁盘使用量进行比较)
du -sh /xxx/*      |sort -hr
注:如果发现文件大小的总和 与磁盘使用量差距很大;大概就是文件被没有被彻底删除导致的

#显示系统中所有被打开的文件;“deleted”表示文件没有入口,但是被调用(进程调用数不为0)
[root@localhost ~]# lsof  |grep deleted
COMMAND     PID  TID    USER   FD      TYPE        DEVICE  SIZE/OFF       NODE NAME
tail      16781         root    3r      REG          7,2 888888898         67 /delete_dir/1.txt (deleted)

#解决
重启或关闭对应的服务/进程

总结:文件被彻底删除条件之一:该文件被进程调用数为0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值