在服务端开发的道路上,如果没有收到过磁盘不足的报警信息,职业生涯绝对是不完美的,每当服务器磁盘报警的时候,运维小姐姐都会怼我一句:"100G的磁盘,三天的日志都保存不了,真不知道你都往日志里输出啥玩意~",其实呢!磁盘报警有时候也不能怪我这个纯良的开发把业务日志输出太多,还可能是其他原因导致的,这个时候我们就需要通过磁盘管理命令定位一下问题到底出在哪里。日常服务器磁盘管理,常使用 df、du
这两个命令。
df命令
df
命令用于列出文件在系统磁盘分区及磁盘使用情况,命令各参数:
-a 列出所有文件系统,包括系统/proc及远程mfs或nfs挂载
-k 以KB为单位显示磁盘使用情况
-m 以MB为单位显示磁盘使用情况
-h 以KB、MB、GB等更直观的方式显示磁盘使用情况,超过1GB使用GB为单位显示,超过1MB以MB为单位显示,依次类推
-H 原理同 -h 类似,不同于 -h 的是,大写的 -H 是以 1M=1000k 为计算(-h 是以 1M=1024K 计算)
-T 连同文件系统的类型也列入来,例如:
-i 显示文件的 inode 数量
-
不加任何参数执行
df
命令,执行结果默认以KB为单位,输出示例如下:Filesystem 1K-blocks Used Available Use% Mounted on /dev/vda3 20907756 4642780 15216276 24% / tmpfs 4030688 68 4030620 1% /dev/shm /dev/vda1 202770 52193 140337 28% /boot /dev/vdb1 104698868 30949804 68506192 32% /data 10.131.xx.xx:9421 16288896192 5283568192 11005328000 33% /mnt/mfs
Filesystem
代表文件系统对应的设备磁盘分区,1K-blocks
表示总的磁盘分区大小(这里是1KB为单位),User
表示已使用的磁盘空间大小,Available
表示剩余可用的磁盘空间大小,Use%
表示磁盘使用率,也就是已使用的磁盘空间大小占该磁盘分区的比例,Mounted on
表示文件系统的挂载点;需要知道的一个重要注意点: Used + Available 并不等于总的磁盘分区大小,这是因为文件系统默认的每个分区都留了少量空间供系统管理员使用,即使遇到普通用户Use%达到100%的情况,管理员仍能登录和留有解决问题所需的工作空间
-
通常我们都是以一种更直观的方式看磁盘使用情况,
df -h
使用是最多的,输出示例如下:Filesystem Size Used Avail Use% Mounted on /dev/vda3 20G 4.5G 15G 24% / tmpfs 3.9G 68K 3.9G 1% /dev/shm /dev/vda1 199M 51M 138M 28% /boot /dev/vdb1 100G 30G 66G 32% /data 10.131.xx.xx:9421 16T 5.0T 11T 33% /mnt/mfs
-h 会根据文件的大小不同选择最直观的单位,因此对总的磁盘分区大小使用
Size
-
有时可能需要单位精确大M,使用
df -m
输出示例如下:Filesystem 1M-blocks Used Available Use% Mounted on /dev/vda3 20418 4534 14860 24% / tmpfs 3937 1 3937 1% /dev/shm /dev/vda1 199 51 138 28% /boot /dev/vdb1 102245 30225 66901 32% /data 10.131.xx.xx:9421 15907054 5159735 10747320 33% /mnt/mfs
1M-blocks
表示总的磁盘分区大小(这里是1MB为单位) -
我曾遇到过磁盘空间还足够,但是inode节点已经用尽的情况,这个时候就可以使用
df -i
,输出示例如下:Filesystem Inodes IUsed IFree IUse% Mounted on /dev/vda3 1318912 88079 1230833 7% / tmpfs 1007672 18 1007654 1% /dev/shm /dev/vda1 51200 44 51156 1% /boot /dev/vdb1 6553600 24326 6529274 1% /data 10.131.xx.xx:9421 1076104738 75098711 1001006027 7% /mnt/mfs
Inodes
表示磁盘分区总的inode节点数量,IUsed
表示已使用的inode节点,Available
表示还可以用的inode节点,Use%
表示已使用的inode节点数量占该磁盘分区的总inode节点数量的比例 -
可以使用
df -aT
列出所有文件系统并查看其类型,输出示例如下:Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/vda3 ext4 20907756 4642824 15216232 24% / proc proc 0 0 0 - /proc sysfs sysfs 0 0 0 - /sys devpts devpts 0 0 0 - /dev/pts tmpfs tmpfs 4030688 68 4030620 1% /dev/shm /dev/vda1 ext4 202770 52193 140337 28% /boot /dev/vdb1 ext4 104698868 30950588 68505408 32% /data 10.131.xx.xx:9421 fuse.mfs 16288823616 5283568256 11005255360 33% /mnt/mfs
Type
表示文件系统的类型,除了我们熟知的ext4类型以外,Linux系统还有很多系统所使用的文件类型 -
有时只需要查询特定的目录即可,则在
df
命令后指定目录即可, 比如df -hT /mnt/mfs/
输出示例如下:Filesystem Type Size Used Avail Use% Mounted on 10.131.xx.xx:9421 fuse.mfs 16T 5.0T 11T 33% /mnt/mfs
du 命令
du
的英文原义为"disk usage",含义为显示磁盘空间的使用情况,常用于统计文件(夹)所占磁盘空间的大小,命令各参数:
-a 递归地显示指定目录下各文件及子目录中各文件占用的磁盘大小,这个命令如果是目录很深很多的话,慎用
-s 列出目录所占用容量,目录下的子目录会递归汇总,这个参数一般不单独使用
-S 和 -s 类似,列出目录所占用容量,不同之处在于,大写的 -S 不包括子目录下的统计,这个参数一般不单独使用
-k 以KB为单位列出目录下的文件(夹)占用容量
-m 以MB为单位列出文件(夹)占用容量
-h 以KB、MB、GB等更直观的方式列出文件(夹)占用容量,超过1GB使用GB为单位显示,超过1MB以MB为单位显示,依次类推
-H 原理同 -h 类似,不同于 -h 的是,大写的 -H 是以 1M=1000k 为计算(-h 是以 1M=1024K 计算)
-
在一个目录下执行
du
命令,相当于du -a /当前目录
,如果文件很多很大,可能会出现一个很长的清单,甚至目录过多会卡死,一般不会使用du
或者du -a
,我们大部分时候使用du
命令只需要统计指定目录下文件(夹)的占用容量,常使用du -sh *
, 没有给出指定目录,则默认对当前目录进行统计,通配符*
则是代表目录下所有,输出示例如下:68K conf 4.0K index.html 230M java 380M jetty 9.0G log 16K lost+found 990M nginx 64M node
总结: 日常服务器遇到磁盘不足的情况时,通常先使用 df
找到磁盘不足的分区,去到挂载点目录,执行 du -sh *
定位到大的文件或者目录,执行相应的解决方案。