【问题现象】
服务器中执行umount卸载命令时提示磁盘没有挂载
[root@zxj ~]# umount /dev/xvdb1
umount: /dev/xvdb1: not mounted
【问题描述】
最开始接到用户反馈问题描述如下
1)新添加了一块数据盘,把数据盘挂载到了/home 目录下
2)/home 目录下原本是有文件的,导致原本的文件查看不到
【处理过程】
刚开始接到这个反馈,以为只是简单的同一个目录挂载了两个设备导致原本的文件被遮盖,只需要简单的进行umount卸载后挂载的数据盘分区即可。
但是用户反馈执行umount卸载时提示无法正常进行卸载。
而分区无法正常卸载一般可能的原因是有其他应用在占用分区,导致无法正常卸载,这种情况只需要通过fuser或lsof命令进行一下检测即可。但是用户反馈通过这两个命令检测不到结果,df -h 查询结果中磁盘已经是没有挂载了。
此时通过电话和用户进行了一下沟通,了解到用户是之前在执行mount挂载数据盘导致原本的数据看不到之后,自己在网上已经搜索了资料,看到有篇文章中说明更改了mtab文件。不得不吐槽一下用户找的是一个极其坑爹的文档,原本很简单umount命令就能搞定的事情,结果被弄得更加复杂。
【问题分析】
要解决用户的这个问题,就需要清楚系统中几个重要文件和命令之间的关系
1)/etc/fstab
作为一个系统运维,这个文件相对来说是接触比较多的,是Linux磁盘分区自动挂载的配置文件,系统在开机时会通过读取这个文件中的配置来对磁盘进行挂载,如果这个文件配置有问题,会在开机时导致系统无法正确读取分区配置而引发启动异常,一般异常的现象就是进行了修复模式,只需要输入密码进入系统后手动调整fstab文件配置,然后重启服务器即可修复
2)/etc/mtab
这个文件是系统的磁盘分区挂载状态配置文件,当用户在系统中直接执行mount命令对挂载状态进行查询时,其实就是读取的/etc/mtab 文件中的配置状态。df -h等查询系统磁盘状态的命令,也是要调用这个文件中的配置状态。所以如果此文件配置出现问题,直接的异常现象就是mount 和 df 等查询命令的查询结果不准确
3)/proc/mounts
/proc 目录是一个伪文件,这个目录下的配置是存在内存中的,并不占用磁盘空间,也是能够直观的查看到系统中当前各个硬件设备的状态信息。
【处理方案】
由于用户把 /etc/mtab 文件中的数据盘挂载进行了删除,所以就导致df -h 查询时查看不到数据盘的挂载信息,然而其实这个时候数据盘仍然是挂载着的,但是由于系统读取mtab文件时并没有这个数据盘的挂载信息,所以就会出现umount: /dev/xvdb1: not mounted的这个报错。只需要把/proc/mounts 文件中记录的挂载状态重新写入到 /etc/mtab 中,然后在按正常的卸载步骤对数据盘进行卸载即可。
【排查命令】
1)通过cat /etc/mtab 和 cat /proc/mounts 分别查看用户修改的文件和内存中记录的设备状态信息,从查询结果中来开,内存中其实还是有数据盘的这个挂载记录的,也就是说当前这个数据盘还是正常挂载的状态
2)把/proc/mounts查询到的这个数据盘的挂载信息手动写入到/etc/mtab 再次查询mstab文件状态如图
3)再次执行df -h查看已经可以正常看到数据盘的挂载信息
4)再次执行umount已经可以正常卸载数据盘,文件状态恢复正常
【总结】
问题其实并不是太复杂,关键点在于理清 /etc/fstab 、 /etc/mstab 、 /proc/mounts 、 df 、 mount几个文件和命令之间的关系