2

Linux系统 df 命令显示异常、分区丢失问题解决

 2 years ago
source link: https://zhang.ge/5107.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Jager · 8月6日 · 2016年linux · linux基础知识 · Linux文件锁定 10429次已读

本文记录2种因 /etc/mtab 文件异常导致 df 命令显示异常、分区丢失问题的解决过程,以备后用。

一、根目录丢失

前些日子,同事在RTX群里问大家,有台服务器执行 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 内容,根目录挂载信息是正常的:

[[email protected]:~]# 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 文件内容,发现根目录缺失:

[[email protected]:~]# 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 命令进行修复:

[[email protected]:~]# grep -v rootfs /proc/mounts > /etc/mtab
[[email protected]:~]# 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 就正常了:

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

想着应该可以上述问题原因一样,所以直接执行修复命令,发现报错:

[[email protected]:/var/spool/postfix]# grep -v rootfs /proc/mounts > /etc/mtab
grep: write error: No space left on device

看来是空间不足,找了下发现是 maildrop 目录把根目录撑爆了:

[[email protected]:/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 命令进行修复:

[[email protected]:/var/spool/postfix]# grep -v rootfs /proc/mounts > /etc/mtab
[[email protected]:/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 因为磁盘满或文件系统异常,导致该文件内缺失常或直接为空,就会出现上文记录的问题了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK