Linux磁盘空间管理:df与du命令实战指南 1. Linux磁盘空间管理基础概念在Linux系统中磁盘空间管理是系统管理员和开发者的日常必备技能。与Windows系统不同Linux采用树状目录结构所有存储设备都挂载在根目录(/)下的特定位置。这种设计理念带来灵活性的同时也增加了空间管理的复杂度。我刚接触Linux时经常遇到磁盘空间不足的报错却不知从何查起。后来发现理解Linux存储设备的表示方式是解决问题的第一步。在/dev目录下存储设备通常以以下形式命名/dev/sd* (SCSI/SATA设备如sda、sdb)/dev/nvme* (NVMe固态硬盘)/dev/hd* (旧式IDE设备)每个物理设备可以划分为多个分区(如sda1、sda2)这些分区经过格式化后挂载到目录树的不同位置。通过lsblk命令可以直观看到这种关系$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 465.8G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi ├─sda2 8:2 0 732M 0 part /boot └─sda3 8:3 0 464.6G 0 part /2. 使用df命令查看磁盘使用情况df(disk filesystem)是最常用的磁盘空间检查工具。不加任何参数时它会显示所有已挂载文件系统的使用情况$ df Filesystem 1K-blocks Used Available Use% Mounted on udev 8104604 0 8104604 0% /dev tmpfs 1625604 2244 1623360 1% /run /dev/sda3 487050240 36864108 425480932 8% / tmpfs 8128000 98320 8029680 2% /dev/shm关键列说明Filesystem设备或分区名称1K-blocks总容量(以1KB为单位)Used已用空间Available可用空间Use%使用百分比Mounted on挂载点实用技巧添加-h参数转为人类可读格式(自动选择KB/MB/GB单位)$ df -h Filesystem Size Used Avail Use% Mounted on udev 7.8G 0 7.8G 0% /dev tmpfs 1.6G 2.2M 1.6G 1% /run /dev/sda3 465G 36G 406G 8% /查看特定目录所在分区的空间$ df -h /var/log Filesystem Size Used Avail Use% Mounted on /dev/sda3 465G 36G 406G 8% /排除tmpfs等虚拟文件系统$ df -h -x tmpfs -x devtmpfs注意NFS等网络文件系统可能因为连接问题导致df命令卡住此时可以使用df -l只查看本地文件系统。3. 使用du命令分析目录占用当发现磁盘空间不足时du(disk usage)命令能帮助我们定位大文件目录。基本用法$ du -sh /home/* 4.0K /home/lostfound 1.2G /home/user1 356M /home/user2常用参数组合-s只显示总大小-h人类可读格式--max-depthN限制目录深度实际案例发现/var目录异常增长时可以逐级深入$ du -sh /var 8.6G /var $ du -sh /var/* 172M /var/cache 56K /var/games 4.0K /var/local 7.8G /var/log # 发现日志目录异常 $ du -ah /var/log | sort -rh | head -10 4.2G /var/log/journal/a1b2c3d4e5f6 2.1G /var/log/syslog.1 1.2G /var/log/kern.log.2.gz进阶技巧排除特定目录$ du -sh --exclude*.log /var配合find命令查找大文件$ find /var -type f -size 100M -exec ls -lh {} \;可视化工具ncdu$ sudo apt install ncdu $ ncdu /var4. 特殊场景处理技巧4.1 处理已删除文件仍占用空间的问题当进程打开文件后即使文件被删除磁盘空间也不会立即释放直到进程关闭文件句柄。这种情况常见于日志文件$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 465G 450G 15G 97% / $ sudo lsof | grep deleted apache2 1234 www-data 4w REG 8,3 1073741824 123456 /var/log/apache2/access.log (deleted) # 解决方案 $ sudo systemctl restart apache2 # 重启持有文件句柄的服务4.2 LVM逻辑卷管理对于使用LVM的情况需要额外命令查看物理卷(PV)、卷组(VG)和逻辑卷(LV)$ pvdisplay $ vgdisplay $ lvdisplay # 扩展逻辑卷示例 $ lvextend -L 10G /dev/vg01/lv_root $ resize2fs /dev/vg01/lv_root4.3 处理磁盘空间被幽灵占用有时df和du统计结果不一致可能是由于小文件过多导致inode耗尽df -i文件系统损坏fsck检查挂载点被覆盖mount | grep -i overlay5. 自动化监控方案对于生产环境建议设置自动化监控使用cron定时任务# 每天检查根分区使用率 $ crontab -e 0 9 * * * [ $(df / --outputpcent | tail -1 | tr -d %) -gt 90 ] echo Disk space warning | mail -s Disk Alert adminexample.com使用Prometheus Grafana搭建监控系统采集node_exporter的磁盘指标日志轮转配置示例(/etc/logrotate.d/nginx)/var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate /usr/lib/nginx/modules/ngx_http_log_module.so endscript }6. 性能优化建议对于频繁写入的目录(如/var/log)建议单独挂载高性能磁盘或SSD使用noatime挂载选项减少metadata写入# /etc/fstab示例 UUID123456 / ext4 defaults,noatime 0 1定期清理缓存$ sudo apt-get clean # 清理apt缓存 $ sudo journalctl --vacuum-size100M # 限制systemd日志大小使用tmpfs加速临时文件# /etc/fstab tmpfs /tmp tmpfs defaults,noatime,nosuid,nodev,size2G 0 0掌握这些磁盘空间管理技巧后我在实际工作中处理过多次磁盘爆满的紧急情况。最深刻的一次教训是某生产服务器因为未配置日志轮转导致/var分区被日志塞满最终引发系统崩溃。从此之后我都会在新系统部署时第一时间设置日志管理策略。