当前位置:首页>Linux>瑞芯微——Linux的常用指令df--du

瑞芯微——Linux的常用指令df--du

  • 2026-09-14 19:33:04
瑞芯微——Linux的常用指令df--du

Linux的常用指令--df--du

作为一个Linux内核驱动开发者,尤其是做RV1126b这类嵌入式开发板调试时,你一定遇到过这种“致命报错”:驱动编译好的.ko文件无法加载,提示 No space left on device;或者开发板日志打印一半突然停了,排查半天发现是根文件系统被占满了。这时候,单靠一个命令找不到问题根源——你需要 df 和 du 这对“磁盘空间排查搭档”:df负责“看全局”(哪个分区满了),du负责“找细节”(哪个文件/目录占了空间),两者配合才能快速定位磁盘空间问题。

在我看来,df就像嵌入式开发板的“磁盘体检仪”,能一眼看清所有分区的总容量、已用空间、可用空间;而du就像“空间侦探”,能精准定位到吃满磁盘的大文件/目录。内核驱动开发中,不管是根文件系统满导致驱动加载失败,还是/tmp分区满导致设备树解析出错,这对搭档都是必用工具。


先搞懂:df——查看文件系统整体空间(看全局)

df的核心作用是查看各个文件系统(分区)的整体空间使用情况,嵌入式开发中重点关注根分区(/)、/tmp(临时文件)、/usr(驱动库/编译产物)、/var(日志)这些分区。

1. 核心用法(嵌入式开发必备)

# 最常用:人类可读格式显示所有分区的空间(-h),并显示文件系统类型(-T)
df -hT

在RV1126b开发板上执行,输出大概是这样:

Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/root      ext4       1.8G  1.7G   50M  98% /          # 根分区快满了(98%),问题根源!
tmpfs          tmpfs     496M     0  496M   0% /dev/shm
/dev/mmcblk0p6 vfat       64M   12M   52M  19% /boot
tmpfs          tmpfs     496M   20K  496M   1% /tmp

从输出能立刻看出:根分区(/)使用率98%,这就是驱动加载失败的原因——没有空间写入驱动模块或日志了。

2. 嵌入式开发常用参数

参数
作用
驱动开发场景
-h
人类可读格式(K/M/G)
嵌入式分区大小通常以M/G为单位,避免看字节数数晕
-T
显示文件系统类型(ext4/vfat/tmpfs等)
区分根分区(ext4)、boot分区(vfat)、临时分区(tmpfs)
-i
显示inode使用情况
嵌入式常见坑:文件小但数量多(比如大量小日志),inode占满也会提示空间不足
-P
固定列宽输出
脚本解析df结果时用,避免格式错乱

📌重要

关键提醒:嵌入式里的“特殊分区”

  • /dev/root:根文件系统,嵌入式开发板最容易满的分区,驱动模块、配置文件、日志都存在这里;
  • tmpfs:内存文件系统,重启后清空,适合存临时文件,但容量有限(通常是内存的一半);
  • /boot:存放内核镜像和设备树,空间小(几十M),驱动开发中很少动,但误放文件也会满。

再搞懂:du——查看文件/目录的具体大小(找细节)

df告诉你“哪个分区满了”,但不会告诉你“谁占了空间”;这时候需要du,它能递归统计文件/目录的大小,精准找到吃满磁盘的“元凶”(比如大日志、编译残留的.ko文件、core dump文件)。

1. 核心用法(嵌入式开发必备)

# 场景:根分区满了,先看根目录下各一级目录的大小(--max-depth=1),人类可读(-h)
du -h --max-depth=1 /

在RV1126b开发板上执行,输出大概是这样:

1.2G    /usr
400M    /var
50M     /root
10M     /etc
8M      /tmp

立刻看出:/usr(1.2G)和/var(400M)是占空间的大头,接下来逐层排查:

# 排查/var目录:看里面的子目录大小
du -h --max-depth=1 /var

# 发现/var/log占了350M,继续排查
du -h --max-depth=1 /var/log

# 最终找到:/var/log/kern.log(内核日志)占了300M——就是它吃满了根分区!

2. 嵌入式开发常用参数

参数
作用
驱动开发场景
-h
人类可读格式
和df保持一致,方便对比
-s
只显示汇总大小(不递归)
快速看单个目录的总大小,比如du -sh /usr
--max-depth=n
限制递归深度
嵌入式目录嵌套深,避免输出刷屏
-c
显示所有文件大小之和
统计多个目录的总大小,比如du -ch /usr /var
--exclude=模式
排除指定文件/目录
排除编译生成的.o/.ko文件,只看日志文件

💡提示

驱动开发中常见的“空间元凶”

  • /var/log/kern.log:内核日志,驱动调试时开启printk会疯狂写日志,很快占满;
  • /tmp/core:驱动崩溃产生的core dump文件,单个文件可能几百M;
  • /usr/lib/modules:编译残留的旧驱动.ko文件,多个版本叠加会占大量空间;
  • /root:调试时下载的内核源码、编译产物,误存根目录会快速占满。

核心场景:df+du配合排查嵌入式磁盘空间问题

以RV1126b驱动开发中“根分区满导致驱动加载失败”为例,完整排查流程:

步骤1:用df定位满的分区

df -hT /  # 只看根分区

输出:/dev/root ext4 1.8G 1.7G 50M 98% / 确认:根分区使用率98%,空间不足。

步骤2:用du找大目录(从根目录开始逐层排查)

# 一级目录汇总
du -h --max-depth=1 /

# 定位到/var/log大,继续排查
du -h --max-depth=1 /var/log

# 找到大日志文件kern.log
ls -lh /var/log/kern.log

步骤3:清理空间(驱动开发常用操作)

# 清空内核日志(保留文件,避免进程报错)
echo "" > /var/log/kern.log

# 删除旧的驱动模块
rm -rf /usr/lib/modules/6.1.0-rv1126b-old/*

# 删除core dump文件
rm -f /tmp/core.*

步骤4:验证(df确认空间释放)

df -h /

输出:/dev/root ext4 1.8G 1.4G 400M 78% / 空间恢复,驱动能正常加载了!


嵌入式开发中的“坑”:df和du结果不一致

有时候df显示分区满,但du统计的总大小远小于已用空间——这是因为文件被删除但进程还在占用(比如日志进程还在写已删除的kern.log),文件句柄没释放,空间没回收。

⚠️警告

解决方法(驱动开发必备):

# 找占用已删除文件的进程
lsof | grep deleted

# 重启进程释放文件句柄
systemctl restart rsyslog

重启后再用df看,空间就会恢复。


总结

df和du是嵌入式驱动开发中排查磁盘空间的黄金搭档:

  1. df看全局:用df -hT快速定位哪个分区(比如根分区)空间不足,用df -i排查inode满的问题;
  2. du找细节:用du -h --max-depth=1逐层排查大目录,精准找到占空间的文件(日志、core dump、旧驱动);
  3. 避坑点:df和du结果不一致时,用lsof找占用已删除文件的进程,重启释放空间。

记住这对搭档的配合逻辑,再也不用为“开发板空间满了”而焦头烂额,能把更多时间花在驱动逻辑调试上~

df+du的大致用法就讲到这里,大家有什么在嵌入式开发中排查磁盘空间的经典坑或小技巧,欢迎在评论区交流~

最新文章

随机文章