13 10 月 2026

磁盘满了是最常见也最紧急的故障:网站写不进数据、数据库崩、连 SSH 都可能异常。

这篇讲三件事:新硬盘怎么挂载、已有分区怎么扩容、满了怎么救急。

磁盘不够用可以加数据盘或扩容系统盘。财富云计算 的云服务器支持灵活扩容;内网服务、游戏服务端可选 NAT 型(无独立公网 IP,价格比带独立 IP 机型省一半以上)。

一、先看懂当前磁盘状况

lsblk                    # 看磁盘和分区树状关系
fdisk -l                 # 查看所有磁盘
df -h                    # 查看已挂载分区的使用率
df -i                    # 查看 inode 使用率
blkid                    # 查看分区 UUID 和文件系统
mount | grep -E "^/dev"  # 查看挂载情况
cat /etc/fstab           # 开机自动挂载配置

典型输出:

$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0   50G  0 disk
└─vda1 253:1    0   50G  0 part /
vdb    253:16   0  200G  0 disk        ← 这块没分区没挂载

vdb 有 200G 但没用上,这就是要挂载的新盘。

云服务器的系统盘通常是 /dev/vda 或 /dev/sda,第二块盘是 vdb/sdb。

二、挂载新数据盘(完整流程)

1)确认磁盘

lsblk
fdisk -l /dev/vdb

务必确认磁盘是空的(没有重要数据),下面的操作会清空它。

2)分区(可选)

小于 2TB 的盘可以用 fdisk:

fdisk /dev/vdb
# 交互命令:
# n  新建分区
# p  主分区
# 1  分区号
# 回车(起始扇区默认)
# 回车(结束扇区默认,用满整盘)
# w  保存并退出

大于 2TB 必须用 parted + GPT:

parted /dev/vdb
(parted) mklabel gpt
(parted) mkpart primary ext4 0% 100%
(parted) print
(parted) quit

也可以不分区,直接格式化整块盘(很多云环境推荐这样,后续扩容更简单):

mkfs.ext4 /dev/vdb

3)格式化

# ext4(最通用)
mkfs.ext4 /dev/vdb1        # 分区了的话
mkfs.ext4 /dev/vdb         # 没分区的话

# xfs(CentOS 默认,大文件性能好)
mkfs.xfs /dev/vdb1
blkid /dev/vdb1            # 记下 UUID,后面写 fstab 要用

4)创建挂载点并挂载

mkdir -p /data
mount /dev/vdb1 /data
df -h | grep /data

5)设置开机自动挂载(关键!)

一定要用 UUID,不要写 /dev/vdb1(设备名可能在重启后变化):

blkid /dev/vdb1
# /dev/vdb1: UUID="a1b2c3d4-..." TYPE="ext4"
cp /etc/fstab /etc/fstab.bak       # 先备份!写错会导致开不了机
nano /etc/fstab

追加一行:

UUID=a1b2c3d4-xxxx-xxxx-xxxx-xxxxxxxxxxxx  /data  ext4  defaults,nofail  0  2

字段含义:

<设备>  <挂载点>  <文件系统>  <挂载选项>  <dump>  <fsck顺序>
  • 挂载选项推荐 defaults,nofail(nofail 让磁盘不存在时也能正常开机)
  • 第 5 位 0:不用 dump 备份
  • 第 6 位:根目录是 1,其他数据盘是 2,不检查写 0

验证 fstab 写得对不对(这一步必做):

mount -a        # 按 fstab 重新挂载,没报错就是对的
df -h

如果 mount -a 报错,立刻改,别重启。

6)权限设置

chown -R www-data:www-data /data      # 按实际用户改
chmod 755 /data

三、扩容已有分区

情况一:云平台扩容了磁盘容量(最常见)

在控制台把 50G 扩到 100G 后,系统里要执行两步:扩分区 → 扩文件系统。

步骤 1:确认容量已变

lsblk
# vda 显示 100G,但 vda1 还是 50G

步骤 2:扩分区

# 安装工具
apt install cloud-guest-utils -y      # Ubuntu
yum install cloud-utils-growpart -y   # CentOS

# 扩展分区 1
growpart /dev/vda 1

或用 parted:

parted /dev/vda
(parted) resizepart 1 100%
(parted) quit

步骤 3:扩文件系统

# ext2/3/4
resize2fs /dev/vda1

# xfs(注意参数是挂载点,不是设备)
xfs_growfs /

步骤 4:验证

df -h

情况二:LVM 扩容

如果用的是 LVM(很多云镜像默认):

# 1. 查看
pvdisplay
vgdisplay
lvdisplay

# 2. 新磁盘加入物理卷
pvcreate /dev/vdb
vgextend vg0 /dev/vdb          # vg0 换成你的卷组名

# 3. 扩展逻辑卷(用全部剩余空间)
lvextend -l +100%FREE /dev/vg0/lv0

# 4. 扩文件系统
resize2fs /dev/vg0/lv0         # ext4
xfs_growfs /                   # xfs

df -h

LVM 的好处是可以随时加盘扩展,不用关心分区边界,生产环境推荐。

情况三:把目录迁移到新盘(不能扩分区时)

比如 /var 满了,加一块盘专门放 /var:

# 1. 挂载新盘到临时目录
mount /dev/vdb1 /mnt/new

# 2. 同步数据(保留权限)
rsync -avzP /var/ /mnt/new/

# 3. 改名备份
mv /var /var.old
mkdir /var

# 4. 挂载新盘到 /var
mount /dev/vdb1 /var

# 5. 写 fstab
echo "UUID=xxx  /var  ext4  defaults,nofail  0  2" >> /etc/fstab

