Linux系统 df 命令显示异常、分区丢失问题解决
本文记录 2 种因 /etc/mtab 文件异常导致 df 命令显示异常、分区丢失问题的解决过程,以备后用。
一、根目录丢失
前些日子,同事在 RTX 群里问大家,有台服务器执行 df -h 看不到根目录,该如何解决?
[root@10.207.126.12:~]# df -h
Filesystem Size Used Avail Use% Mounted on
udev 8.0G 168K 8.0G 1% /dev
/dev/sda3 20G 1.7G 18G 9% /usr/local
/dev/sda4 103G 63G 35G 65% /data
于是我帮忙解决了一把,看了下 /etc/fstab 内容,根目录挂载信息是正常的:
[root@10.207.126.12:~]# cat /etc/fstab
/dev/sda1 / ext3 noatime,acl,user_xattr 1 1
/dev/sda2 swap swap defaults 0 0
/dev/sda3 /usr/local ext3 noatime,acl,user_xattr 1 2
/dev/sda4 /data ext3 noatime,acl,user_xattr 1 2
proc /proc proc defaults 0 0
sysfs /sys sysfs noauto 0 0
debugfs /sys/kernel/debug debugfs noauto 0 0
devpts /dev/pts devpts mode=0620,gid=5 0 0
接着,看了下 /etc/mtab 文件内容,发现根目录缺失:
[root@10.207.126.12:~]# cat /etc/mtab
proc /proc proc rw 0 0
udev /dev tmpfs rw 0 0
devpts /dev/pts devpts rw,mode=0620,gid=5 0 0
/dev/sda3 /usr/local ext3 rw,noatime,acl,user_xattr 0 0
/dev/sda4 /data ext3 rw,noatime,acl,user_xattr 0 0
nfsd /proc/fs/nfsd nfsd rw 0 0
执行 grep -v rootfs /proc/mounts 命令进行修复:
[root@10.207.126.12:~]# grep -v rootfs /proc/mounts > /etc/mtab
[root@10.207.126.12:~]# cat /etc/mtab
/dev/root / ext3 rw,data=ordered 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
udev /dev tmpfs rw 0 0
devpts /dev/pts devpts rw 0 0
/dev/sda3 /usr/local ext3 rw,noatime,data=ordered 0 0
/dev/sda4 /data ext3 rw,noatime,data=ordered 0 0
nfsd /proc/fs/nfsd nfsd rw 0 0
可以看到,根目录已经出现了,再执行 df -h 就正常了:
[root@10.207.126.12:~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 9.9G 5.0G 4.4G 54% /
udev 8.0G 168K 8.0G 1% /dev
/dev/sda3 20G 1.7G 18G 9% /usr/local
/dev/sda4 103G 63G 35G 65% /data
二、df 命令报错
帮同事解决问题后,不巧自己负责的服务器也出现类似问题,执行 df 命令报如下错误:
df: cannot read table of mounted file systems: No such file or directory
想着应该可以上述问题原因一样,所以直接执行修复命令,发现报错:
[root@10.12.208.117:/var/spool/postfix]# grep -v rootfs /proc/mounts > /etc/mtab
grep: write error: No space left on device
看来是空间不足,找了下发现是 maildrop 目录把根目录撑爆了:
[root@10.12.208.117:/var/spool/postfix]# du -sh *
4.0K active
4.0K bounce
4.0K corrupt
4.0K defer
4.0K deferred
4.0K flush
4.0K hold
4.0K incoming
9.4G maildrop
8.0K pid
4.0K private
4.0K public
4.0K saved
4.0K trace
直接清空,在执行 grep -v rootfs /proc/mounts >/etc/mtab 命令进行修复:
[root@10.12.208.117:/var/spool/postfix]# grep -v rootfs /proc/mounts > /etc/mtab
[root@10.12.208.117:/var/spool/postfix]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 20G 10.5G 9.5G 53% /
/dev/sda2 20G 1.7G 18G 9% /usr/local
/dev/sda3 103G 63G 35G 65% /data
已经正常了,maildrop 爆满的问题一般是 crontab 未屏蔽错误造成的,于是顺手将 crontab 里面的条目都带上了 2>&1 屏蔽了,下次应该不会出现因为目录爆满导致 mtab 异常的情况了。
三、区别与联系
继续记录一下/etc/fstab 和/etc/mtab 的区别和联系。
/etc/fstab 文件记录了服务器上硬盘分区信息,启动 Linux 的时候,检查分区的 fsck 命令和挂载分区的 mount 命令都需要 fstab 中的信息,来检查和挂载分区。
/etc/mtab 文件记载的是现在系统已经装载的文件系统,包括操作系统建立的虚拟文件等,每当 mount 挂载分区、umount 卸载分区,都会动态更新 mtab,mtab 总是保持着当前系统中已挂载的分区信息,fdisk、df 这类程序,必须要读取 mtab 文件,才能获得当前系统中的分区挂载情况。
当然我们自己还可以通过读取/proc/mount 也可以来获取当前挂载信息(即使用文章中用到的修复命令 grep -v rootfs /proc/mounts)。
当 /etc/mtab 因为磁盘满或文件系统异常,导致该文件内缺失常或直接为空,就会出现上文记录的问题了。
- mysql数据库误删除后的数据恢复操作说明
- 在.NET平台上运行Java程序-IKVM.NET入门
- ArraySegment<T>泛型结构示例
- SwitchButton 开关按钮 的多种实现方式
- SVN和Git对比梳理
- linux下expect环境安装以及简单脚本测试
- 泛型List<T>使用示例
- linux系统最小化安装后的初始化脚本
- 简单对比git pull和git pull --rebase的使用
- VS 2010一步步开发windows服务(windows service)
- 运算符重载,以及迭代器[foreach]示例
- 牛津大学王宁博士:大数据与有限理性
- 侃哥:苹果服软了就“降速门”公开致歉并祭出优惠
- 委托示例(利用委托对不同类型的对象数组排序)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Yii框架通过请求组件处理get,post请求的方法分析
- PHP实现单文件、多个单文件、多文件上传函数的封装示例
- Android自定义控件单位尺寸实现代码
- Android中socket通信的简单实现
- Thinkphp5框架使用validate实现验证功能的方法
- Android通过Java sdk的方式接入OpenCv的方法
- php+js实现的无刷新下载文件功能示例
- Android如何获取视频首帧图片
- PHP单文件上传原理及上传函数的封装操作示例
- php中错误处理操作实例分析
- Android 百度地图定位实现仿钉钉签到打卡功能的完整代码
- Thinkphp5框架实现图片、音频和视频文件的上传功能详解
- Android使用Opengl录像时添加水印
- Laravel使用Queue队列的技巧汇总
- Thinkphp5框架ajax接口实现方法分析