当前位置: 首页 > 原理解释

linuxdf命令原理-linux df 命令原理

我在机房里跑过一堆 F 盘爆满的案例,有时候真是个伤智眼的活儿。刚想起来,Linux 有个 `df` 命令,用来看磁盘占满没,但说实话,这玩意儿在 Linux 圈子里评价挺两极。有的说它是新手入门包,能一眼看到硬盘是 100% 还是 98%,不用查日志;有的认定那是底层鬼东西,非得懂分区的原理才能看懂。 这就好比你去检查家里是不是停电,用个万用表测电压,能知道有没有电,但测不出具体哪台电器耗电顶多,也没法分析电路哪儿短路。`df` 也是这个理儿,它是最底层的路由器,只关心“路”通没通,有没有人占满,至于路底下堵了没,要么哪根线断了,它管不着。 这个命令最早是检查 Linux 文件系统挂载点是否被文件占满,也就是 disk space。在早期的 Linux 里,`df` 实际上是用来检查文件系统是否被占满的,它盘根究底地看的是 `/dev/sdX` 这些底层设备,也就是我们常说的硬盘、SSD 要么光驱里的数据。
只要你挂载了某个目录,比如 `/home` 要么 `/var/log`,它就能告诉你这块地盘上堆了多少个文件,用了多少字节。 举个例子,假设你有一块 500GB 的 U 盘,你把它的根目录挂载成了 `/`,再加上一个用户目录 `/root`,然后你在里面疯狂新建文件夹。
这时候要是你用 `df` 一看,可能就会显示 `/` 已经 99.9% 用完了。你心里大约能猜到是某个程序在占用了整个根目录,要么某个大文件拖到了最终。
这实际上挺直观的,不用你懂代码,一眼就能看到这块地盘是不是被堵死入口了。 要是你的数据量特别大,比如几 TB,那光靠 `df` 输出表格里那几个数字,看着数字堆成山,根本没法一眼看出哪个文件夹占用了重灾区。
这时候就得结合 `du`(disk usage)命令,它是 `df` 的亲戚,专门用来数数的。`du` 能告诉你 `/home/my_folder` 这个路径下,到底有几 KB 的垃圾数据。
比如你在检查内存盘的时候,可能发现 `/var/lib/apt` 目录下面突然空了 50GB,这就是最近有用户去删数据要么迁移数据,`df` 告诉你这块地盘腾出来了,但 `du` 能告诉你原来这里到底存了啥。 并且,`df` 的显示方式也挺有意思。默认情况下,它输出的每一行代表一个挂载点。
要是你只输入 `df`,它会把挂载点分为几类,比如根目录、文件系统、tmpfs、ram 这些。但要是你加上 `-h` 参数,它会自动把单位换算成 GB、MB 要么 KB,这样你看起来就清爽多了,不用自己换算单位。 有时候,`df` 的输出会显得特别乱。
要是你挂载了如此多不同的文件系统,比如 `/mnt/backup`、`/data`、`/home`、`/tmp`,每个都显示了 98%,那你得知道它们分别是哪位。有些是读写的,有些是只读的,有些是 tmpfs 也就是内存里的缓存。`df` 默认会给出个字母后缀,比如 `rw` 表示读写,`ro` 表示只读。你能够根据这个来判断数据能不能改。 还有时候,你会遇到一个特殊情况。你挂载了 `/dev/sda1`,也就是硬盘的主分区,但你又挂载了 `/dev/sda2` 作为数据盘。
这时候你执行 `df`,可能会看到两个条目,一个显示 100%,一个显示 90%。
这没啥怪的。
还有一种情况,有的驱动不赞成 `df` 的输出,那它就会显示 `file system is not mounted` 要么 `unknown filesystem type`,这时候你得装个 `df -h` 看看,要么直接查驱动文档。 有时候你还会看到 `-x` 参数,这会让 `df` 输出一个更详细的表格,包含文件系统类型、大小、挂载点、容量剩余百分比、剩余字节数、空闲块数。
这个参数在排查难题时特别有用。
比方说,你发现某个目录空间不够用了,但 `df` 告诉你还有 1GB 空,这时候要是你用 `-x` 看看,可能会发现里面有 `tmp` 要么是 `proc` 之类的隐藏项,要么某个分区开启了 `quota` 限制。 另外,`df` 还有一个挺有意思的特性,就是它赞成 `swap` 和 `time` 参数。
要是你挂载了 Swap 分区,`df` 会把它单独显示出来,告诉你 Swap 盘空间剩多少。
要是你加上 `-t` 参数,它会按文件系统类型显示,比如 `ext4`、`xfs`、`btrfs`、`ntfs`。`ext4` 是 Windows 常见的,`xfs` 是服务器常用的,`btrfs` 是 Linux 2.4 赶明儿才有的,还能做 RAID。`ntfs` 就是 NTFS 格式的了,别看读写性能一般。
这些参数组合起来,能给你一张整个的磁盘状态图。 在实际工作中,大量时候我们根本不需求忒深入。
比如你刚进个新环境,要么刚安装完一个软件,最直观的就是看 `df`。
要是根目录满了,直接知道当前进程占了多少,不然你就得去查 `top` 要么 `ps -ef`。
要是某个目录被占满了,你直接点进去看看,大约率是某个程序在跑内存泄漏,要么某个大文件没删。 不过,有时候 `df` 也会给出误导性信息。
比方说,你挂载了一个 `/dev/sdb1`,这局部数据是归于共享存 SAN 的,要么是通过 NFS 共享的,它的挂载点可能显示是 `>removable` 要么 `>unpredictable`。
这时候要是你误当作是本地硬盘满了,赶紧清理,结局发现实际上那是一块共享存,直接删文件会报错。
这时候你可能就得换个命令,比如 `fstrim` 要么 `xfs_growfs`。 还有个难题,`df` 不检查挂载点是否真正可用。
要是你挂载了一个死掉的分区,要么一个只读的分区,它还能显示数据。
比如一个 `/dev/sdX1` 是 Read-only,你还把它挂载成了 `/boot`。
这时候 `df` 会显示 100%,但实际上你根本不能写数据。
这时候你可能会认定系统坏了,实际上你是被格式化要么设置了只读,得去检查一下挂载选项。 总的来说,`df` 是个工具,不是专家。它就像个守门员,负责拦截掉盘子的现象,告诉你“门”是不是被堵死了。你真正需求懂得的是,如何把门打开,如何在里面收拾东西,如何修路。当你理解了数据为啥被占用,理解了文件系统层级,理解了配额和锁机制,你才能真正明白那根线是如何断的,而不是只盯着那行数字看。 最终,实际上 `df` 的输出格式也不是挺统一。
不同的发行版、不同的内核版本,就连是最新的内核,输出格式可能会微调。
比如有的版本会在第一行显示文件名,有的不会。有的版本会把单元换算成 GB,有的不会。
这种不稳定性,有时候会让新手认定这命令忒复杂。
实际上不用忒纠结格式,只要知道它拼的是块大小、块数、剩余字节数就行。至于具体的格式,你能够根据需求手动调整 `output` 参数,比如改成 `output=total,used,freed,avail,speed`,把需求的列都列出来。 总而言之,`df` 是个好东西,但它不该被神化。别指望它直接告诉你你的数据库里哪个表崩了,别指望它告诉你你的物理硬盘里哪个盘道坏了。它只是告诉你,硬盘空间还剩多少,是不是被占满了。至于如何解决占满的难题,如何腾挪空间,如何找到那个占坑的进程,那得靠你的专业劲儿。
相关标签:

猜你喜欢

热门阅读

  • 赖柴尔定理-赖柴尔定理
  • 迪拜哪个国家的城市?-迪拜在哪国城市
  • 李毅吧番号及出处-李毅吧番号及出处
  • 贴春联的由来简介50字-春联由来简述
  • 思乡的名言和出处-思乡名言及出处

其他分站