# 6. 验证无误后删除旧目录
rm -rf /var.old
⚠️ 操作 /var 这类系统目录建议先进救援模式或确保服务已停,避免文件被占用导致同步不全。

四、磁盘满了的救急处理

先看是不是真满:

df -h
df -i              # inode 也可能满

快速找大文件

# 装 ncdu(交互式,最直观)
apt install ncdu -y
ncdu /

# 或者逐层看
du -sh /* 2>/dev/null | sort -h
du -sh /var/* 2>/dev/null | sort -h
du -sh /var/log/* 2>/dev/null | sort -h

# 找大于 500M 的文件
find / -type f -size +500M -exec ls -lh {} \; 2>/dev/null | sort -k5 -h

常见可清理项

# 1. systemd 日志
journalctl --vacuum-size=200M
journalctl --vacuum-time=7d

# 2. 旧日志文件
find /var/log -name "*.gz" -delete
find /var/log -name "*.1" -delete

# 3. apt 缓存
apt clean
apt autoremove -y

# 4. yum 缓存
yum clean all

# 5. Docker
docker system prune -a --volumes

# 6. core dump
rm -f /var/lib/systemd/coredump/*

# 7. 临时文件
rm -rf /tmp/*

# 8. MySQL binlog(先在 MySQL 里清理)
mysql -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);"

特殊坑:文件删了空间没释放

lsof | grep deleted
# 或
lsof +L1

某个进程还持有已删除文件的句柄,空间不会释放。重启该进程,或在线截断:

: > /var/log/huge.log
truncate -s 0 /var/log/huge.log

inode 满了

表现:df -h 显示还有空间,但创建文件报 No space left on device。

df -i
# 找文件数最多的目录
for d in /*; do echo -n "$d: "; find $d -type f 2>/dev/null | wc -l; done

常见原因:session 文件、缓存碎片、邮件队列。清理后即可(inode 数无法在线增加,只能重装并指定)。


五、磁盘健康检查

看 SMART 信息(物理机/部分云盘支持)

smartctl -a /dev/vda
smartctl -H /dev/vda       # 只看健康状态

文件系统检查

# 需要卸载后检查(根分区要进救援模式)
umount /dev/vdb1
fsck -y /dev/vdb1

# 强制下次开机检查根分区
touch /forcefsck
reboot

IO 性能测试

# 顺序写
dd if=/dev/zero of=/data/test bs=1M count=1024 oflag=direct

# 顺序读
dd if=/data/test of=/dev/null bs=1M iflag=direct

# 更专业的随机 IO 测试
fio -filename=/data/test -direct=1 -rw=randrw -bs=4k -size=1G \
    -numjobs=1 -runtime=60 -group_reporting -name=test

参考值:SSD 随机 IO 应该达到几千 IOPS,HDD 只有一两百。


六、实用建议

1)分区规划

目录建议
/40~60G,装系统和程序
/data数据盘,放网站和游戏服务端
/var/log日志量大可单独分区,避免日志撑爆系统盘
/backup备份最好独立盘或异地

2)文件系统选择

类型适用
ext4默认推荐,稳定通用,支持在线扩容
xfs大文件、大分区性能好,CentOS 默认,只能扩不能缩
btrfs有快照功能,但生产环境慎用

3)一定要配监控

# 磁盘超过 85% 就告警
*/10 * * * * df -h | awk '$5+0 > 85 {print $0}' | mail -s "磁盘告警" you@example.com

4)扩容前先做快照

任何分区操作都有风险,先打快照再动手。详见《服务器备份与快照策略》。


七、故障排查表

现象原因处理
No space left on device磁盘满或 inode 满df -h + df -i
Read-only file system文件系统错误触发只读保护备份数据 → fsck → 重启
mount: unknown filesystem type没格式化或文件系统损坏重新 mkfs(会丢数据)
开机卡住进不了系统fstab 写错进救援模式改回 /etc/fstab.bak
growpart 报 "NOCHANGE"分区已是最大,只需扩文件系统直接 resize2fs
resize2fs: Bad magic number文件系统类型判断错确认是 xfs 就改用 xfs_growfs
扩容后 df 没变化少做了扩文件系统那一步补 resize2fs 或 xfs_growfs

八、操作清单(照着做不会错)

新盘挂载:

lsblk                                  # 确认盘符
fdisk /dev/vdb                         # 分区(或跳过)
mkfs.ext4 /dev/vdb1                    # 格式化
blkid /dev/vdb1                        # 拿 UUID
mkdir -p /data && mount /dev/vdb1 /data
cp /etc/fstab /etc/fstab.bak
echo "UUID=xxx /data ext4 defaults,nofail 0 2" >> /etc/fstab
mount -a                               # 验证
df -h                                  # 确认

在线扩容:

lsblk                                  # 确认容量已变大
growpart /dev/vda 1                    # 扩分区
resize2fs /dev/vda1                    # 扩文件系统(ext4)
# 或 xfs_growfs /                      # (xfs)
df -h                                  # 验证

磁盘操作有风险,务必先做快照。财富云计算 的云服务器支持快照与磁盘扩容,扩容前打一个快照,出问题能立刻回滚。内网服务、开发测试、游戏服务端可选 NAT 型(无独立公网 IP,价格比带独立 IP 机型省一半以上),大容量数据盘方案同样适用。

相关阅读:

  • 《服务器资源排查:CPU / 内存 / 磁盘 / 带宽》
  • 《服务器备份与快照策略》
  • 《Linux 常用命令速查表》
延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:云服务器配置怎么选:CPU、内存、带宽、硬盘一次讲明白
  2. 下一篇:Linux 网络排查工具大全:ping、mtr、tcpdump、ss 怎么用
发表评论 3

取消回复