刚上线不久的一台主机,由于监控组没有加入监控,dba在上去操作的时候,发现其中一个分区的磁盘空间利用率满了。当其上将内容粘贴出来时,发现了一个问题,该挂载点给分配了58G的大小,实际使用了55G,结果就报空间使用100%了。

1[oracle@361way oracle]$ df -h
2Filesystem Size Used Avail Use% Mounted on
3/dev/sda1 20G 5.7G 13G 32% /
4tmpfs 63G 456M 63G 1% /dev/shm
5/dev/sda8 7.7G 317M 7.0G 5% /home
6/dev/sda10 58G 16G 40G 29% /opt
7/dev/sda11 58G 55G 0 100% /opt/cmcc

当同事问我为什么还有3G大小的可用空间的时候,会报已用100%呢?听完他的描述时,思维里直接闪过的几个词是:lsof|grep deleted、quota 。不过在看df -h的结果后,发现deleted和磁盘配额两个想法都不对。

1、deleted这种情况是表示在物理磁盘上显示已经将文件删除,但是有进程在调用该文件时实际上并未在磁盘上清除。这种情况下未清理的数据会计算在used里,即如果是这种情况,used也会是58G,但/opt/cmcc下所有文件du * -sh之和小于58G 。

2、磁盘配额是针对用户在某个挂载点下使用空间的一种限制,但这种限制并不会反映到df 的输出结果里。即普通用户在该挂载点无法写入,但df看到的结果仍然是正常的百分比,如显示总已用50%的空间,但写入的时候提示出错。

除了上面的理论推导,真正去通过lsof和mount指令查看时,lsof下的deleted的部分也并没多少K,mount查看到该分区在挂载时也未看到有usrquota,grpquota两个参数。想到quota,突然灵光咋现 ———— 还有另外一个“ quota ”,这个所谓的“ quota ”叫reserved-blocks-percentage (预留块百分比)。也就是在分区的时候,默认每个分区会有5%的空间预留给超级管理员用户(这里指常见的ext2/3/4 ,像swap除外),避免在如果i 节点不够用等特殊情况下管理员有操作空间

55G/58G = 94.83% ,约等于95%(在磁盘换算过程中由于使用的单位不同,这个有约0.02左右的误差是可能的)。也就是说确实和默认一样有5%的预留。

这里也列举下三个相关的指令 。

1、dumpe2fs指令

1dumpe2fs - dump ext2/ext3/ext4 filesystem information

dumpe2fs指令的作用是导出ext2/ext3/ext4文件信息的,使用dumpe2fs /dev/sda11 查看到的结果如下:

dumpe2fs

上面除了我们常见的UUID(和 blkid 输出的UUID一样) 、i 节点数、文件系统编号等信息,这里还发现了该问题中要用到的总的块大小、预留块大小、单个块的大小。这里可以算下系统为该分区预留了多大空间

4096 Byte * 768204 /1024 /1024 /1024 = 2.93G  ,约为3G 。

2、mkfs指令

这里的mkfs指认不仅仅指mkfs.ext2(ext3、ext4) 三个指令,还包括mke2fs命令 。这些指令都是可以在格式化分区时指定分区类型和分区参数 ,具体参数如下:

 1-b<区块大小> 指定区块大小,单位为字节。
 2-c 检查是否有损坏的区块。
 3-f<不连续区段大小> 指定不连续区段的大小,单位为字节。
 4-F 不管指定的设备为何,强制执行mke2fs。
 5-i<字节> 指定"字节/inode"的比例。
 6-N<inode数> 指定要建立的inode数目。
 7-l<文件> 从指定的文件中,读取文件西中损坏区块的信息。
 8-L<标签> 设置文件系统的标签名称。
 9-m<百分比值> 指定给管理员保留区块的比例,预设为5%。
10-M 记录最后一次挂入的目录。
11-q 执行时不显示任何信息。
12-t 指定创建文件系统类型
13-r 指定要建立的ext2文件系统版本。
14-R=<区块数> 设置磁盘阵列参数。
15-S 仅写入superblock与group descriptors,而不更改inode able inode bitmap以及block bitmap。

注:实际上这四个指令在狭义上讲都称作mke2fs指令,例如执行  man mkfs.ext4 时会发现显示的是man mke2fs指令的帮助信息

3、tune2fs指令

tune2fs是调整和查看ext2/ext3文件系统的文件系统参数,其使用参数有:

1-l 查看文件系统信息
2-c max-mount-counts 设置强制自检的挂载次数,如果开启,每挂载一次mount conut就会加1,超过次数就会强制自检
3-i interval-between-checks[d|m|w] 设置强制自检的时间间隔[d天m月w周]
4-m reserved-blocks-percentage 保留块的百分比
5-j 将ext2文件系统转换为ext3类型的文件系统
6-L volume-label 类似e2label的功能,可以修改文件系统的标签
7-r reserved-blocks-count 调整系统保留空间
8-o [^]mount-option[,...] Set or clear the indicated default mount options in the filesystem. 设置或清除默认挂载的文件系统选项

常见用法有:

1tune2fs -m 1 /dev/sda1  将/dev/sda1分区的保留比调为1%
2tune2fs -r 40000 /dev/sda1 调整/dev/hda1分区的保留空间为40000个磁盘块
3tune2fs -c -l /dev/hda1 关闭强制检查挂载次数限制。
4tune2fs -i 10 /dev/hda1 10天后检查
5tune2fs -i 1d /dev/hda1 1天后检查
6tune2fs -i 3w /dev/hda1 3周后检查
7tune2fs -i 6m /dev/hda1 半年后检查
8tune2fs -i 0 /dev/hda1 禁用时间检查

其他相关指令还有e2fsck、e2label ,由于和本篇问题的关联性不大,这里就不再列举其用法。