接手一台新装了 CentOS 7 的服务器,系统盘就位,数据盘还是裸盘一块,df -h里看不到它,lsblk却能看到一整个/dev/sdb摆在那里——这种场景干过运维的都不陌生。CentOS 7 初始化硬盘并挂载,说白了就是把一块新盘从“硬件层面可见”变成“系统里能用”的过程,中间要经过识别、分区、格式化、挂载、配置开机自启这几道工序。这活儿是 Linux 运维的基础功,但越基础的东西越容易在细节上翻车,比如分完区忘了写/etc/fstab、重启后挂载消失,或者用错分区表导致 2TB 以上的盘识别不全。这篇内容我会按实际操作流程把每个环节拆开讲清楚,包括命令背后的原理、踩坑现场和排查套路,适合刚接触服务器运维的新手,也适合干了几年但没系统梳理过这块的老手对照查漏。
1. 方案设计:初始化之前先想清楚这三件事
1.1 明确目标场景:你手里的是什么盘、要往哪挂
新硬盘出现在系统里,第一步不是急着分区,而是先搞清楚它属于哪种场景。常见的无非三种:物理机新加的数据盘、云平台上单独购买并挂载的数据盘、以及用来做交换分区或者备份盘的裸盘。物理机新硬盘通常整块都是空的,连分区表都没有;云平台挂载的盘有些会自带分区结构,有些也是一块裸设备。两者在前期的处理流程上有细微差别,但大体逻辑一致。
另外一个要提前拍板的问题是挂载点。挂载点说白了就是“这块盘在系统目录树里放在哪个位置”,最土但也最稳妥的做法是单独建一个目录,比如/data、/mnt/storage,而不是直接把盘挂到/root、/home这种系统目录下面。原因很简单:系统目录往往已经被系统盘占用,强行挂上去会把原有的目录内容“遮住”,到时候新盘里的数据倒是看着有了,原目录里的文件却再也访问不到——因为挂载点目录下原有的文件会被隐藏,直到卸载为止。
1.2 分区表与文件系统的选型逻辑
CentOS 7 默认安装时会用 LVM 和 XFS,但新加的数据盘大可不必照抄系统的布局。分区表类型主流就两种:MBR 和 GPT。MBR 最大只支持 2TB 的盘(严格来说是 2TiB),超过这个容量要么丢掉后面的空间,要么就用 GPT。GPT 没有 2TB 限制,还能建更多主分区,是现在新盘的首选分区表类型。这块的判断标准很简单:盘容量小于 2TB 你用 MBR 没毛病,超过 2TB 直接 GPT。不过 CentOS 7 的fdisk默认对超过 2TB 的盘会自动提示改用 GPT,用parted交互式操作也能直接指定 GPT,别在这上面纠结太久。
文件系统方面,CentOS 7 的默认文件系统是 XFS,我在实际场景里也推荐优先用 XFS。它在大文件、高并发写入的场景下表现比 ext4 更稳,而且 CentOS 7 官方镜像直接支持,扩容工具链也齐全。如果你有跨平台兼容性的需求(比如要把盘拔下来插到 Windows 机器上读),那可以考虑 ext4,Windows 下装个第三方驱动还能勉强读写。XFS 在 Windows 下默认完全不可读,这点务必提前想清楚。
1.3 先备份再动手:格式化不是请客吃饭
有一个原则必须放到最前面:任何磁盘操作之前,先确认盘上有没有你需要的数据,有就备份,没有才谈得上格式化。我见过不止一次,新人拿到一个二手盘当新盘用,mkfs一把梭直接把前任留下的备份数据全抹了。服务器磁盘这块,数据的价值远超磁盘本身的硬件成本。格式化、分区这种操作一旦执行,恢复的成本极高,没有十足把握宁可多花十分钟检查一遍也不要急着下手。
提示:拿到新盘之后执行
lsblk -f看一眼有没有已有文件系统,再执行fdisk -l /dev/sdX看有没有分区表,确认都没东西再动手。这一步花不了两分钟,但能省下后面无数麻烦。
2. 硬盘识别与现场勘查:动手分区前的必修课
2.1 用 lsblk 快速定位新盘
开机进系统第一件事,敲lsblk。这个命令能输出当前系统里所有块设备的树状关系,包括磁盘本身和它下面的分区,以及挂载点信息。新加的裸盘在这里会以完整磁盘的形式出现,比如/dev/sdb,下面没有任何分区子项,也没有挂载点。如果此时你敲df -h,里面也不会出现这个盘——这是正常的,别慌。
lsblk输出的几个关键字段要知道怎么读:NAME是设备名,SIZE是容量,TYPE表示 disk 还是 part,MOUNTPOINT显示挂载位置,空白的就说明这块盘还没有被挂载。它还有一个特别有用的参数-f,能额外列出文件系统类型和 UUID。对新盘勘查来说,lsblk -f一条命令就能看出盘有没有被格式化过、格式化成了什么文件系统、有没有 UUID,基本够用。
2.2 用 fdisk -l 和 dmesg 确认磁盘身份
光看lsblk还不够严谨,有时候机器里有多块同型号的盘,容量大小都一样,光靠lsblk的输出容易认错盘。更稳妥的做法是再执行fdisk -l /dev/sdb,看这块盘的扇区数、容量、模型信息,以及有没有分区表。fdisk -l不带设备参数会列出所有磁盘,带设备参数就只看指定盘,输出结果里 Disk label type 如果是 dos 就是 MBR 分区表,如果是 gpt 就是 GPT 分区表,显示 no valid partition table 说明这就是一块完全空白的盘。
内核日志也是一个参考渠道,新盘接入时内核会打日志,用dmesg | grep sd能看到类似sdb: sdb1这样的信息。不过这个更多用于排查硬件识别问题,日常确认识别结果用lsblk加fdisk -l完全够。如果盘插上之后lsblk里看都看不到,那就不是初始化的问题了,得先查链路、驱动或者硬件,属于另一个排查方向。
2.3 确认系统盘与数据盘的区别
勘查过程里最重要的一件事,是千万别把系统盘当成数据盘给初始化了。分辨方法并不复杂:lsblk输出里挂载点为/的那块盘就是系统盘,比如常见的/dev/sda1挂载在/上、/dev/sda2可能是 swap,所有这些分区都归属于/dev/sda,那/dev/sda就是系统盘。数据盘一般是另外的设备名,比如/dev/sdb、/dev/sdc,看挂载点为空、且下面没有任何分区,基本可以锁定目标。
如果你是在虚拟化环境或云平台里干活,还要小心一种情况:系统盘和数据盘的设备名可能不固定,重启之后 sda 和 sdb 可能互换。判断依据不能只看设备名,还要看容量和挂载关系。容量大的往往是数据盘,挂了根目录的是系统盘,这两个特征同时确认才保险。
3. 分区创建与格式化实操:从裸盘到可用文件系统
3.1 小容量盘用 fdisk 交互式分区
先从小盘讲起。假设/dev/sdb是一块 500GB 的数据盘,没有分区表,目标是在上面建一个分区、格式化成 XFS。执行:
fdisk /dev/sdb进入交互界面后,依次操作的步骤是:输入n新建分区,然后p选择主分区,分区编号可以直接回车默认(1),起始扇区直接回车用默认值(通常是 2048,这是对齐到 1MiB 边界的最佳实践),结束扇区如果只想用一个分区占满整盘就回车默认,但如果你有规划,比如想分出/data和/backup两个区,就在结束扇区输入比如+200G表示这个分区大小为 200GB。最后输入w保存退出。
回显里会告诉你分区已经建好,用lsblk就能看到/dev/sdb1出现了。注意在w之前数据不会真正落盘,如果中途改主意,输入q直接退出就行,不会对磁盘造成任何改动。我个人习惯在w之前先按p打印一遍分区表确认无误,确认分区编号、起始结束扇区、大小都对得上,再写盘。
3.2 超 2TB 大容量盘用 parted 走 GPT
超过 2TB 的盘fdisk默认会提示不支持 MBR 或者无法完整识别容量,这时候就要用parted。以一块 4TB 的/dev/sdc为例,操作如下:
parted /dev/sdc mklabel gpt mkpart primary xfs 0% 100% print quit第一条mklabel gpt是给磁盘创建 GPT 分区表,此时会有一个交互确认,输入 yes 回车即可。第二条mkpart primary xfs 0% 100%表示创建一个从磁盘开头到结尾的分区,文件系统类型参数在你还没格式化之前其实只是个标签,真正决定文件系统的是后面的mkfs命令。print用于确认分区表结构,最后quit退出。
用百分比而不是具体的扇区数值,好处是不同容量的盘都能直接用这套命令逻辑,不需要自己算扇区数。分区建好之后,同样用lsblk确认能看到/dev/sdc1。
3.3 格式化:mkfs.xfs 与 mkfs.ext4 的实际操作
分区建好只是一个容器,要在里面写入文件系统才算真正可用。CentOS 7 里创建 XFS 文件系统的命令是:
mkfs.xfs /dev/sdb1如果要 ext4,则是:
mkfs.ext4 /dev/sdb1这一条命令执行完,分区上会生成完整的文件系统结构,包括超级块、inode 表、日志区域等。XFS 在格式化过程中会输出一堆信息,包括 meta-data、data、log 等区块的详细参数,扫一眼确认 sb(超级块)所在位置和 blocksize 正常即可,不需要逐行理解。格式化大容量盘会花一点时间,500GB 大概几十秒到几分钟,4TB 可能要更久,期间别去 Ctrl+C 中断,否则文件系统处于半成品状态,还得重新再来一遍。
格式化是有破坏性的操作,mkfs命令会清空分区上已有的所有数据。所以在执行之前,必须再核对一遍设备名,确认/dev/sdb1就是你要用的那个分区。一个防止手滑的小技巧是:执行前先跑一次lsblk -f,把设备名和容量、挂载点一起核对,心理默念三遍“确认是数据盘、确认没有要保留的数据”,再敲回车。
3.4 格式化的常见参数与场景调整
默认参数在大多数场景下够用,但有些场景建议定制。比如存储大量小文件(日志碎片、图片缩略图等)的场景,可以在格式化时通过参数调整 inode 密度。XFS 用-i maxpct=设置 inode 最大占比,ext4 用-i指定 bytes-per-inode,把单文件占用的 inode 空间改小,能容纳更多小文件。不过这类参数调整需要你对业务的文件分布有明确认知,否则乱调反而影响性能。
还有一个实用参数是-L,给文件系统打标签。比如:
mkfs.xfs -L data_disk /dev/sdb1打完标签之后,lsblk -f里能看到这个 LABEL,挂载的时候也可以用LABEL=data_disk来代替设备名,多一层保险,防止认错盘。尤其在多盘环境下,标签比设备名好记,也更具语义化。
4. 挂载与开机自动挂载配置:让数据盘持久可用
4.1 创建挂载点并手动挂载
文件系统格式化完成,接下来就是挂载。挂载需要两个东西:设备(比如/dev/sdb1)和一个挂载点目录。先建目录:
mkdir -p /data然后挂载:
mount /dev/sdb1 /data执行完df -h就能看到/dev/sdb1出现在列表里,挂载点/data,容量对得上,使用率 0%。此时这块盘已经能正常写入读出了,可以测试一下:
touch /data/test.txt && echo "ok" > /data/test.txt能正常创建文件,说明读写链路是通的。这里埋个伏笔:如果你建了文件系统但没写入 fstab,重启之后这个挂载关系会消失,系统起来之后/data里什么都看不到。
4.2 用 UUID 替代设备名写入 /etc/fstab
下一步就是把挂载关系固化到/etc/fstab,这样重启之后系统会自动挂载。先获取分区的 UUID:
blkid /dev/sdb1输出类似UUID="xxxxx-xxxx-xxxx" TYPE="xfs",把 UUID 复制下来。然后编辑/etc/fstab,在末尾追加一行:
UUID=xxxxx-xxxx-xxxx /data xfs defaults 0 0这行有六个字段:设备标识、挂载点、文件系统类型、挂载参数、是否 dump、是否 fsck。设备标识用 UUID 而不是/dev/sdb1,这是关键。原因在于设备名在系统重启后有漂移的可能(尤其是有多块同类型盘时,内核识别顺序可能变化),但 UUID 是格式化时写入文件系统的唯一标识,只要不重新格式化就不会变。用 UUID 能避免“开机后发现挂载到了错误的盘”这种诡异问题。
defaults参数挂载时默认包含 rw、suid、dev、exec、auto、nouser、async 这些选项,普通数据盘用默认即可。最后两个数字:第一个 0 表示不需要 dump 备份,第二个 0 表示开机不检查文件系统。根目录那行通常是0 1,其他数据盘写0 0或0 2都行。如果写了0 1,每次开机都会对这个数据盘做一次 fsck,大容量盘会拖慢开机速度,没必要。
4.3 mount -a 验证:改完 fstab 别急着重启
每改完/etc/fstab,我的习惯是先执行一遍:
mount -a这个命令会根据 fstab 里所有的配置,把没挂载的设备全部挂载一遍。如果 fstab 里写错了设备标识或挂载点,这里就会报错,你能当场发现并修正,而不是等到重启后进不了系统才追悔莫及。执行完之后再跑一次df -h,确认挂载结果符合预期。
过一遍之后再真正重启一次,重点观察系统能不能正常起来、/data是否自动挂载。虽然重启会花时间,但这一步能验证 fstab 在开机流程中的真实表现,尤其是排查多盘环境下设备顺序不稳定的问题,重启验证是绕不开的。
注意:
/etc/fstab写错是导致服务器开机卡在维护模式的一大元凶。如果你改了 fstab 后心里没底,可以先执行mount -a验证;万一已经重启进了 emergency 模式,查看/etc/fstab里最近改的那行,删掉或修正再重启即可。这段后面还会细说。
5. 修改挂载位置与存量数据迁移:磁盘二次规划的全流程
5.1 什么时候需要修改挂载位置
挂载关系不是永远不变的。最常见的几种修改场景:公司内部规范变更,要求数据盘统一挂到/data而不是当初随手写的/mnt/data;原有挂载点目录层级调整,比如新增一层/srv/storage;也可能是两块盘的挂载位置要对调,或者某块盘要从这台服务器挪到另一台上去。这些场景统称为“修改挂载”,本质都是先卸载旧的挂载关系,再建立新的挂载关系,必要时还要迁移存量数据。
5.2 安全卸载:先确认无进程占用再 umount
假设当前/dev/sdb1挂在/data,现在要把它改挂到/data2。第一步是卸载:
umount /data但这行命令经常失败,报target is busy。原因是挂载点上有文件被进程占用,最常见的是某个服务把日志或者数据文件写在这个目录下,比如 Nginx 的 access_log、数据库的数据目录等。强制卸载可以用umount -l(懒卸载),但强烈不建议直接上这个参数,它会让还在写文件的进程“断崖式”失去文件系统,可能造成数据损坏或进程崩溃。
正确姿势是先找出占用进程,再用合适的方式停止它:
lsof /data fuser -v /datalsof会输出所有打开着/data下文件的进程,fuser -v也能看到类似信息。确认哪些进程在占用,能停的先停掉,确实不能停的服务要考虑是否有维护窗口期,在业务低峰期操作。确认没有占用之后再执行umount /data,此时应该干干净净地返回,没有报错。
还有一个小细节:如果当前 shell 的当前工作目录就在/data里面,umount也会报 target is busy。这时候cd /离开挂载点目录再执行卸载就行,lsof里可能看不到,但fuser -v会提示当前进程占用,经验少的同学容易在这卡一下。
5.3 数据迁移:从旧挂载点到新挂载点
卸载之后,/data目录还在,但里面已经是空的了(原来目录下如果有数据,此时不会显示,因为设备已经摘掉)。现在要把这块盘挂到新位置:
mkdir -p /data2 mount /dev/sdb1 /data2看起来很简单,但如果旧挂载点上原本有存量数据呢?比如/data下已经积攒了 2TB 的业务数据,你不能直接卸载了事,得先把这些数据搬到新位置。流程是:
- 用
cp -a、rsync或tar将挂载点下的所有文件复制到新挂载点。 - 复制完成后对比新旧两边的文件数量和大小,确认没漏。
- 再卸载旧挂载点,此时旧目录下数据还在磁盘上,不会因为卸载而消失。
- 删掉旧的挂载点目录(可选,但保持目录干净是好事)。
实际操作用rsync最稳,断点续传、校验、权限保留都支持,大文件多文件场景都扛得住。一条典型的命令:
rsync -avP /old_mount/ /new_mount/注意源路径末尾的斜杠——有斜杠表示复制目录下的所有内容,没有斜杠表示复制目录本身。这个区别经常被忽略,一旦搞错,目录层级就会多套一层。迁移大目录需要耐心,中途如果 rsync 中断了,重新跑一遍同命令会自动跳过已完成的文件,续传效率很高。
5.4 修改 fstab 中的挂载配置
数据迁移和重新挂载之后,别忘了同步更新/etc/fstab。如果你在迁移前后都用同一个 UUID、同一个挂载点就在那一行改,那就直接编辑该行;如果盘从/data改挂到/data2,就把 fstab 里那一行的挂载点字段改成/data2。还有一种情况是加了一块新盘,目标是把它挂到某个空目录,那就在 fstab 里新增一行。
改完后依然要执行mount -a验证,确保语法和字段都正确。最后再把旧挂载点目录删掉(如果确定没用了),避免以后有人误以为这个目录下还有数据:
rmdir /old_mount如果旧目录下还有残留文件,rmdir会失败,提示目录非空。这时候自己判断:是真的有文件要保留,还是之前迁移时漏了什么。确定不要了再用rm -rf,这个命令下去就没有后悔药了,务必谨慎。
5.5 多盘场景:通过 fstab 调整挂载顺序与设备绑定
多盘环境下“修改挂载”的难度会上升一个层级。常见问题是:机器上有/dev/sdb和/dev/sdc两块数据盘,分别挂了/data1和/data2,有一次重启之后发现两个目录里的数据和之前对调了。原因就是内核识别设备名的顺序发生了变化,而 fstab 里恰好用的是设备名而不是 UUID。
解决思路很简单——fstab 里全部改成 UUID 绑定,或者用文件系统标签绑定。改成 UUID 之后,无论设备名怎么漂,系统都是根据文件系统的唯一标识来找盘,不会认错。这在 CentOS 7 的服务器环境里属于标配做法,极少数场景还会用到/dev/disk/by-id或/dev/disk/by-path这种软链接路径,原理也是让设备标识稳定化。
对调两块盘挂载位置的场景,推荐的做法是把两块盘都umount,确认没有数据读写后,再把/dev/sdb1挂到/data2、/dev/sdc1挂到/data1,同步修改 fstab 里两行的挂载点字段,最后用mount -a验证。注意这种操作要格外仔细,搞反了就是两个业务目录的数据错乱。
6. 扩展场景:swap 分区、在线扩容与数据搬运套路
6.1 新盘的 swap 分区初始化
某些内存紧张的服务器需要加 swap 空间,拿一块盘分出一个小分区做 swap 是常见操作。流程和普通分区差不多,只是格式化命令不一样。先fdisk /dev/sdb建一个分区,比如 8GB,然后:
mkswap /dev/sdb1 swapon /dev/sdb1mkswap是格式化 swap 文件系统的命令,swapon是临时启用。启用后free -h里能看到 swap 增加了。要让它在重启后保持启用,也需要写入/etc/fstab:
UUID=xxxxx-xxxx-xxxx swap swap defaults 0 0文件系统类型写swap而不是具体的文件系统名,其他字段和普通数据盘一致,但两个数字通常都是 0。如果之前用swapon临时的,重启前务必备份好 fstab,写错字段会导致开机卡住。
6.2 在线扩容:不卸载盘让空间变大
磁盘空间用尽后扩展容量,是运维日常里比修改挂载更刺激的需求。假如/dev/sdb1当初只分了 200GB,现在物理盘实际是 500GB,还剩 300GB 没利用。思路是先扩展分区,再扩展文件系统。
用parted或fdisk把分区扩展到满盘,然后用文件系统的扩容工具在线扩展。XFS 的在线扩容命令是:
xfs_growfs /data它不需要卸载分区,系统会读取分区当前大小并把文件系统扩展到对应大小。ext4 的则是resize2fs /dev/sdb1。在线扩容最舒服的一点是不需要停机窗口,业务还在读写的同时就能扩大容量。不过分区表扩展本身有一定风险,执行前仍然建议对重要数据做备份,至少确认该分区没有正在进行的不可中断任务,比如大规模数据库写入。
这里还要提醒一点:如果你的磁盘当初直接整块用(没有分区表,直接mkfs在裸盘上),扩展时没有分区表这层约束,直接用文件系统工具吸掉新增空间就行;但如果你有分区表,就必须先扩展分区再扩文件系统,顺序反了或者漏了一步都会导致空间“看得到吃不到”。
6.3 已有数据盘换机迁移的完整步骤
有时候整块盘要拆下来装到另一台机器上,或者把数据完整复制到另一块新盘上。这种迁移动作如果做得好,业务几乎无感;做得不好,就是事故现场。思路拆开来是三步:
第一步,把旧盘上所有数据完整复制到新盘。如果新旧盘都能同时挂在一台机器上,直接用rsync从旧挂载点推到新挂载点,全程校验。如果机器上只有旧盘,新盘还没空间挂载,也可以先给新盘分好区、格式化好,再挂载到一个临时目录,用 rsync 搬运。
第二步,卸载旧盘,卸下硬件或者保留不挂。如果准确无误地复制完成,新盘就能完全替代旧盘的角色。
第三步,修改新盘的 fstab 并重启验证。因为新盘的 UUID 和旧盘一定不同(重新格式化过),所以 fstab 里的 UUID 要替换成新盘的。如果业务配置里写死了旧设备名或旧路径,也要一并改掉。这类跨机迁移的最终验证标准是:重启之后服务自动起来,数据路径全部正常,业务日志不再报错。
6.4 裸设备直挂:要不要分区?
有一种激进做法是干脆不分区,整块盘直接格式化后挂载。比如:
mkfs.xfs /dev/sdb mount /dev/sdb /data在虚拟化环境里这种做法还挺常见,因为整块盘没有分区表,后续扩容直接对裸设备扩文件系统,省了分区表这一层操作。但它有一个明显的问题:如果盘出了故障要换盘,新的替代盘往往比旧盘空间稍大,裸设备直挂的盘在迁移时需要重新格式化再复制数据,不能像有分区表的盘那样灵活调整分区大小。另外有些监控工具对“无分区表的磁盘”兼容性差,会误判设备状态。
我的建议是:数据盘一律走分区流程,哪怕只建一个分区占满全盘,也比裸设备直挂多一层灵活性。至于 swap 盘,直接对裸设备做mkswap倒是没问题,分区可有可无。
7. 常见问题与排查技巧实录
7.1 问题速查表
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
lsblk看不到新设备 | 硬件链路或驱动问题 | 检查插槽连接、dmesg查内核日志,确认盘是否被系统识别 |
mkfs执行报“device is busy” | 分区已被挂载或进程占用 | 用mount查看是否已挂载、lsof查看占用进程,先卸载再格式化 |
mount /dev/sdb1 /data后无法写入 | 文件系统为只读挂载 | 检查 mount 输出中是否有ro,重新用mount -o rw,remount挂载 |
| 重启后挂载消失 | fstab 未配置或字段错误 | 检查/etc/fstab,确认 UUID、挂载点、文件系统类型正确,执行mount -a |
| 开机进入 emergency mode | fstab 某一行写错 | 进入维护模式,注释或修正错误行,执行mount -a验证后重启 |
umount报 target is busy | 挂载点被进程占用或当前目录在挂载点内 | lsof、fuser -v排查,或cd /后再卸载 |
| fdisk 提示磁盘超过 2TB 无法识别 | MBR 分区表限制 | 改用parted创建 GPT 分区表 |
df -h容量和lsblk显示的盘容量不一致 | 分区未扩展到全盘 | 扩展分区后用xfs_growfs或resize2fs扩展文件系统 |
| 系统重启后两块数据盘挂载点对调 | fstab 用了设备名而非 UUID | 将所有挂载配置改为 UUID,避免依赖设备名 |
7.2 fstab 写错导致开不了机的抢救流程
这是运维最怕遇到的情况之一,改完/etc/fstab重启,结果系统直接进了 emergency 模式,或者干脆卡在维护界面。核心原因通常是 fstab 里设备标识写错、挂载点不存在、文件系统类型写错。抢救的流程分三步:
第一步,在 emergency / maintenance 模式下输入 root 密码登录。系统会提示你输入 root 密码或按 Ctrl-D 重启,先按提示输入 root 密码进入 shell。
第二步,查看/etc/fstab文件,找出问题行。如果你不知道哪行有问题,用mount -a跑一下,它会报出具体是哪一行、哪个字段出错。把出问题的行开头加上#注释掉,或者直接改写正确。
第三步,先执行mount -a验证能通过,再重启系统。不要注释完立刻重启,必须先在当前模式验证没有语法错误,否则重启后可能继续卡住。
这个抢救过程中有个细节很多人容易忽略:fstab 如果写的是不存在的挂载点目录,比如/data2还没创建,mount -a会直接失败。所以新挂载点目录要么提前mkdir -p建好,要么就检查 fstab 写的是不是真实存在的目录。另外,fstab 里最后两个数字如果写错(比如根目录写了 2),开机时会对根分区做 fsck,万一文件系统异常还会卡在检查界面,这也是常见开不了机的原因之一。
7.3 卸载时缓存还在写:异步 IO 的坑
默认 XFS 挂载参数里包含 async,意味着应用写文件时数据不会实时落盘,而是先到页缓存,由内核异步刷盘。如果你刚做了一个大规模复制任务,复制完立刻执行umount,此时复制任务看起来已经结束,但内核可能还在后台刷缓存。umount会等待缓存刷完才真正卸载,所以有时候你会看到 umount 命令迟迟不返回,这是正常现象。
这个特性也提醒我们:在没有明确 sync 的情况下,刚复制完数据不要立刻拔盘。最稳妥的做法是复制完成后执行一次sync,再等几秒,最后执行umount,确保数据完全落盘。否则数据虽然看着在目标位置,实际上可能还在缓存里,突然断电就会丢失。
7.4 多路径映射:真正的大坑
服务器环境里如果你用的是存储阵列或者多路径软件(比如把两块 HBA 卡连到同一个存储,系统里会出现两个设备名对应同一个 LUN),直接对/dev/sdb做初始化可能踩到多路径的坑。这种环境下磁盘设备会有/dev/mapper/xxx这样的路径,直接对底层设备操作容易把多路径映射弄坏,导致存储系统识别异常。
遇到这种场景,务必确认你用的是 multipath 映射后的设备路径,比如/dev/mapper/mpatha,而不是底层的/dev/sdb或/dev/sdc。查询方式就是跑multipath -l,看看哪些设备被映射到了同一个 LUN 下。我们的正常初始化流程在设备选择上就不能选错路径,一旦选错,轻则分区信息混乱,重则存储侧的映射关系被破坏。
7.5 测试环境的低配模拟:没有真实硬盘怎么练
不是所有人手里都有一台带裸盘的物理服务器,练习这些操作可以用文件模拟块设备。Linux 里可以用truncate创建一个大文件,再把它挂载为 loop 设备,然后在上面练习分区、格式化、挂载整套流程:
truncate -s 2G /tmp/disk_test.img losetup /dev/loop0 /tmp/disk_test.img之后你就可以把/dev/loop0当作一块真实的 2GB 硬盘来练 fdisk、parted、mkfs、mount。虽然性能和真实硬盘有差距,但操作逻辑和命令流程完全一致。尤其是新手想熟悉 fdisk 交互流程又担心搞坏真实数据,用 loop 设备练手是最安全的路径。
结尾:我的几点实操体会
做这行时间久了,反而觉得磁盘初始化这类基础操作最考验细心。我个人的习惯是每一步都留日志——什么时间对哪块盘做了什么操作、执行了什么命令、最终设备 UUID 是多少,全部记在维护手册里。单机操作记不记好像无所谓,但机器一旦多起来,没有记录就是灾难,三个月后你自己都说不清哪块盘当初是怎么分的区。
还有一点想重点强调:修改挂载的操作顺序宁慢勿快。先备份、再卸载、再迁移、再改 fstab、再验证,每一步之间都要有明确的输出确认。我见过很多次线上事故,根源不是命令不熟,而是跳步——改完挂载点忘了改 fstab,或者迁移完数据没验证就卸载了旧盘,导致业务访问路径断裂。这些坑其实都可以靠规范和流程约束来避免。
最后送上一个自检口诀:识别靠 lsblk,分区看容量,格式化先备份,挂载认 UUID,改挂载先卸载,验证用 mount -a,重启看 fstab。这套逻辑能覆盖绝大多数硬件环境和业务场景,你按这个顺序走,基本不会出大问题。后面我还会整理一篇关于磁盘故障排查和性能诊断的内容,到时候再展开聊。