Linux数据盘挂载全攻略:从分区格式化到fstab自动挂载

发布时间:2026/9/12 23:11:38
Linux数据盘挂载全攻略:从分区格式化到fstab自动挂载 刚拿到一台带独立数据盘的服务器或者云主机里加了一块云盘开机后df -h一看只有系统盘那这块新盘在系统里到底存不存在接下来应该怎么把它变成能用的存储空间这大概是每个 Linux 使用者都会遇到的场景也是运维岗面试里常被问的一道基础题。这篇文章我就以“Linux 挂载数据盘”为主题把从认盘、分区、格式化、挂载到开机自动挂载的完整流程拆开讲清楚顺带把我这些年踩过的坑、总结的排查思路一并整理出来。无论你是刚入门想搞懂原理还是已经工作几年想补补细节这篇都值得花十分钟看完。1. 挂载前的准备工作先把这块盘认出来1.1 用 lsblk 确认新磁盘是否存在拿到新盘之后第一步不是急着分区而是确认系统到底有没有识别到这块盘。我习惯先敲lsblk这个命令会把系统里所有块设备以树状结构列出来哪个盘是系统盘、哪个盘是新加的一眼就能看清。$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 40G 0 disk ├─vda1 253:1 0 1G 0 part /boot └─vda2 253:2 0 39G 0 part / vdb 253:16 0 100G 0 disk上面这个例子中vda是 40G 的系统盘下面已经分好了区并且挂载到了/和/boot而vdb就是新加的 100G 数据盘没有任何分区也没有挂载点这正是我们要处理的盘。有的系统里lsblk没安装的话比如精简版容器可以用fdisk -l或者cat /proc/partitions来看。fdisk -l输出信息更偏向磁盘底层能看到磁盘的分区表类型像是 DOS 还是 GPT/proc/partitions则是最底层的视图只要内核识别到了块设备这里就能看到。不过日常操作我基本只用lsblk一个命令覆盖绝大多数场景而且树状结构比fdisk -l那种平铺列表直观得多。1.2 磁盘设备名的规律与识别技巧很多新人对/dev/sda、/dev/vdb、/dev/nvme0n1这套命名规则有点懵这里我简单梳理一下sd开头的是 SCSI/SATA 接口的磁盘vd是虚拟化环境KVM 等下的 virtio 磁盘nvme0n1是 NVMe 固态盘其中0是控制器序号n1是命名空间序号。后面的字母a、b、c按识别顺序递增这就是为什么有时候加了一张新盘原来的sda和sdb顺序还可能互换——设备名并不是永久固定的。这一点很关键因为很多人在开机自启动脚本里写了/dev/sdb1这种绝对设备名结果某次系统重启后发现脚本挂载错了盘甚至把系统盘给覆盖了这种事故在运维圈并不少见。正确的做法是用 UUID 来引用设备UUID 是文件系统在格式化时生成的唯一标识只要不重新格式化就不会改变。后面我写 fstab 的时候会专门讲怎么用 UUID这里先记住一个原则凡是写进配置文件里的盘一律用 UUID而不是设备名。1.3 分区还是不分区这是个问题新盘拿到手里第一个决策点就是要不要分区有的人习惯把整块盘直接格式化成文件系统用比如mkfs.ext4 /dev/vdb好处是简单直接命令少也不需要考虑分区表的问题。有的人习惯分一个区把整块盘建成一个分区vdb1再用好处是后续如果想在这个盘上再划分不同用途区域或者想调整分区大小会灵活一些。我的建议是如果是纯数据盘且规划就是整个盘作为一个存储池那直接格式化整块盘完全没问题但如果这块盘将来有扩容、缩小、拆分出其他分区的可能性那就分一个区占满整块盘。分区本质上是在磁盘上建立一层“格局”告诉文件系统这块盘的物理空间如何划分。现在的分区工具fdisk和parted都支持 GPT 分区表GPT 相比老的 MBR 最大优势是支持超过 2TB 的容量也支持最多 128 个主分区。以 CentOS/RHEL 系为例分区操作长这样$ fdisk /dev/vdb Command (m for help): n Partition number (1-128, default 1): First sector (2048-209715166, default 2048): Last sector, sectors or size{K,M,G,T,P} (2048-209715166, default 209715166): Created a new partition 1 of type Linux filesystem. Command (m for help): wfdisk进入交互界面后按n新建分区一路回车用默认值就行最后按w写入分区表。如果磁盘容量超过 2TBfdisk在某些老版本上可能不认 GPT我会改用parted来处理命令大概是parted /dev/vdb mklabel gpt然后parted /dev/vdb mkpart primary 0% 100%。2. 文件系统格式化给数据盘选一个合适的“语言”2.1 ext4、xfs、btrfs 怎么选分区只是把磁盘划分好了物理边界磁盘本身还不能直接存放文件这时候需要在分区上创建文件系统。文件系统是操作系统用来组织和管理文件的“语言规则”不同文件系统在性能、可靠性、功能支持上各有侧重。我这些年用得最多的是 ext4 和 xfs两者都有广泛的生产环境验证ext4Linux 下最成熟的文件系统之一兼容性极好CentOS 6/7 时期是默认选择。支持在线扩容、日志恢复日常用途基本不会出幺蛾子。xfsRHEL/CentOS 7 开始成为默认文件系统尤其擅长处理大文件和高并发写入ext4 在单文件超过 16TB 时会有局限而 xfs 单文件上限达到 8EB大数据场景更稳妥。btrfs功能最丰富支持快照、压缩、校验和但生产环境稳定性争议较大我一般不会在关键服务器上用它。举一个简单类比ext4 像是用了很多年的老牌国产车皮实耐用、配件好找xfs 像是日系性能车高速上稳、大货量也能拉btrfs 像是概念车功能豪华但遇到极端工况你可能要自己多上点心。具体怎么选默认建议 xfs尤其是 CentOS/RHEL 8 以上的系统很多云厂商的自定义镜像默认也是 xfs如果是跨版本兼容性要求高或者团队里没人熟悉 xfs 的命令选 ext4 完全够用。我在生产环境用 xfs 多年没遇到过 xfs 本身导致的故障。注意文件系统一旦格式化上面的所有数据都会被清空。操作前一定要再三确认设备名别一个手滑把系统盘给格式化了。2.2 mkfs 命令实操选定文件系统类型之后用mkfs系列命令完成格式化。这里以 xfs 和 ext4 各举一个例子# 格式化为 xfs $ mkfs.xfs /dev/vdb1 # 格式化为 ext4 $ mkfs.ext4 /dev/vdb1命令执行时间取决于磁盘容量和性能一块几 TB 的机械盘可能需要几分钟SSD 则快很多。格式化完成之后想验证一下文件系统是否建好用blkid查看$ blkid /dev/vdb1 /dev/vdb1: UUID3f8b9c7e-6f5e-4f2d-9e77-1f0e5a2d5a1a TYPExfs这里输出的 UUID 就是后面 fstab 里要用到的东西了。如果blkid输出为空很可能格式化没成功或者设备名写错了。有个小坑要提醒格式化之前可以先执行wipefs -a /dev/vdb1清掉设备上可能残留的文件系统或分区表签名。我有一次在回收的旧盘上直接格式化结果 mark 出来的文件系统类型识别混乱排查了半天才发现是旧的分区表签名干扰了 blkid 的判断。格式化前多敲一条清理命令能省下很多后续麻烦。3. 手动挂载与开机自动挂载把磁盘“接”进目录树3.1 临时挂载 mount 命令格式化完成后这块盘还只是一堆比特系统并没有把它接入当前可用的目录树必须通过挂载操作把它“接”到一个目录上。这个目录就是挂载点可以理解为访问这块磁盘内容的入口。先创建一个挂载点目录比如/data$ mkdir -p /data $ mount /dev/vdb1 /data挂载完成后用df -h验证$ df -h /data Filesystem Size Used Avail Use% Mounted on /dev/vdb1 100G 33M 100G 1% /data这样临时挂载就完成了。但注意这种挂载方式只在当前运行期间有效重启之后挂载关系就会丢失需要重新 mount 或者配置成开机自动挂载。如果你在执行 mount 时发现mount point /data does not exist那说明目录还没建先mkdir -p把目录创建好mount 命令本身不会自动创建目录。还有一种常见坑是挂载点目录里已经有内容了这时候 mount 并不会报错但挂载之后你通过这个目录访问到的会是新挂载盘的内容原来的文件会被临时“遮住”看着像丢了实际上只是被隐藏在了挂载点的下层。等到 umount 之后旧文件又会重新出现。所以挂载前尽量用空目录当挂载点避免这种困惑。3.2 永久挂载 /etc/fstab 的正确写法开机自动挂载需要编辑/etc/fstab文件这个文件在系统启动时会被读取里面每一行定义了一个文件系统的挂载规则。一个标准的 fstab 行有 6 个字段用空格或 Tab 分隔设备标识 挂载点 文件系统类型 挂载选项 dump 备份标志 fsck 检查顺序典型写法UUID3f8b9c7e-6f5e-4f2d-9e77-1f0e5a2d5a1a /data xfs defaults,noatime 0 0字段解读设备标识推荐写 UUID因为设备名可能变化。用blkid查到 UUID 后填进来。挂载点必须是一个已存在的目录比如/data系统启动时会自动创建挂载关系但目录本身不会自动创建所以这个目录需要提前建好。文件系统类型填xfs或ext4和格式化时选的一致。挂载选项defaults是基本选项组合包含rw读写、suid、dev、exec、auto、nouser、async。建议再加一个noatime避免每次读取文件都更新访问时间戳能降低不必要的磁盘写入对 SSD 寿命也有好处。dump是否备份一般填 0。fsck开机时是否检查磁盘根分区通常填 1其他填 2 或 0。xfs 建议填 0因为 xfs 的检查机制和 ext4 不一样。编辑完 fstab 后不要急着重启先用mount -a验证一下语法能不能通过$ mount -a如果没有任何报错再执行df -h确认挂载成功。这一步相当重要因为 fstab 一旦写错系统重启时可能卡在挂载环节直接进入紧急模式甚至无法开机。所以强烈建议修改完 fstab 后先跑一遍mount -a验证而不是直接重启机器。3.3 用 blkid 获取 UUID避免设备名漂移坑前面提到设备名可能变化这里展开说一下。在物理机上如果机器上有多个同类型硬盘Linux 内核是按识别顺序分配sda、sdb的这个顺序受驱动加载顺序、总线扫描顺序影响系统更新或硬件变动后可能改变。云服务器上如果从快照恢复了系统盘或者热插拔了数据盘设备名也可能变化。我有一次在客户现场排查问题发现某台服务器上/data挂载不上了打开fstab一看里面写的还是/dev/sdb1而实际设备已经变成了/dev/sdc1。原因是客户前阵子加了一块盘系统重新扫描后设备顺序变了。用blkid把 UUID 拿出来替换设备名问题立刻解决之后再也没犯过。获取 UUID 的标准做法$ blkid | grep vdb1 /dev/vdb1: UUID3f8b9c7e-6f5e-4f2d-9e77-1f0e5a2d5a1a TYPExfs也可以直接用blkid -s UUID -o value /dev/vdb1只输出 UUID 本身方便在脚本里赋值给变量。注意如果磁盘之前有分区表格式化后 UUID 会变化吗会的。只要执行了mkfs文件系统就被重建了UUID 也会重新生成。所以你在某个文档里记下的 UUID一旦格式化就作废了必须以blkid最新输出为准。3.4 systemd 和 fstab 的关系现代 Linux 发行版大多使用 systemd 作为 init 系统fstab 的挂载任务实际上由 systemd 的systemd-fstab-generator在启动阶段转换成 systemd mount 单元来执行的。这意味着如果你改了 fstab理论上需要重新加载 systemd 配置才能让当前会话感知$ systemctl daemon-reload不过mount -a本身会重新读取 fstab 并执行挂载所以一般做完mount -a验证之后当前会话和下次开机就都能生效了。需要讲清楚的是fstab 里如果写了noauto选项那么开机时这个分区不会被自动挂载只能手动mount。这种写法适合一些特殊场景比如加密盘、则需要用户输入密码的挂载平时不推荐。4. 常见问题与排查技巧实录4.1 设备不识别系统里根本看不到新盘检查了lsblk新磁盘完全没出现这时候大概率不是软件层面能解决的先排查硬件和驱动。物理机场景下先确认硬盘通电、数据线连接牢固SATA 口可以换个接口试试。如果是 SAS/SATA 阵列卡还要进阵列卡 BIOS 确认硬盘已经被识别并配置了 RAID 卷。我之前遇到过一块新盘在 BIOS 里能看到但 Linux 里一直没有最后发现是阵列卡后端口没有配置成直通模式操作系统层面压根接触不到这块物理盘。云服务器场景下新购的云盘如果没在lsblk里出现先检查控制台里这块盘是否已经挂载到了实例。有些云平台挂载云盘后还需要在实例内部执行热插拔扫描命令比如$ echo 1 /sys/class/scsi_disk/0:0:0:0/device/rescan不同虚拟化平台命令略有不同但思路是一致的让内核重新扫描总线识别新增设备。如果扫描了还是没有那就得考虑重启实例了重启一般能解决绝大多数“盘不识别”的问题。4.2 mount: wrong fs type 文件系统类型报错执行 mount 的时候报wrong fs type通常是挂载命令里写的文件系统类型和实际格式化的类型不一致或者系统缺少对应的文件系统驱动模块。比如格式化的是 xfs但 mount 时误写成了 ext4$ mount -t ext4 /dev/vdb1 /data mount: /data: wrong fs type, bad option, bad superblock on /dev/vdb1解决办法首先是确认实际文件系统类型blkid /dev/vdb1一查便知把-t参数改成正确的类型即可。如果是文件系统驱动没装比如想要挂载 btrfs 但系统没装 btrfs-progs需要先安装对应工具包。这种情况在精简版容器镜像里比较多见。还有一种类似报错是unknown filesystem type xfs说明内核没编译 xfs 支持或者模块没加载需要安装xfsprogs并确保内核模块xfs已加载。4.3 fstab 写错导致开机进不去系统这是新手容易踩、老手也可能翻车的问题。fstab 语法错误或者写入了不存在的设备开机时 systemd 挂载失败可能直接进入 emergency mode提示输入 root 密码。进了紧急模式先别慌执行$ mount -o remount,rw / $ vim /etc/fstab第一行的remount,rw是把根分区重新以读写方式挂载因为紧急模式下根分区默认是只读的不先执行这一步编辑 fstab 保存不了。修正错误行后重启系统即可恢复。如果连紧急模式都进不去那就需要引导进入单用户模式或者用系统安装盘进入 rescue 模式把 fstab 里的错误行注释掉。这里再次强调改完 fstab 之后先mount -a验证再重启能帮你省掉绝大部分类似的麻烦。4.4 挂载后目录什么也没有或者数据“不见了”有两种情况都会表现出“挂载后目录里没有数据”第一种本来挂载点目录里存了旧数据挂载新盘之后目录视角切到了新盘旧数据被隐藏了。这种情况不是数据丢失umount 之后旧数据还能看到。为了避免这种问题挂载前先确认目录是空的或者先把旧数据备份走。第二种挂载成功但容量对不上比如 100G 的盘只显示了 50G 的可用空间。这通常是文件系统没有扩展到整个分区或者分区本身就没用满。如果是扩容场景分区表更新后还需要执行文件系统级别的扩容命令xfs 用xfs_growfs /dataext4 用resize2fs /dev/vdb1。4.5 TB 级别大磁盘MBR 上限和 parted 分区超过 2TB 的大容量磁盘如果用 fdisk 直接分区老版本 fdisk 默认创建 MBRDOS分区表最多只能识别 2TB 的容量剩下的空间会“消失”。遇到这种情况要先用parted把磁盘分区表改成 GPT$ parted /dev/vdb (parted) mklabel gpt (parted) mkpart primary 0% 100% (parted) align-check optimal 1 (parted) print (parted) quitmkpart primary 0% 100%表示创建一个从磁盘开头到磁盘末尾的主分区覆盖整块盘。align-check optimal 1用于检查分区是否对齐对齐能保证最佳读写性能尤其是在 SSD 上不对齐会导致额外的写放大。改完分区表后用partprobe让内核重新读取分区表然后照常格式化、挂载。4.6 云盘扩容之后怎么让文件系统使用新空间云服务器给数据盘扩容是常见需求。控制台里把磁盘容量从 100G 调到 200G 之后系统里的分区和文件系统还停留在 100G 的状态需要手动扩展。具体步骤按顺序执行# 1. 确认扩容后的磁盘容量 $ lsblk # 2. 让内核重新读取分区表如果分区表已更新 $ partprobe /dev/vdb # 3. 扩展分区可以用 growpart $ growpart /dev/vdb 1 # 4. 扩展文件系统xfs 和 ext4 命令不同 $ xfs_growfs /data # 或 $ resize2fs /dev/vdb1growpart的作用是把分区扩展到磁盘末尾如果用的是 LVM 管理逻辑卷也需要扩展顺序是pvresize、lvextend、resize2fs/xfs_growfs三层都跟上。这块内容比较深涉及 LVM 的核心概念我的建议是生产环境的数据盘如果你对 LVM 不熟悉直接用裸分区就够了LVM 出错恢复的复杂度比裸分区高不少很多老运维反而不喜欢在关键业务上碰 LVM。5. 一套完整的挂载操作记录与经验速查5.1 以一块 500G 虚拟磁盘为例的完整流程假设我是从零开始处理一块新的 500G 数据盘目标挂载到/data目录用 xfs 文件系统。完整操作序列如下# 第 1 步确认设备名这里假设新盘是 /dev/vdb lsblk # 第 2 步创建分区用 fdisk 或 parted 都行 fdisk /dev/vdb # n 新建分区一路回车w 保存 # 第 3 步可选检查分区是否建立 lsblk # 预期出现 vdb1 # 第 4 步清理可能的旧签名保险起见 wipefs -a /dev/vdb1 # 第 5 步格式化 mkfs.xfs /dev/vdb1 # 第 6 步获取 UUID blkid /dev/vdb1 # 记下 UUID比如 3f8b9c7e-6f5e-4f2d-9e77-1f0e5a2d5a1a # 第 7 步创建挂载点 mkdir -p /data # 第 8 步写入 /etc/fstab # 在 /etc/fstab 末尾添加 # UUID3f8b9c7e-6f5e-4f2d-9e77-1f0e5a2d5a1a /data xfs defaults,noatime 0 0 # 第 9 步验证 fstab 并挂载 mount -a df -h /data整套流程核心就是“认盘 - 分区 - 格式化 - 挂载 - 持久化”这五步任何 Linux 发行版都大差不差。5.2 关于挂载点和目录规划的经验挂载点的选择看似简单实际上讲究不少。我见过很多新人喜欢把数据盘挂到根目录下的某个业务目录比如/home、/var/lib/mysql但这里有个问题是如果挂载点目录正好是某些服务默认的数据目录而服务启动顺序比挂载早或者挂载失败服务可能会把数据写到根分区的同名目录里导致磁盘空间被意外吃满。我的经验是除非你特别清楚自己在做什么否则不要随意把数据盘挂到系统服务默认目录。更稳妥的做法是挂到一个独立的、自建的挂载点比如/data、/store、/mnt/data然后通过软链接或者修改服务配置来指向实际数据目录。这样即使挂载失败也不会污染系统目录排查问题也更直观。另外云服务器上有一个常见做法是系统盘和数据盘分开数据盘专门存放业务数据、日志、数据库文件。这样系统盘重装系统不会影响数据盘数据安全性更高。如果你使用云平台提供的自定义镜像或者自动化脚本大概率也是类似的规划思路。5.3 运维日常与面试中常考的小知识点挂载数据盘这件事虽然基础但围绕它的知识点经常在面试和日常工作中被问到这里做一个简单汇总方便你快速回顾命令/概念作用说明lsblk查看块设备树判断是否识别到新盘fdisk/parted磁盘分区超过 2TB 用 parted 建立 GPT 分区mkfs.xfs/mkfs.ext4创建文件系统格式化会清空数据mount -a挂载 fstab 中的所有条目修改 fstab 后必须验证blkid查看文件系统 UUIDfstab 设备标识推荐用 UUIDdf -h查看磁盘使用情况验证挂载是否成功umount卸载挂载点操作前先确认没有进程占用/etc/fstab开机自动挂载配置字段分别为设备、挂载点、类型、选项、dump、fsckxfs_growfs/resize2fs扩展文件系统磁盘扩容后需要执行其中还有一个容易被笔试考到的点fstab 最后一栏 fsck 顺序根分区填 1其他数据分区建议填 2xfs 文件系统建议填 0因为 xfs 没有传统意义上的 fsck 检查机制。如果你填错了顺序比如让 xfs 分区在开机时被 fsck 检查启动过程可能会卡住或者报出误导性错误。6. 最后说点个人体会挂载数据盘这件事听起来基础但在实际生产环境中什么幺蛾子都可能遇到设备名漂移、分区表错乱、扩容后文件系统不识别、fstab 写错导致启动失败每一类我都踩过而且都是在特定场景、特定时间点突然冒出来的。所以我后来形成了一个习惯每处理一块新盘都把 blkid 输出的 UUID、挂载点、格式化参数记到服务器的文档里同时给挂载脚本里也留一份记录。这样以后盘出问题不用重新盲猜直接翻记录就能快速定位。如果你是刚开始接触 Linux 的新手建议找一台虚拟机按照这篇文章的流程完整操作一遍从添加一块虚拟硬盘开始走一遍分区、格式化、挂载、fstab 的全过程。试过之后你会发现很多概念像“分区表”“文件系统”“挂载点”瞬间就立体起来了比背十遍命令都管用。另外遇到挂载相关的问题真的别急着去重装系统先冷静地把 lsblk、blkid、df -h 三个命令的输出拿出来对照分析多半问题就能浮出水面。这三个命令就是挂载问题排查三板斧用好它们Linux 磁盘问题大概率难不倒你。