Linux 磁盘空间管理的黄金搭档:df、du、fdisk、lsblk 实战解析

1. 磁盘空间管理的四大神器

刚接手一台Linux服务器时,最让人头疼的就是突然弹出的"no space left on device"警告。上周我就遇到个典型案例:某台生产环境的Nginx服务器突然无法写入日志,紧急排查时发现根分区被占满。这时候df、du、fdisk、lsblk这四个命令就像手术刀组合,能快速定位问题。

df命令 像是系统的体检报告,用 df -h 查看时,重点关注Use%列。有次我发现/var分区显示100%使用率,但实际文件加起来不到分区容量的一半——原来是某个进程删除文件后未释放句柄,用 lsof | grep deleted 找到了罪魁祸首。

du命令 则是精准的病灶探测器。当/home分区告急时,用 sudo du -sh /home/* | sort -rh 快速锁定占用50G空间的用户目录。更精细的排查可以用 --max-depth 控制扫描深度,比如 du -h --max-depth=2 /var/log

fdisk和lsblk 这对搭档负责理清磁盘的"解剖结构"。有次扩容磁盘后, lsblk 清晰显示出新增的/dev/sdb未分区,而 fdisk -l 则详细列出了每个分区的起止扇区。特别提醒:操作fdisk时千万注意设备名,误操作可能导致数据灾难。

经验之谈:生产环境操作前先用 lsblk -f 确认文件系统类型,EXT4/XFS/Btrfs等文件系统的管理命令各有不同

2. 从报警到解决的全流程实战

去年处理过一起典型故障:监控系统报警显示/data分区剩余不足10%。以下是完整的排查过程:

第一阶段:宏观诊断

$ df -hT /data
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/nvme0n1p1 ext4  100G   92G  3.2G  97% /data

发现是ext4文件系统,使用率已达97%。但 du -sh /data 统计只有60G,这30G的差值可能是隐藏文件或已删除未释放的空间。

第二阶段:定位大文件

$ sudo find /data -type f -size +1G -exec ls -lh {} +
-rw-r----- 1 mysql mysql 12G Jun 15 03:00 /data/mysql/slow.log
-rw-r--r-- 1 root  root   8G Jun 14 18:00 /data/backups/old.tar.gz

找到MySQL的慢查询日志和过期备份文件,用 truncate -s 0 清空日志文件(注意不要直接rm,避免影响正在写入的进程)。

第三阶段:分析分区结构

$ lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT
NAME        FSTYPE   SIZE MOUNTPOINT
nvme0n1            200G 
├─nvme0n1p1 ext4    100G /data
└─nvme0n1p2 xfs     100G /home

发现该NVMe硬盘还有100G未分配空间,于是用 fdisk /dev/nvme0n1 创建新分区,通过 resize2fs 在线扩展了/data分区。

3. 那些容易踩的坑

inode耗尽陷阱 :有次 df -h 显示磁盘还有空间,但系统报"no space"。执行 df -i 发现inode用尽,原因是/tmp下有数百万个小文件。解决方法:

$ find /tmp -type f -name "*.tmp" -delete
$ tune2fs -i 0 /dev/sda1  # 禁用inode时间检查提升性能

LVM的障眼法 :用 lsblk 看到的是物理视图,而LVM逻辑卷需要额外命令:

$ pvs; vgs; lvs  # 查看物理卷/卷组/逻辑卷
$ vgdisplay       # 查看剩余可分配空间

网络文件系统的特殊性 :NFS挂载点用 df 可能显示不准确,实际应该用 du -s 统计。曾遇到NAS存储配额满但本地 df 显示有空间的案例。

容器带来的复杂度 :Docker的overlay2存储驱动会占用大量空间,用 docker system df 查看专属统计:

$ docker system prune --volumes  # 清理无用容器数据

4. 高级技巧与自动化方案

实时监控方案

# 每5分钟记录磁盘使用情况
(crontab -l 2>/dev/null; echo "*/5 * * * * df -h >> /var/log/disk_usage.log") | crontab -

安全删除大文件

$ shred -n 3 -z -v sensitive_file  # 多次覆盖后删除
$ rm -f sensitive_file

自动化清理脚本

#!/bin/bash
THRESHOLD=90
CURRENT=$(df / | awk '{print $5}' | tail -1 | sed 's/%//')

if [ "$CURRENT" -gt "$THRESHOLD" ]; then
    find /var/log -name "*.log" -mtime +30 -exec rm {} \;
    journalctl --vacuum-size=200M
fi

Btrfs/ZFS特例 :这些现代文件系统需要专用命令:

$ btrfs filesystem show  # Btrfs空间统计
$ zpool list             # ZFS存储池状态

实际运维中,我习惯将这几个命令组合使用。比如 lsblk -f | grep -v snap 可以过滤掉快照设备, du --exclude="*.iso" 可以跳过特定文件类型。记住:任何删除操作前先用 ls 确认文件列表,避免误删关键数据。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值