这一节要解决什么
"磁盘满了""挂载丢了""重启后盘没挂上"——这些问题要先在脑子里建好四层结构:块设备 → 分区 → 文件系统 → 挂载点。看清每一层用什么命令观察,剩下的就是操作纪律:动手前先认设备名。
一、四层结构,四个观察命令
/dev/sda (块设备)
└── /dev/sda1, /dev/sda2 (分区表:MBR 或 GPT)
└── ext4 / xfs (文件系统:mkfs 创建,带 UUID)
└── 挂载到 / 或 /data (挂载点:mount 建立)lsblk -f # ⭐ 一张图看全:设备树 + FSTYPE + UUID + MOUNTPOINT
blkid # 只看文件系统的 UUID/LABEL/TYPE(写 fstab 时抄这里)
findmnt # 挂载关系(还有 findmnt /data 单查)
df -hT # 容量 + 文件系统类型(-T 才有类型列)
du -xsh /var/log # 目录体积(-x 不跨文件系统,避免统计到别的盘)批注:lsblk -f 是我排"挂载类"问题的第一命令——它一次就把"设备、类型、UUID、挂载点"四层摆平。lsblk 看到 MOUNTPOINT 为空,就说明这个分区没挂上。
二、分区:MBR 与 GPT 的取舍
| MBR | GPT | |
|---|---|---|
| 容量上限 | 2 TB | 很大(EB 级) |
| 主分区 | 最多 4 个 | 最多 128 个 |
| 引导 | 传统 BIOS | UEFI(配合 ESP 分区) |
sudo fdisk -l /dev/sdb # 看分区表(MBR/老式)
sudo parted /dev/sdb print # 看是否 GPT(parted 对 GPT 更友好)
sudo parted /dev/sdb mklabel gpt # ⚠️ 重建分区表 = 清空
sudo parted -a optimal /dev/sdb mkpart primary ext4 1MiB 100%
sudo partprobe /dev/sdb # 让内核重读分区表(否则看不到新分区)
lsblk -f # 复核mkfs 和 parted mklabel 都是不可逆操作,而设备名(/dev/sdb 还是 /dev/sdc)会因插拔顺序变化。我现在固定两步:① 用 lsblk -f 确认这个设备没有挂载、没有数据;② 把设备名复制粘贴,绝不手敲。
三、创建文件系统
sudo mkfs.ext4 -L data1 /dev/sdb1 # ext4,带标签
sudo mkfs.xfs -L data1 /dev/sdb1 # RHEL 系默认 XFS
sudo mke2fs -t ext4 -b 4096 /dev/sdb1 # 更底层的写法(调块大小、inode 比例)
sudo tune2fs -l /dev/sda1 | head # ext 系:看/调参数(如保留块比例 -m)批注:ext4 默认给 root 保留 5% 空间(Reserved block count),大容量数据盘上这 5% 很可观,纯数据盘可以降到 1%:tune2fs -m 1 /dev/sdX。这是我在 4 TB 数据盘上省出 160 GB 的一次经历。
四、挂载与 fstab:六字段,三个要点
sudo mount /dev/sdb1 /data # 临时挂
sudo mount -o remount,rw / # 已挂载的重新挂(改选项)
sudo mount --bind /srv/app /var/www/app # 目录镜像(同一个 inode 出现在两处)
sudo umount /data # 卸载(被占用会拒绝)
sudo fuser -vm /data ; sudo lsof +f -- /data # 谁在占用(umount 失败时看这个)UUID=3f1a...-9c /data ext4 defaults,noatime,nofail 0 2
# ↑设备 ↑挂载点 ↑类型 ↑选项 ↑dump ↑fsck顺序
/dev/sdb1 /data ext4 defaults 0 2 # ❌ 别写 /dev/sdX| 字段 | 说明 |
|---|---|
| ① 设备 | 必须写 UUID=:/dev/sdX 的顺序会变(插拔、换控制器都会变),UUID 不会 |
| ② 挂载点 | 目录要存在(mkdir 先建好) |
| ③ 类型 | ext4 / xfs / swap 等 |
| ④ 选项 | defaults、noatime(减少写)、nofail(设备缺失也不卡启动)、_netdev(网络存储)、ro |
| ⑤ dump | 一般 0 |
| ⑥ fsck 顺序 | 根分区 1,其他 2,不检查 0 |
三个要点:
- 改完 fstab 先
sudo mount -a——它按 fstab 重新挂一遍,有错当场报错;不要直接 reboot 赌运气(写错的 fstab 能让机器起不来)。 - 云服务器上一定加
nofail:云盘可能因为故障或未挂载而消失,没有nofail时 systemd 会等它而卡住启动。 - 用
UUID=之后,即使设备名从sdb变成sdc,挂载关系也不会错。
五、真实故障:删了文件,空间却没释放
df -h 显示没变,但 du 算出来小很多——八成是已删除但被进程持有的文件:
lsof +L1 # 列出 link count < 1 的文件(已 unlink 但仍被打开)
lsof +L1 | awk '{print $1,$2,$7,$9}' | head
# 处理:重启/重载持有它的进程(systemctl reload),或让它下次写新文件还有三种可能:挂载点被覆盖(原目录里还占着数据,mount 之后被挡住了)、日志/临时文件暴涨(du -xsh /var/* | sort -h | tail)、inode 用满(第 02 节讲过,df -i 看)。
df -hT | sort -k5 -h | tail -5 # 哪些文件系统快满
du -xsh /var/* 2>/dev/null | sort -h | tail -5
df -i / # inode 维度
lsof +L1 | head # 幽灵文件六、动手清单
lsblk -f; blkid; findmnt / | head # 1. 四层观察
sed -n '1,20p' /etc/fstab # 2. 读自己的 fstab,找 UUID
findmnt -no SOURCE,OPTIONS /data 2>/dev/null # 3. 某挂载点的来源与选项
sudo tune2fs -l /dev/sda1 | grep -Ei 'reserved|block count' # 4. 保留块比例
sudo mount -a && echo 'fstab 语法通过' # 5. 改 fstab 后的必做动作
lsof +L1 2>/dev/null | head # 6. 看看有没有幽灵文件小结
- 四层:块设备 → 分区 → 文件系统 → 挂载点;
lsblk -f一次看全。 fstab用 UUID,加nofail;改完必须mount -a验证,别用重启试错。df与du不一致时,先查lsof +L1(已删但被持有的文件),再查挂载覆盖与 inode。mkfs/parted是不可逆操作:动手前lsblk -f确认设备,复制粘贴设备名。
下一节预告
下一节:网络基础——ip/ss 取代 netstat 的用法、自下而上的排查顺序、ss 显示 LISTEN 却连不上的真实原因(绑了 127.0.0.1),以及 getent 与 dig 在 DNS 排障里的分工。
喜欢的话,留下你的评论吧~