一、背景说明
朋友咨询Linux系统下输入df -h命令后没有任何输出结果,博主的第一反应是/根分区磁盘空间满了,朋友说cd等其他命令可以执行。博主又猜测可能是有人误定义了命令别名,进一步确认命令卡住在等待输出页面。事后博主想起来可能是共享网络磁盘无法访问导致的,博主曾经遇到过一次nfs挂载配置到了/etc/fstab中,服务器重启之后因为nfs服务端挂掉了导致服务器无法启动。
为了验证博主的想法搭建了一个实验环境,环境说明如下:
- nfs-server操作系统:centos7.6
- nfs-client操作系统:centos6.5
二、验证方案
1、搭建NFS服务端
关于NFS服务的搭建我们可以参考博文Linux之centos7环境搭建NFS服务器。
[root@s76 publicdata]# systemctl status nfs-server
2、NFS客户端挂载
客户端上安装showmount软件包,然后挂载nfs共享磁盘即可。
[root@localhost]~# mount -t nfs 192.168.10.76:/publicdata /test
[root@localhost]~# df -hT
3、模拟NFS server服务故障
为了模拟NFS server服务故障我们可以停止nfs服务或者通过防火墙阻断NFS服务。
[root@s76 publicdata]# systemctl stop nfs-serve
4、验证df命令
当NFS服务挂掉的情况下,不仅df命令、ls等查看磁盘目录的命令如果涉及到/挂载目录也会出现命令卡住没有输出的情况。df命令还可以通过ctrl+C命令中断回到shell中断,ls命令甚至无法通过ctrl+C或者ctrl+Z命令返回重新执行。
5、恢复NFS server服务再次验证
NFS server服务恢复后再次验证,df -hT命令执行的时候还是会卡住,等个几秒钟,nfs客户端会与NFS server重新建立连接,并正常输出信息。
[root@localhost]~# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 36G 2.0G 32G 6% /
tmpfs tmpfs 931M 0 931M 0% /dev/shm
/dev/sda1 ext4 291M 39M 238M 14% /boot
192.168.10.76:/publicdata nfs 56G 5.2G 51G 10% /test
6、别名的可能性验证
如下测试结果,如果是正常的"df -h"没有输出不可能是别名的原因,因为别名不能包含空格,如果是错误输入df-h命令是可以通过别名实现如上效果的。当然为了确认别名的问题,我们还可以使用which命令验证确认是否为别名。
[root@localhost]/# alias df-h="echo "";sleep 1000"
[root@localhost]/# df-h
[root@localhost]/# which df
/bin/df
7、根分区满导致此现象的可能性验证
我们可以尝试将跟分区磁盘空间写满,直到无法写入。虽然显示100%使用,实际上不会是完整的刚好百分百,但是这种情况我们还是可以执行df -h命令。所以经验证根分区满不会导致此现象。
dd if=/dev/zero of=/fill_disk bs=100M count=100
[root@localhost]/# dd if=/dev/zero of=/fill_disk7 bs=1k count=1
三、NFS server服务宕机的情况重启服务器验证
1、停止nfs server服务
[root@s76 publicdata]# systemctl stop nfs-server
2、将nfs挂载写入到/etc/fstab
[root@localhost]~# cat /etc/fstab |grep test
192.168.10.76:/publicdata /test nfs defaults 0 0
3、重启nfs客户端服务器
[root@localhost]~# reboot
4、控制台登录验证
控制台登录验证对比发现nfs共享磁盘配置在/etc/fstab中会停留在如何页面数分钟,最终还是可以启动成功。如果没有在/etc/fstab中配置NFS共享磁盘自动挂载则很快启动完成。
四、故障原因及处置步骤
一、故障原因分析
如上实验所示,df命令卡住无输出的原因就是nfs共享磁盘无法访问导致。df命令不仅会读取本地磁盘,也会读取挂载的其他任意磁盘,当无法连接到远程的nfs服务的时候就会一直在等待nfs server服务回复消息。
二、建议处置步骤
针对不同业务场景,建议如下:
- 如果是对于熟悉的环境知道nfs服务所在地址,我们可以登录nfs server服务器启动nfs服务,重新执行命令等待结果输出;
- 如果是不熟悉的陌生环境,建议先通过history命令查看历史挂载记录,查看/etc/fstab文件等确认可能的nfs server地址,然后登录nfs服务器启动nfs服务后重新挂载。
- 如果是nfs服务器执行了迁移调整,我们可以先取消nfs服务挂载,然后重新挂载新的nfs共享磁盘。
[root@localhost]~# umount -a -t nfs