day31-磁盘空间不足故障模拟及解析

故障模拟

创建一个100k大小的文件系统

创建一个100k大小的文件

[root@oldboy ~]# dd if=/dev/zero of=/tmp/100k bs=1k count=100
100+0 records in
100+0 records out
102400 bytes (102 kB) copied, 0.106309 s, 963 kB/s

dd命令作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

dd  if=/dev/zero      of=/tmp/100k    bs=1k                   count=100
    input file        output file     block size              数量 
    从哪里获取数据    输出文件        每次复制多大(10k 1M)

/dev/zero #白洞 源源不断输出
/dev/null #黑洞
/dev/urandom #设备文件
检查大小

[root@oldboy ~]# ll -h /tmp/100k
-rw-r--r--. 1 root root 100K May 13 13:36 /tmp/100k

创建文件系统

[root@oldboy ~]# mkfs.ext4 /tmp/100k
mke2fs 1.42.9 (28-Dec-2013)
/tmp/100k is not a block special device.  ##提示他不是一个·块设备
Proceed anyway? (y,n) y                         ##回复y即可

Filesystem too small for a journal
Discarding device blocks: done                            
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
16 inodes, 100 blocks
5 blocks (5.00%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
16 inodes per group

Allocating group tables: done                            
Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done

查看文件类型

[root@oldboy ~]# file /tmp/100k
/tmp/100k: Linux rev 1.0 ext2 filesystem data, UUID=6cf23b5b-00da-4757-b9fd-f7d92e7492e8 (extents) (64bit) (huge files)

挂载到/app/log/

[root@gebangfeng ~]# mkdir -p /app/log
[root@gebangfeng ~]# mount /tmp/100k /app/log

检查是否挂载成功

9469008-ec3eff1912df8419.png
image.png

检查inode大小
9469008-e7240ea81c6e3504.png
image.png

上图表示inode 大小为16个 以使用11个。表示只能再使用5个。

模拟inode满了

在/app/log下创建10个文件

[root@gebangfeng ~]# cd /app/log
[root@gebangfeng /app/log]# touch oldboy{01..10}.txt
touch: cannot touch ‘oldboy06.txt’: No space left on device
touch: cannot touch ‘oldboy07.txt’: No space left on device
touch: cannot touch ‘oldboy08.txt’: No space left on device
touch: cannot touch ‘oldboy09.txt’: No space left on device
touch: cannot touch ‘oldboy10.txt’: No space left on device

我愿意要创建10个文件,创建5个之后就提示 No space left on device
表示磁盘没有空余空间

然后检查磁盘是否真的满了

[root@gebangfeng /app/log]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        19G  1.7G   18G   9% /
devtmpfs        980M     0  980M   0% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M  9.7M  981M   1% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sdb1        98M  5.3M   93M   6% /mnt
/dev/sda1       197M  105M   93M  54% /boot
/dev/loop0       93K   14K   72K  17% /app/log

使用df命令检查却并没有满

检查inode是否满了

[root@gebangfeng /app/log]# df -i
Filesystem      Inodes IUsed   IFree IUse% Mounted on
/dev/sda3      9858560 60484 9798076    1% /
devtmpfs        250786   406  250380    1% /dev
tmpfs           253511     1  253510    1% /dev/shm
tmpfs           253511   753  252758    1% /run
tmpfs           253511    16  253495    1% /sys/fs/cgroup
/dev/sdb1        51712     3   51709    1% /mnt
/dev/sda1       102400   326  102074    1% /boot
tmpfs           253511     1  253510    1% /run/user/1000
tmpfs           253511     1  253510    1% /run/user/0
/dev/loop0          16    16       0  100% /app/log

解析:原来·是目录的inode满了。df 默认是查看分区的block.要查看inode需要使用df -i命令

预备知识

Linux下面删除大量小文件(文件) Argument list too long 解决流程

新建一个目录并在目录下创建大量的文件

[root@gebangfeng ~]# mkdir test
[root@gebangfeng ~]# touch test/{1..400000}
-bash: /bin/touch: Argument list too long

Argument list too long 意思表示列表过长。意思就是说我创建的文件太多了

解决

[root@gebangfeng ~]# echo test/{1..400000}|xargs touch
[root@gebangfeng ~]# ls test/ |wc -l
400000

如何删除大量文件·

[root@gebangfeng ~]# find test/ -type f |xargs rm -f
[root@gebangfeng ~]# ls test/ |wc -l
0

Linux文件删除原理:

Linux彻底删除1个文件的条件:
1.没有入口(rm 硬链接数为0) oldboy.txt /etc/hosts
2.没有人使用这个文件(进程调用数为0) 重启这个服务

yum install lsof -y 安装lsof命令
lsof list open files 显示系统中所有被打开的文件(使用中)


[root@oldboyedu59 ~]# lsof |grep alex.txt
tail      14737         root    3r      REG                8,3           0       134348620 /root/alex.txt
命令或服务                                                               文件大小 inode    文件 
[root@oldboyedu59 ~]# lsof |grep alex.txt
vim       14935         root    4u      REG                8,3       12288  134348621 /root/.alex.txt.swp

模拟文件没有被彻底删除导致磁盘空间不足

环境准备

创建一个超级大的文件并且追加到 /var/log/messages

[root@gebangfeng ~]# seq 500000000 >>/var/log/messages

执行这个命令时间会比较久

故障案例

[root@gebangfeng ~]# seq 10000 >>/oldboy.txt
seq: write error: No space left on device

No space left on device表示空间不足。有两种可能一个是inode满了,一个是bloc满了
这个故障是往文件里写东西。有可能是block满了。因为这里面放的是文件的内容。

查看磁盘整体使用情况

9469008-2c4acd46cb8d9604.png
image.png

发现/已经满了。现在需要找出导致/满的文件
9469008-264977ae69b4176a.png
image.png

9469008-9d481920e351a743.png
image.png

发现是/var那么继续往下找
9469008-8004c1fea2a57638.png
image.png

已经找到了
9469008-81dd864328f989f7.png
image.png

删除导致磁盘满的文件
9469008-6d9dc10829c96d2a.png
image.png

删除后却发现/分区还是满的,

解决

[root@oldboy ~]# lsof |grep messages
abrt-watc 6444         root    4r      REG                8,3 12555560589      42236 /var/log/messages
rsyslogd  7106         root    7w      REG                8,3 12555560589      42236 /var/log/messages
in:imjour 7106 7366    root    7w      REG                8,3 12555560589      42236 /var/log/messages
rs:main   7106 7369    root    7w      REG                8,3 12555560589      42236 /var/log/messages
abrt-dump 7404         root    0r      REG                8,3 12555560589      42236 /var/log/messages

这是查看文件删除后,还被占用中的文件rsyslogd 为系统日志服务。系统日志就是这个服务写入的。abrt-dump也是

重启这两个服务

[root@oldboy ~]# systemctl restart rsyslog.service  abrtd.service 
[root@oldboy ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        20G  3.5G   17G  18% /
devtmpfs        476M     0  476M   0% /dev
tmpfs           487M     0  487M   0% /dev/shm
tmpfs           487M   14M  473M   3% /run
tmpfs           487M     0  487M   0% /sys/fs/cgroup
/dev/sda1       197M  133M   64M  68% /boot
tmpfs            98M     0   98M   0% /run/user/0

这样就解决了

添加sawp容量

sawp分区为交换分区.他是当系统内存 不足时充当内存使用的。不过之前我们都是安装系统的时候换分的sawp分区。可是你买一台云服务器默认没有swap分区的。那么我们后期如何添加呢?
用dd命令生成指定大小的文件

[root@gebangfeng ~]# dd if=/dev/zero of=/tmp/500M bs=1M count=500
500+0 records in
500+0 records out
524288000 bytes (524 MB) copied, 11.8038 s, 44.4 MB/s

进行格式化

[root@gebangfeng ~]# mkswap /tmp/500M
Setting up swapspace version 1, size = 511996 KiB
no label, UUID=655f6e67-6dbd-4c66-bfae-e4f41aa62f98

进行临时挂载

[root@gebangfeng ~]# chmod 600 /tmp/500M
[root@gebangfeng ~]# swapon /tmp/500M
[root@gebangfeng ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        122M        1.1G        9.5M        757M        1.6G
Swap:          1.5G          0B        1.5G

永久挂载

[root@gebangfeng ~]# tail -n1 /etc/rc.local
swapon /tmp/500M

直接把命令写入开机自启动文件/etc/rc.local.要注意的是这个文件要给他执行权限。因为他本身就是一个脚本。

文件系统及应用场景

m reiserfs大量小文件业务首选reiserfs(100K以内), 单独安装。
m xfs有的门户的数据库MySQL业务会选择xfs。
m ext4 视频下载,流媒体,数据库,小文件业务也OK,可以用默认的。
m ext2 没有日志,蓝汛、网宿的cache业务,CDN 网站加速服务的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值