目录
一、引言:“磁盘满了”是运维的第一声警钟
二、df与du:磁盘排查的黄金搭档
2.1 df -h:看整体,哪个分区快满了?
2.2 du -sh:看细节,哪些目录在占空间?
2.3 df与du的配合策略
2.4 一个常被忽略的问题:inode耗尽
三、lsblk:看清你的磁盘和分区
四、mount与umount:挂载的艺术
4.1 挂载的概念
4.2 挂载U盘
4.3 挂载ISO镜像
4.4 卸载失败时的排查
五、/etc/fstab:开机自动挂载
5.1 fstab文件格式
5.2 实战:添加一个开机自动挂载的数据盘
5.3 fstab常见挂载选项
六、综合实战:磁盘空间告急的完整处理流程
七、本篇小结
动手练习
八、下篇预告
一、引言:“磁盘满了”是运维的第一声警钟
“服务器报500错误了!”
“网站怎么打不开了?”
“数据库连接失败了!”
这些问题背后的罪魁祸首,十有八九是同一件事:磁盘满了。
一个古老但真实的笑话:某公司网站宕机半天,运维排查了网络、内存、CPU、应用日志,最后发现是日志文件把磁盘占满了——而这个排查过程花了三个小时,因为没人第一时间想到用df -h。
今天我们就来掌握Linux的磁盘管理,让你在“磁盘告急”时能快速定位问题、解决问题,成为那个三分钟找出根因的人。
二、df与du:磁盘排查的黄金搭档
2.1 df -h:看整体,哪个分区快满了?
df(disk free)用于查看文件系统级别的磁盘使用情况——整个分区用了多少、还剩多少。
bash
df -h
-h参数表示“human-readable”,以K、M、G等人类可读的单位显示,而不是默认的1K块数。
输出示例:
text
Filesystem Size Used Avail Use% Mounted on /dev/sda1 50G 42G 5.2G 90% / /dev/sdb1 100G 60G 40G 60% /data tmpfs 3.9G 1.2M 3.9G 1% /dev/shm
关键字段解读:
| 字段 | 含义 | 关注点 |
|---|---|---|
| Filesystem | 文件系统/分区名 | 忽略tmpfs等虚拟文件系统,关注/dev开头的真实磁盘 |
| Size | 分区总大小 | — |
| Used | 已使用空间 | — |
| Avail | 可用空间 | 这个值快没了就是告急信号 |
| Use% | 使用百分比 | 超过80%就该关注,超过90%需要立即处理 |
| Mounted on | 挂载点 | 这个分区对应哪个目录 |
常用变体:
bash
# 只查看真实磁盘(排除tmpfs等虚拟文件系统) df -h -t ext4 -t xfs # 查看inode使用情况(小文件过多导致的“伪满”) df -ih
2.2 du -sh:看细节,哪些目录在占空间?
df告诉你“哪个分区快满了”,du(disk usage)则进一步告诉你“哪些目录在占地盘”。
bash
du -sh /var/*
参数说明:
-s:summary,只显示总计(不加-s会列出每个子目录)-h:human-readable,人类可读格式*:统计该目录下每个子项的大小
输出示例:
text
12M /var/backups 4.0K /var/cache 2.3G /var/log 4.0K /var/mail
一目了然——/var/log占了2.3G,是清理的重点对象。
常用组合技:
bash
# 查看当前目录下各子目录的大小,按大小排序 du -sh * | sort -hr # 查看当前目录的总大小 du -sh . # 找出当前目录下最大的5个文件或目录 du -sh * | sort -hr | head -5 # 查看指定深度(--max-depth) du -h --max-depth=1 /var
2.3 df与du的配合策略
排查“磁盘满了”的标准流程:
bash
# 第一步:看整体,哪个分区满了? df -h # 假设发现 / 分区使用率90% # 第二步:从根目录开始,逐层深入 du -sh /* 2>/dev/null | sort -hr | head -10 # 找出根下最大的目录,假设是 /var # 第三步:继续深入 du -sh /var/* 2>/dev/null | sort -hr | head -10 # 找出/var下最大的子目录,假设是 /var/log # 第四步:找到具体的大文件 ls -lhS /var/log | head -10 # -S 参数按文件大小排序 # 第五步:确认文件可以清理后,动手 > /var/log/huge_app.log # 清空文件内容(比rm更安全) # 或者 rm /var/log/old_log_*.log
2.4 一个常被忽略的问题:inode耗尽
有时候df -h显示磁盘还有空间,但系统却报“No space left on device”。这可能是inode被小文件耗尽了。
bash
df -ih # 查看inode使用情况
如果IUse%接近100%,说明你创建了海量小文件(常见于邮件队列、缓存目录)。解决方法是清理这些文件,而不是尝试“腾出更多空间”。
三、lsblk:看清你的磁盘和分区
lsblk(list block devices)用树形结构直观展示系统中的磁盘、分区和挂载关系。
bash
lsblk
输出示例:
text
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 50G 0 part / sdb 8:16 0 100G 0 disk └─sdb1 8:17 0 100G 0 part /data sr0 11:0 1 1024M 0 rom
如何解读:
sda、sdb:物理磁盘(或虚拟机磁盘)sda1、sdb1:磁盘上的分区sr0:光驱(现在的服务器上基本见不到了)MOUNTPOINT为空说明该分区没有被使用(可能是新加的磁盘还没挂载)
查看更详细的信息:
bash
lsblk -f # 显示文件系统类型和UUID lsblk -m # 显示权限信息
输出示例(带文件系统类型):
text
NAME FSTYPE FSVER LABEL UUID MOUNTPOINT sda ├─sda1 ext4 1.0 abc123-def456-789 / sdb └─sdb1 xfs 123abc-456def-890 /data
UUID是分区的唯一标识符,在配置/etc/fstab时会用到。
四、mount与umount:挂载的艺术
4.1 挂载的概念
还记得第3篇讲的“一切皆文件”吗?在Linux中,所有存储设备都要挂载(mount)到目录树上的某个节点才能访问。插入U盘不会像Windows那样弹出“F盘”——它需要被挂载到某个目录。
mount命令本身可以查看当前所有挂载:
bash
mount | grep "^/dev"
输出示例:
text
/dev/sda1 on / type ext4 (rw,relatime) /dev/sdb1 on /data type xfs (rw,relatime)
4.2 挂载U盘
第一步:插入U盘后,用lsblk找到它
bash
lsblk # 会多出一个设备,比如sdc,容量和你U盘吻合
第二步:创建挂载点并挂载
bash
sudo mkdir -p /mnt/usb sudo mount /dev/sdc1 /mnt/usb
第三步:访问U盘内容
bash
ls /mnt/usb
第四步:用完卸载
bash
sudo umount /mnt/usb
⚠️重要:卸载前确保没有程序正在使用该目录(比如你的终端当前不在/mnt/usb下),否则会报
target is busy错误。
4.3 挂载ISO镜像
不需要刻录光盘,你可以直接把ISO文件挂载为一个目录来读取内容:
bash
# 创建挂载点 sudo mkdir -p /mnt/iso # 挂载ISO文件(注意是-o loop) sudo mount -o loop ubuntu-22.04.iso /mnt/iso # 现在可以像浏览普通目录一样查看ISO内容 ls /mnt/iso # 用完后卸载 sudo umount /mnt/iso
-o loop告诉系统把这个普通文件当成一个块设备来处理——这是“一切皆文件”哲学的又一个生动例子。
4.4 卸载失败时的排查
bash
# 错误:target is busy # 原因:有程序正在使用该目录 # 查看是谁占用了目录 sudo lsof /mnt/usb # 或者 sudo fuser -v /mnt/usb # 强制结束占用进程后卸载 sudo fuser -km /mnt/usb sudo umount /mnt/usb
五、/etc/fstab:开机自动挂载
手动挂载的目录在重启后会消失。要让挂载在开机时自动生效,需要配置/etc/fstab文件。
5.1 fstab文件格式
text
# <file system> <mount point> <type> <options> <dump> <pass> UUID=abc-123 /data ext4 defaults 0 2
字段逐一解释:
| 字段 | 含义 | 说明 |
|---|---|---|
| file system | 设备标识 | 可以用UUID、设备路径(/dev/sdb1)、或标签 |
| mount point | 挂载点 | 设备挂载到哪个目录 |
| type | 文件系统类型 | ext4、xfs、ntfs等 |
| options | 挂载选项 | defaults是常用默认选项 |
| dump | 备份标记 | 0=不备份,1=备份(几乎没人用了) |
| pass | 启动检查顺序 | 0=不检查,1=根分区先检查,2=其他分区 |
5.2 实战:添加一个开机自动挂载的数据盘
第一步:查看分区的UUID
bash
lsblk -f
找到目标分区的UUID,比如abc123-def456-789。
第二步:创建挂载点
bash
sudo mkdir -p /data
第三步:编辑fstab
bash
sudo vim /etc/fstab
添加一行:
text
UUID=abc123-def456-789 /data ext4 defaults 0 2
第四步:测试配置(非常重要!)
在重启之前,先用以下命令测试fstab是否有语法错误:
bash
sudo mount -a
如果没有任何输出,说明配置正确。如果有报错,说明fstab有问题,立即修正,否则系统可能无法正常启动。
5.3 fstab常见挂载选项
| 选项 | 含义 |
|---|---|
| defaults | 默认选项(rw, suid, dev, exec, auto, nouser, async) |
| noauto | 不自动挂载(需要手动mount) |
| ro | 只读挂载 |
| rw | 读写挂载 |
| noexec | 禁止在该分区执行程序 |
| user | 允许普通用户挂载 |
六、综合实战:磁盘空间告急的完整处理流程
假设你收到监控告警:服务器/分区使用率超过90%。
bash
# 第一步:确认告警 df -h / # 输出确认 Use% 超过90% # 第二步:找出根目录下占用最大的目录(排除虚拟文件系统) sudo du -sh /* 2>/dev/null | sort -hr | head -5 # 输出示例: # 12G /var # 8.5G /usr # 3.2G /home # 1.1G /opt # 可以立即确认/var是元凶 # 第三步:深入/var sudo du -sh /var/* 2>/dev/null | sort -hr | head -5 # 输出示例: # 8.9G /var/log # 1.5G /var/cache # 可以发现/var/log是主要占用者 # 第四步:找出/var/log中的大文件 ls -lhS /var/log | head -10 # 找到一个8.5G的syslog日志文件 # 第五步:安全清空大日志(不要直接rm,可能影响rsyslog服务) sudo truncate -s 0 /var/log/syslog # 或者 sudo cat /dev/null > /var/log/syslog # 第六步:清理旧压缩日志 sudo find /var/log -name "*.gz" -mtime +30 -delete # 第七步:验证 df -h / # Use%应该已经下降
七、本篇小结
今天掌握了Linux磁盘管理的完整工具链:
排查工具:
df -h:看分区整体空间使用情况du -sh * | sort -hr:逐层深入,找到占用空间的目录df -ih:检查inode是否耗尽
设备管理:
lsblk:树形查看磁盘、分区、挂载关系lsblk -f:查看文件系统类型和UUID
挂载操作:
mount /dev/设备 /挂载点:挂载设备umount /挂载点:卸载设备mount -o loop ISO文件 /挂载点:挂载ISO镜像
自动挂载:
编辑
/etc/fstab,使用UUID指定设备修改后务必先执行
mount -a测试,防止无法启动
动手练习
bash
# 1. 检查当前系统的磁盘使用情况 df -h # 2. 找出当前目录下最大的3个文件或子目录 du -sh * | sort -hr | head -3 # 3. 查看磁盘和分区结构 lsblk lsblk -f # 查看UUID # 4. 创建一个测试用的临时文件镜像(模拟ISO挂载) dd if=/dev/zero of=/tmp/test.img bs=1M count=10 sudo mkdir -p /mnt/testimg sudo mount -o loop /tmp/test.img /mnt/testimg ls /mnt/testimg sudo umount /mnt/testimg rm /tmp/test.img # 5. 查看当前的fstab配置 cat /etc/fstab
八、下篇预告
今天学习了磁盘的日常管理,但你知道系统是怎么启动起来的吗?从你按下电源键到出现登录界面,中间经历了哪些步骤?
下一篇我们将进入Linux引导流程,了解BIOS/UEFI、GRUB2引导加载程序、内核加载、systemd/init的整个启动链条。你还会学到“单用户模式修改root密码”这个应急技能——当忘记root密码时,不需要重装系统。
延伸思考:在生产环境中,/var/log经常是磁盘占满的头号嫌疑犯。为什么日志会无限增长?下一篇我们会提到logrotate日志轮转机制,在第16篇计划任务中会深入讲解如何自动化管理日志。