腾讯云服务器挂载数据盘与在线扩容:fstab 写错开机进不去
正文
腾讯云服务器挂载数据盘,看着就是把盘挂上去这么简单,可最常见的翻车不是挂不上,而是挂上之后开不了机。有一次客户半夜打电话说服务器重启后彻底连不上,控制台却显示还在运行——折腾半天才发现,是前一天挂盘时 fstab 少写了一个 UUID,开机时 systemd 一直在等那块不存在的盘,最后掉进了紧急模式。挂载一时爽,fstab 写错火葬场。这篇我按实际操作顺序,把分区表与文件系统、挂载与持久化、在线扩容,以及写错之后的救回方法讲清楚。
分区表与文件系统:动手前先搞懂你在挂什么
很多人第一次挂盘就卡在"为什么 df 看不见这块盘"。原因是新买的云硬盘 CBS 是块裸设备,没有分区表、没有文件系统、也没有挂载点,系统自然不会把它算进可用空间。你看到的是"空间买了却用不上"。
先认设备。用 lsblk 或 lsblk -f 看块设备树,系统盘通常是 vda,数据盘是 vdb 及以后。确认数据盘容量对得上,再动手。
然后是分区表。MBR 和 GPT 是两种分区方案:MBR 兼容性老,单个分区最大约 2TB,最多四个主分区;GPT 没有 2TB 限制,分区数量也多,现在买大容量数据盘基本都该用 GPT。经验判断很简单:盘大于 2TB,就必须用 GPT。 分区工具对应地用 parted 或 gdisk,别硬拿老版 fdisk 去写 GPT。
再补一个实操细节:分区时要注意对齐。现代云硬盘和文件系统都以 4KiB 扇区为单位,用 parted 新建分区时选择 MiB 或 GiB 作为起止单位,能让分区与物理扇区对齐,避免读写性能打折。另外,如果盘小于 2TB、又只有单分区需求,直接整盘建文件系统(mkfs.xfs /dev/vdb)也很常见,不分区反而更简单,扩容时对整盘执行 xfs_growfs 即可。
分区和格式化在命令层面是几步固定动作:用 parted /dev/vdb mklabel gpt 建立 GPT 分区表,再用 parted /dev/vdb mkpart primary 0% 100% 划出一个分区,接着 mkfs.xfs /dev/vdb1 创建文件系统。这几步谁先谁后不能乱,顺序一错,要么设备名对不上,要么命令直接报错。做完用 lsblk -f 复核一遍,能看到分区和对应的文件系统类型,才算踏实。
接着是文件系统,这是最容易埋雷的一步,因为它决定了后面扩容用哪条命令:
• ext4:兼容性好、支持在线扩容,缩容需要卸载后进行,命令是 resize2fs;
• xfs:大文件、大并发表现好,CentOS 系默认,只扩不缩,命令是 xfs_growfs。
格式化命令是 mkfs.ext4 /dev/vdb1 或 mkfs.xfs /dev/vdb1。这里必须敲黑板:格式化会清空这块盘上的所有数据,只在裸盘或确认无数据时执行。 已经有数据的盘,绝对不要重新 mkfs。
挂载命令与持久化:为什么一定要动 fstab,怎么动才安全
分区和格式化完成后,先手动挂载试跑:建好目录 mkdir -p /data,然后 mount /dev/vdb1 /data,再 df -hT 确认已经挂上、容量也对。到这一步,数据盘就能用了——但只是"这次开机内"能用,重启就没了。
这里有个新手容易吃亏的细节:挂载点目录 /data 本身是建在根分区上的,一旦你把数据盘挂上去,/data 里原有的文件就会被"盖住",看不到也访问不到,直到你卸下挂载才会露出来。所以千万别在一个已有数据的目录上直接挂载新盘,正确顺序是先建空目录、再挂载。
要持久化,就得写 /etc/fstab。这里有两个关键细节,是我踩过坑才记住的:
第一,别用设备名,用 UUID。写 /dev/vdb1 看似直观,但设备名在热插拔、换挂载顺序、系统升级后可能变化,一旦对不上,轻则挂错盘,重则开不了机。用 blkid /dev/vdb1 拿到 UUID,写进 fstab 才稳。
第二,加上 nofail 参数。一行典型的 fstab 是:UUID=你的UUID /data ext4 defaults,nofail 0 2。最后两个数字分别是 dump 备份标记和 fsck 检查顺序,根分区是 1,数据盘一般写 2。nofail 的含义是:即使这块盘不存在或挂载失败,也别阻塞系统启动。少了 nofail,一块掉线的数据盘就能让整台机器开不了机。
写完千万别直接重启。正确姿势是先执行 mount -a,让它按 fstab 把所有条目挂一遍,没有报错说明语法和 UUID 都对;更严格一点可以跑 findmnt --verify 做校验。确认无误后再重启,才安全。
顺带把 fstab 的每一列含义说清,避免照着别人的配置抄出问题:第一列是设备标识,推荐 UUID,也可用 LABEL;第二列是挂载点,必须是一个已存在的目录;第三列是文件系统类型,要和你 mkfs 时用的完全一致;第四列是挂载参数,defaults 代表一组常规默认值,我们还能追加 noatime 来减少写盘;第五列是 dump 备份标记,通常写 0;第六列是开机 fsck 检查顺序,根分区写 1、其他分区写 2、不检查写 0。照着字段含义逐列填,比复制粘贴一段来路不明的 fstab 安全得多。
挂载完成后还有个小坑:如果挂载点要交给普通用户读写,得用 chown 调整属主属组,否则应用进程会因为没权限而写不进去;而用 mount -o remount 临时改的挂载参数只在当前生效,想让它开机一直有效,仍然要落回 fstab。另外,改完 fstab 不需要重启验证,mount -a 就能把尚未挂载的条目挂上,已经挂载的条目不会被它重新处理,这也是它验证起来相对安全的原因之一。
在线扩容:云硬盘扩了,为什么 df 还是老容量
业务跑着跑着数据盘满了,这时候不需要关机、不需要迁移数据,腾讯云服务器挂载数据盘之后做在线扩容,是站长的常规操作。它的原理是:先把云硬盘的"块设备容量"在控制台扩大,再让分区表跟上,最后让文件系统跟上——三步缺一不可。
顺序是:
在控制台把云硬盘容量调大,比如从 50GB 扩到 100GB,这一步只是把块设备变大,df 不会变;
系统内执行 growpart /dev/vdb 1 扩展分区(需要 cloud-utils-growpart 工具),让分区吃满新容量;
最后扩展文件系统:ext4 用 resize2fs /dev/vdb1,xfs 用 xfs_growfs /data;
用 df -hT 确认容量终于变大了。
我用一张表把各环节的关键点摆清楚,方便对照,避免漏步或顺序搞反:
环节 关键命令 作用 常见坑与注意
识别设备 lsblk -f 找到数据盘与文件系统 别把系统盘当数据盘操作
分区 parted 或 gdisk 建立 GPT 或 MBR 分区表 大于 2TB 必须用 GPT
格式化 mkfs.ext4 或 mkfs.xfs 创建文件系统 会清空数据,裸盘才能做
挂载 mount /dev/vdb1 /data 本次开机临时生效 重启即失效,需持久化
持久化 blkid 取 UUID 写入 fstab 开机自动挂载 用 UUID 并加 nofail
在线扩容 growpart 加 resize2fs 或 xfs_growfs 扩大分区与文件系统 先扩分区再扩文件系统
还要分清两种扩容对象。数据盘可以按需在线扩,业务几乎无感;系统盘同样能扩,但一样要手动让分区和文件系统跟上,步骤是一致的。反过来,云硬盘缩容在很多场景下是不支持的,尤其 xfs 文件系统只扩不缩,所以扩容别一时兴起,要按真实用量来规划。如果确实要把一块盘变小,通常只能新建一块小盘,把数据拷过去再切换。
扩容前我强烈建议先打一个云硬盘快照。扩容本身是无损的,但操作里只要有一条命令敲错设备,损失就是整块盘,有快照才有退路。
fstab 写错进不了系统:两种故障与救回步骤
fstab 写错的后果分两种,处理方式完全不同。
第一种,能进系统但目标盘没挂上。设备名或参数写错,systemd 挂载失败但没阻塞启动,系统照常进入,只是数据盘不见了。很多人此时以为"数据丢了",其实数据好好的,lsblk 还能看到盘,只是没挂到挂载点,改对 fstab 即可。
第二种,进不了系统,掉进紧急模式(emergency mode)或一直卡在启动日志。原因是 fstab 引用了不存在的设备,又没写 nofail,systemd 会一直等待这个挂载任务,超时后进入 emergency shell,屏幕通常会提示输入 root 密码。
进 emergency 模式其实还有另一条入口:开机时在 GRUB 菜单里编辑内核参数,追加 systemd.unit=emergency.target 或 single,也能把我拉进单用户救援环境,效果和自动掉进紧急模式类似,适合系统还没被拖进 emergency 就提前挂掉的情况。
救回的核心思路是:先进系统、把根分区改成可写、再把错误的 fstab 行注释掉。具体步骤:
在 emergency shell 输入 root 密码进入(若本来设了密码);
此时根分区常是只读的,先执行 mount -o remount,rw / 让它可写;
编辑 /etc/fstab,在出错那一行行首加 # 注释掉,或用 blkid 查到的正确 UUID 替换;
执行 mount -a 验证不再报错;
reboot 重启,系统即可正常进入。
如果连 emergency shell 都进不去,还有两条路:一是云控制台的 VNC 管理终端通常也能进到同样的救援界面;二是挂载救援——在控制台把系统盘或数据盘做成快照,再挂载到另一台临时实例上,改好配置文件后挂回来。这就是为什么排障时我更看重"能不能把盘挂到别的机器上看看",而不是死磕一台开不了机的实例。
这里再多说一句 systemd 的机制,你就知道报错为什么是"启动卡住"而不是"挂载失败":新版本系统会把 fstab 翻译成一个个 mount unit,一块期望存在、却没写 nofail 的盘,就变成一个迟迟完不成的启动依赖,超时后把整台机器拖进 emergency 模式。理解了这一层,再回头看那条少写的 UUID,就知道它闯的祸有多大。
预防这件事的成本极低:改 fstab 之前先 cp /etc/fstab /etc/fstab.bak 备份一份,用 UUID 加 nofail,改完先 mount -a 或 findmnt --verify 再重启。这三步做完,你就基本告别了"改一行配置、废一台服务器"的噩梦。
FAQ
Q:新买的数据盘,df 看不到,是坏了吗?
A:不是。新购云硬盘 CBS 是未分区、未格式化的裸设备,需要分区、格式化、挂载后才能使用。用 lsblk 能看到盘,但不会有可用的文件系统。
Q:ext4 和 xfs 该选哪个?
A:追求兼容和可缩容选 ext4;追求大文件与大并发性能、且只扩不缩选 xfs。CentOS 系默认 xfs,Ubuntu、Debian 常用于 ext4,跟着系统默认走最省心。
Q:云硬盘在控制台扩容了,为什么 df 容量没变?
A:控制台扩容只扩大了块设备,分区和文件系统还没跟上。需要执行 growpart 扩分区,再用 resize2fs 或 xfs_growfs 扩文件系统。
Q:fstab 写错,数据会丢吗?
A:一般不会。进不去系统只是挂载卡住,数据仍在盘上。进入救援模式注释错误行或改用正确 UUID,重启即可恢复访问。
Q:数据盘扩容需要停机吗?
A:在线扩容不需要停机,也不需要迁移数据。但为安全起见,操作前应先打快照,并确认扩的是数据盘而非系统盘。
结语
腾讯云服务器挂载数据盘这条链路,可以浓缩成一句话:认设备、定分区表、建文件
本文由不代表本站立场,转载联系作者并注明出处。
