一、为什么 2025 年还要手挂云盘
阿里云 ECS 默认只给系统盘(/dev/vda),数据盘(/dev/vdb、/dev/vdc…)是单独购买的。买完数据盘后必须:
- 给云盘分区
- 格式化文件系统
- 挂载到 ECS 的某个目录
- 写进
/etc/fstab 开机自动挂载
否则重启就丢挂载点,数据盘变成了"挂在那儿但没用的盘"。
本文写于 2025-09-15。覆盖 2T 以下(MBR)、2T+(GPT)、原盘扩容三种场景。CentOS 7+ / Ubuntu 18.04+ / Debian 10+ / Anolis OS 8 通用。
二、查云盘
典型输出(ECS 默认 1 块系统盘 + 2 块数据盘):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| Disk /dev/vda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xe4c1f796
Device Boot Start End Sectors Size Id Type
/dev/vda1 * 2048 41940991 41938944 20G 83 Linux
Disk /dev/vdb: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
Disk /dev/vdc: 500 GiB, 536870912000 bytes, 1048576000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
|
坑提醒:看到 Disk /dev/vdX doesn't contain a valid partition table 是正常的——新数据盘没分区。
三、场景一:全新数据盘挂载
3.1 一个目录只能挂一个盘
挂载前先想清楚目录——一个目录只能挂一个盘,挂第二个会覆盖第一个。常见目录:
/data:通用数据盘/var/lib/docker:Docker 专用/home:用户家目录/mnt/<业务名>:业务专用
3.2 2T 以下:MBR 分区(fdisk)
1
2
3
4
5
6
7
8
9
10
11
12
| fdisk -u /dev/vdc
# 输入:
# p 查看
# n 新建
# p 主分区
# 1 分区号
# 回车 默认起始扇区(2048)
# 回车 默认结束扇区(整盘)
# wq 写并退出
fdisk -lu /dev/vdc
# 确认新分区 /dev/vdc1
|
3.3 2T+ :GPT 分区(parted)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| yum install -y parted e2fsprogs
# Debian/Ubuntu
# apt install -y parted e2fsprogs
parted /dev/vdb
# 在 parted 交互里:
# mklabel gpt # 设置 GPT 分区表
# mkpart primary 1 100% # 划分一个主分区占满整盘
# align-check optimal 1 # 检查对齐(aligned 说明对齐)
# print # 看分区表
# quit # 退出
partprobe # 让内核重读分区表
fdisk -lu /dev/vdb
|
3.4 格式化文件系统
1
2
3
4
5
| # ext4(最常用,CentOS 7+ 默认)
mkfs -t ext4 /dev/vdc1
# xfs(CentOS 7+ 默认系统盘格式,大文件更优)
mkfs.xfs /dev/vdc1
|
3.5 挂载
1
2
3
4
5
| mkdir -p /data
mount /dev/vdc1 /data
df -h
# Filesystem Size Used Avail Use% Mounted on
# /dev/vdc1 500G 73M 500G 1% /data
|
3.6 写进 /etc/fstab(开机自动挂载)
关键:用 blkid 拿 UUID,而不是直接写 /dev/vdc1——云盘 ID 在重启时可能变化。
1
2
3
| # 查 UUID
blkid /dev/vdc1
# /dev/vdc1: UUID="a6ce082e-88cb-469f-8405-72192b89a439" TYPE="ext4"
|
手动写 /etc/fstab:
1
2
3
4
5
| # 备份
cp /etc/fstab /etc/fstab.bak
# 写入(用 echo 追加)
echo `blkid /dev/vdc1 | awk '{print $2}' | sed 's/\"//g'` /data ext4 defaults 0 0 >> /etc/fstab
|
或者用 UUID 字符串直接写:
1
| UUID=a6ce082e-88cb-469f-8405-72192b89a439 /data ext4 defaults 0 0
|
/etc/fstab 完整示例:
1
2
3
4
5
6
7
8
9
10
11
12
| # /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/vda1 during installation
UUID=f126eb90-41ef-4ccf-afa2-055203ed920e / ext4 errors=remount-ro 0 1
/dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0
/home ext4 defaults 0 0
UUID=a6ce082e-88cb-469f-8405-72192b89a439 /data ext4 defaults 0 0
|
字段含义:
| 字段 | 含义 |
|---|
<file system> | 设备 / UUID |
<mount point> | 挂载点 |
<type> | 文件系统(ext4 / xfs / swap) |
<options> | 挂载选项(defaults / noatime / nodev) |
<dump> | 是否被 dump 备份(0 = 不备份) |
<pass> | fsck 检查顺序(0 = 不检查,1 = 根,2 = 其他) |
3.7 验证
1
2
| mount -a # 模拟重启挂载(不重启)
df -h
|
坑提醒:/etc/fstab 写错会导致 ECS 启动失败。改完一定先 mount -a 验证,能正常挂再重启。
四、场景二:把根目录挂到数据盘(一般不要)
centos7.md 等老文档会演示"扩展 /",操作极其危险——需要动 LVM。本节给出标准流程,新机器不要这么干,直接买大系统盘。
4.1 终止占用 /home 进程
1
| fuser -m -v -i -k /home
|
4.2 备份 /home
4.3 卸载 /home + 删 lv
1
2
| umount /home
lvremove /dev/mapper/centos-home
|
4.4 扩展 /root lv
1
2
3
4
| lvextend -L +100G /dev/mapper/centos-root
xfs_growfs /dev/mapper/centos-root
# ext4 用 resize2fs
# resize2fs /dev/mapper/centos-root
|
4.5 重建 home
1
2
3
4
5
| lvcreate -L 40G -n home centos
mkfs.xfs /dev/centos/home
mount /dev/centos/home /home
cp -r homebak/* /home/
chown -R <user>:<group> /home/<user>
|
强烈不推荐——中间任何一步失败都会让系统无法启动。新机器直接买大系统盘更省事。
五、场景三:原盘扩容
需求:原来是 500G 数据盘不够用,在阿里云控制台扩容到 700G,数据不变、挂载不变。
5.1 控制台扩容
ECS 控制台 → 云盘 → 更多 → 磁盘扩容 → 改容量 → 重启(必须重启才能识别新容量)。
5.2 删旧分区 + 建新分区
1
2
3
4
5
6
7
8
9
| fdisk /dev/vdb
# 输入:
# d 删除分区
# n 新建分区
# p 主分区
# 1 分区号
# 回车 回车 默认起止
# 提示 "Partition #1 contains a ext4 signature" → 输入 n(不删除签名)
# w 保存退出
|
5.3 修正文件系统
1
2
3
| resize2fs /dev/vdb1
df -h
# 看到 700G 就对了
|
坑提醒:xfs 文件系统不支持 resize2fs 缩容(只能扩容),用 xfs_growfs:
六、典型坑速查
| 现象 | 原因 | 处理 |
|---|
fdisk 提示 “Partition table entries are not in disk order” | 多次增删分区后 | 走 §5 重建 |
mount /dev/vdc1 /data 报 “wrong fs type” | 没格式化 | 走 §3.4 mkfs |
blkid 拿不到 UUID | 内核没识别新分区 | partprobe 强制重读 |
| 重启后挂载点丢了 | 没写 /etc/fstab | 走 §3.6 |
/etc/fstab 写错导致 ECS 起不来 | 字段不对 | 进救援模式(控制台 → 救援连接)改回 |
The device apparently does not exist | 内核没重读分区 | partprobe |
扩容后 df -h 还是原大小 | 文件系统没扩 | 走 §5.3 resize2fs / xfs_growfs |
七、开机自动挂载的最佳实践
7.1 用 UUID 而不是设备名
/dev/vdX 在重启时可能变化(内核按发现顺序命名),UUID 是稳定的。
7.2 加 nofail 选项(云盘场景)
1
| UUID=a6ce082e-88cb-469f-8405-72192b89a439 /data ext4 defaults,nofail 0 0
|
nofail 告诉 systemd:挂载失败也别停机——适合云盘还没挂的过渡期。
7.3 配 fsck 顺序
/:pass = 1(先检查)- 其他:pass = 2(后检查)
- swap:pass = 0(不检查)
八、典型用法速查
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 查所有块设备
lsblk
# 查 UUID
blkid
# 查挂载点
df -h
mount | column -t
# 查 /etc/fstab
cat /etc/fstab
# 手动 mount
mount -a # 模拟重启挂载
mount -o remount,rw /data # 重新挂载(改可写)
mount -o noatime /dev/vdc1 /data # 不更新访问时间(提升 IO 性能)
# 卸载
umount /data
|
九、下一步
- 想做云盘快照 + 跨区复制 → 走阿里云 ESSD / SSD 云盘 + 快照服务
- 想做多盘合并(JBOD / RAID0)→ 用
mdadm 或 LVM - 想做云盘监控 → 阿里云 云监控 → 配磁盘使用率 / IOPS 告警
- 想换更现代的存储方案 → 阿里云 NAS(共享文件存储)/ OSS(对象存储)
参考资料
2024+ 视角:写于 2025-09,半年后阿里云 ESSD 与云原生存储
本文写于 2025-09-15——半年后(2026 年)阿里云存储领域又发生了几件值得关注的事。
一、ESSD 已成"默认云盘"(2020+ 趋势的延续)
- 2025 年阿里云新购 ECS 默认云盘已经是 ESSD Entry / ESSD PL0 / PL1,普通 SSD 云盘逐渐淘汰。
- ESSD PL3 / PL4(2024 起推出):
- 单盘 IOPS 最高 100 万,吞吐量 4 GB/s——直逼本地 NVMe SSD。
- 适合数据库(MySQL / Redis / MongoDB)的高并发场景。
1
2
3
4
5
6
| # 2025 看云盘类型
fdisk -l
# Disk /dev/vdb: 500 GiB, 536870912000 bytes, 1048576000 sectors
# 看不到"是 ESSD PL1 还是 PL3"——要去控制台 / OpenAPI 看:
aliyun ecs DescribeDisks --DiskId d-bp1xxxxxxxxxxxxxx | jq '.Disks.Disk[0].Category'
# "cloud_essd" / "cloud_essd_entry" / "cloud_essd_pl1" ...
|
二、在线扩容的"无重启"姿势
- 2017 之前:扩容云盘必须重启 ECS。
- 2021+:阿里云支持在线扩容(不重启),但需要 OS 层配合:
1
2
3
4
5
6
7
8
9
10
11
| # 1. 阿里云控制台扩容(无需重启)
# 2. 查新容量
fdisk -l /dev/vdb
# 3. 重建分区表
partprobe /dev/vdb
growpart /dev/vdb 1 # cloud-utils-growpart 包
# 4. 文件系统扩容
xfs_growfs /data # xfs
# resize2fs /dev/vdb1 # ext4 自动检测新大小
|
- 前提:分区是 GPT 才有 growpart 的"自由空间"概念(MBR 4 个主分区限制)。
三、云盘快照 + 跨区复制
- 快照 2.0(2023 起):增量化、秒级创建。
- 跨区复制:通过 快照一致性组 + CRC 校验 + 加密传输——异地灾备 5 分钟搞定。
1
2
3
4
5
6
| # 用 OpenAPI 创建加密跨区快照
aliyun ecs CopyImage \
--RegionId cn-hangzhou \
--ImageId m-bp1xxxxxxxxxxxxxx \
--DestinationRegionId cn-shanghai \
--Encrypted true
|
四、Ultra Disk / 本地盘 SSD 的回归
- 2020-2023:本地盘被云盘(ESSD)压制。
- 2024-2025:AI 训练 / 大模型推理对超低延迟本地 NVMe SSD 需求回升——阿里云推出 d3 / d3c(高 IO 本地盘)+ ea(本地 NVMe SSD)。
| 类型 | 延迟 | IOPS | 吞吐 | 适用 |
|---|
| ESSD PL1 | 1-2 ms | 5 万 | 350 MB/s | 通用数据库 |
| ESSD PL3 | < 1 ms | 100 万 | 4 GB/s | 高并发数据库 |
| 本地 NVMe SSD(d3c) | 100-200 μs | 100 万+ | 5+ GB/s | AI 训练 / Redis |
五、NAS / OSS / 块存储的"三分天下"
- 块存储(云盘):单 ECS 独占,数据库专用。
- NAS(NFS / SMB):多 ECS 共享,Web 静态资源 / 容器 PVC。
- OSS(对象存储):无限容量,备份 / 日志归档 / 静态网站托管。
2024+ 新选择:
- 阿里云 ECI(Elastic Container Instance):直接跑容器,不需要 ECS——容器数据存 ESSD 或 NAS。
- CPFS(并行文件系统):AI / HPC 场景专用,PB 级吞吐。
- OSS 加速器(transfer acceleration):跨境传输 10x 加速。
六、UltraPath / 多路径 IO
- 多块云盘做 RAID 0 / 1 / 10 时,2024 阿里云推荐用 UltraPath 替代 mdadm:
1
2
3
4
| # 装 UltraPath Agent
wget https://alibaba-ultra-path.oss-cn-hangzhou.aliyuncs.com/ultrapath-linux-<version>.rpm
rpm -ivh ultrapath-linux-<version>.rpm
upadmin show path
|
- 优势:自动识别云盘拓扑、IO 调度优化、故障路径切换(< 5s)。
七、fstab 写错导致 ECS 起不来的"无救援模式恢复"
- 2017 那篇给的是"控制台 VNC → 改 fstab"。
- 2024 起:阿里云提供 “实例救援连接”——通过 VNC 但更稳定(基于 IPMI):
1
2
3
4
5
6
| # 控制台 → ECS → 实例 → 远程连接 → 救援连接
# 等几分钟后,自动进 single user mode
mount -o remount,rw /
vi /etc/fstab
# 改回正确配置
reboot
|
- 预防:fstab 写错之前用
mount -a 验证(本文 §3.7 已强调)。
八、/etc/fstab “nofail” 选项的 2024 最佳实践
本文 §7.2 已经强调 nofail。2024 进阶:
1
| UUID=xxx /data ext4 defaults,nofail,nobootwait,x-systemd.device-timeout=30 0 2
|
| 选项 | 作用 |
|---|
nofail | 挂载失败不阻塞启动 |
nobootwait | 不等待挂载(systemd 早期兼容) |
x-systemd.device-timeout=30 | 设备等待 30 秒(默认 90 秒太慢) |
x-systemd.requires= | 挂载前等某个 unit |
2024 推荐写法:
1
2
| # /etc/fstab
UUID=a6ce082e-... /data ext4 defaults,nofail,x-systemd.device-timeout=10 0 2
|
九、云原生时代的"挂载"
- 2024 大量新应用不直接挂云盘——走 CSI 驱动 + PV/PVC(K8s)。
- 阿里云 CSI 插件自动把 ESSD 映射为 Pod 的 volume:
1
2
3
4
5
6
7
8
9
10
11
| apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Gi
storageClassName: alicloud-disk-essd
|
1
2
3
| kubectl get pvc
# STATUS: Bound
# VOLUME: d-bp1xxxxxxxxxxxxxx
|
- 优势:Pod 漂移到其他节点自动重新挂载,不再关心 fstab / UUID。