ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

CentOS数据盘挂载全攻略:从识别分区到自动挂载实战

CentOS数据盘挂载全攻略:从识别分区到自动挂载实战 很多刚接触Linux服务器的朋友最容易遇到的一个情况就是系统装好了CentOS也跑起来了但买的那块数据盘却怎么也看不到。问身边人对方甩你一句“挂载一下就好了”然后你对着终端一脸茫然——挂载是什么怎么挂为什么我df -h里看不到这篇文章就围绕“CentOS系统开通后数据盘如何挂载”这一个问题展开把从识别硬盘到分区、格式化、挂载、设置开机自动挂载的完整流程拆开揉碎讲清楚。我用的环境是CentOS 7但CentOS 8、Rocky Linux、AlmaLinux这些后续版本操作几乎一模一样命令都是通用的。无论你是刚买了一台云服务器还是自己组装的物理机只要想往系统里加一块数据盘这篇文章都能帮你少走很多弯路。先说一下我自己的经历。早年我给人装服务器加了块新硬盘进系统后df -h里看不到以为硬盘是坏的折腾了半天才想起来没分区没格式化。从那以后我就养成了一个习惯新盘到手先别急着操作按识别、分区、格式化、挂载四步走一步都不能跳。1. 内容整体设计与思路拆解1.1 为什么要单独挂载数据盘很多人不理解数据盘插上去系统为什么不自动识别这里要先搞清楚一个概念系统盘和数据盘在Linux里的角色是不一样的。系统盘用来安装操作系统启动引导程序固定从这块盘读取数据盘纯粹用来存数据比如网站文件、数据库备份、日志、用户上传的内容等等。CentOS默认只会把系统盘和它上面的分区自动挂载到根目录、/boot这些位置。数据盘插上去之后Linux内核确实能识别到这块硬件设备但不会自动为你创建文件系统也不会自动挂载到某个目录。它只是把这块盘当作一个裸设备等着你决定怎么用。这就像你买了一个空柜子回家它能被“看到”硬件识别但里面的隔层怎么分、能放什么东西都要你自己安排。把数据单独放到数据盘还有一个实际好处系统盘出问题要重装系统时只要数据盘不格式化数据就能完整保留下来。系统盘坏了换一块新盘重装系统再把数据盘挂回去数据都还在。这也解释了为什么生产环境中强烈建议把重要数据放在数据盘而不是系统盘。1.2 整个挂载流程的总体脉络拿到一块新数据盘完整的处理流程可以概括为五个环节环节目的常用命令识别硬盘确认系统能否看到新硬盘及设备名lsblk、fdisk -l创建分区给裸设备划分存储空间区域fdisk、parted格式化文件系统在分区上建立文件系统ext4/xfs等mkfs.ext4、mkfs.xfs临时挂载把分区关联到系统的某个目录mount持久化配置重启后依然自动挂载编辑/etc/fstab实际工作中我的经验是先把“识别”这一步做扎实因为后面所有操作都建立在正确的设备名基础上。如果设备名看错了格式化错盘那是灾难。1.3 方案选型分区还是直接整盘格式化关于是否分区实际操作中存在两种流派一种是用fdisk先把整块盘分成一个或多个分区然后在分区上建文件系统另一种是直接在整块裸盘上建文件系统比如mkfs.xfs /dev/sdb跳过分区环节。我的建议是如果你确定这块盘将来就作为一个独立的存储空间使用不再做多分区规划那么直接整盘格式化没问题。但如果你有后续扩容、多分区或者调整结构的计划规规矩矩创建分区更稳妥。生产环境里我一般都会创建分区因为分区表的存在让后续的运维操作比如用LVM做逻辑卷管理留出了余地。2. 核心细节解析与实操要点2.1 如何判断数据盘是否被系统识别新硬盘接入系统后第一步就是确认设备名。lsblk是我最常用的命令它能把系统中的块设备关系树状显示出来一眼就能看出新增的盘。lsblk输出大概长这样NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 40G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 39G 0 part / sdb 8:16 0 100G 0 disksd开头的是SCSI/SATA/虚拟磁盘设备后面的字母按照检测顺序排列sda是第一块盘sdb是第二块盘以此类推。sdb下面没有子块说明这块盘目前是裸状态还没分区。这就是我们要处理的数据盘。还有一个命令是fdisk -l它能显示更详细的设备信息包括磁盘扇区大小、总容量、分区表类型等。注意fdisk -l在部分系统上需要用sudo执行否则看不到完整信息。提示有些云平台比如阿里云、腾讯云挂载数据盘后设备名可能是vdb、vdc虚拟化环境下磁盘类型不同设备名也会不同。判断原则不变找出那块没有分区的、容量与数据盘吻合的设备。2.2 设备名和分区名的对应关系这里特别说一个新手容易绕晕的地方/dev/sdb是整个磁盘设备/dev/sdb1是这块磁盘上的第一个分区。你最终挂载的是分区不是磁盘。打个比方/dev/sdb是一整栋楼/dev/sdb1是楼里的第一家住户。你要找到这家人的地址得写“1栋”还是“1栋101”当然是后者。挂载也一样操作对象必须是分区名。在使用fdisk给/dev/sdb创建分区后系统会生成一个/dev/sdb1。如果你跳过分区直接在整块盘上格式化那么就没有/dev/sdb1这个概念挂载时写的是/dev/sdb。两种方式的挂载命令有差别别搞混。2.3 常见文件系统的选择格式化就是在分区上创建文件系统CentOS系统里最常见的两个选择是xfs和ext4此外还有ext3、btrfs等。文件系统适用场景特点xfsCentOS 7/8默认系统文件系统适合大文件、高并发扩容方便但缩容困难ext4通用型方案兼容性极好功能均衡支持在线扩容适合中小数据量btrfs高级存储管理需求支持快照、压缩、自检但对运维能力要求更高我的建议很简单没有特殊需求就跟着系统默认走。CentOS 7默认是xfsCentOS 6时代默认是ext4。如果你不确定用哪个选ext4基本不会出错它的生态成熟文档多踩坑的机会少。如果你用的是CentOS 7及以上版本直接选xfs也完全没问题两者在常规业务场景下的性能差异普通用户根本感知不到。3. 实操过程与核心环节实现3.1 步骤一用lsblk确认数据盘状态开始前先检查一下当前系统的磁盘情况。lsblk如果数据盘已经接入你会看到一个无分区的设备。比如上一节示例里的/dev/sdb大小为100G没有子设备没有挂载点。此时确认这个设备名后就可以进行下一步。这里多提一句如果lsblk里看不到你新加的盘先别急。可能原因有几种服务器还没识别到热插拔设备试试重启或者重新扫描SCSI总线云服务器在控制台挂盘后通常需要重启才能生效物理机的话检查一下数据线和电源线是否接好虚拟机的话确认宿主机是否正确把磁盘附加给了这个虚拟机。不要一上来就怀疑盘坏了。3.2 步骤二用fdisk给数据盘创建分区我对新手的要求是分区操作一律用fdisk它交互式提示清晰风险小。sudo fdisk /dev/sdb然后按提示操作Welcome to fdisk (util-linux 2.23.2). Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): 1 First sector (2048-209715199, default 2048): 回车 Using default value 2048 Last sector, sectors or size{K,M,G} (2048-209715199, default 209715199): 回车 Using default value 209715199 Partition 1 of type Linux and of size 100 GiB is set Command (m for help): w The partition table has been altered!这段操作的核心逻辑是n创建新分区p选择主分区分区号默认1起始扇区默认2048这是现代磁盘对齐惯例为了性能最佳结束扇区直接回车表示使用全部剩余空间。最后w保存并退出。这个w很关键如果你输入q那就是不保存退出刚才的所有操作全部作废。注意如果数据盘超过2TBfdisk可能无法正确处理GPT分区表这时候改用parted工具用mklabel gpt创建GPT分区表再创建分区。这是一个比较容易踩的坑。3.3 步骤三格式化文件系统分区创建成功后用lsblk确认是否生成了/dev/sdb1。然后执行格式化sudo mkfs.xfs /dev/sdb1如果你选择ext4则用sudo mkfs.ext4 /dev/sdb1格式化完成后会输出类似下面的信息meta-data/dev/sdb1 isize512 agcount4, agsize6553344 blks sectsz512 attr2, projid64bit data bsize4096 blocks26213376, imaxpct25不需要看懂所有字段只要没有报错就说明格式化成功。这里顺便解释一下mkfs的含义它是“make filesystem”的缩写本质上是在分区上写入文件系统的元数据结构好比给新房子的空房间里安装隔断和储物架决定你能怎么用这个空间。3.4 步骤四创建挂载点并挂载挂载点就是一个空目录数据盘会“变成”这个目录的内容。习惯上我们把它放在/data或者/mnt下面。我自己习惯用/data业务数据统一放这个目录方便管理。sudo mkdir -p /data sudo mount /dev/sdb1 /data执行完mount后立刻用df -h验证df -h输出结果里应该出现Filesystem Size Used Avail Use% Mounted on /dev/sdb1 99G 33M 99G 1% /data看到这个说明挂载成功数据盘已经可以正常使用了。你可以往/data下写文件测试一下echo hello, this is a test file /data/test.txt cat /data/test.txt写进去还能读出来说明读写链路是通的。3.5 步骤五配置开机自动挂载如果你以为挂载完就万事大吉了那就错了。mount命令只是“临时挂载”重启之后挂载关系就会丢失数据盘又会变成未挂载状态。要让系统开机后自动挂载需要配置/etc/fstab文件。先用blkid查看分区的UUIDsudo blkid /dev/sdb1输出类似/dev/sdb1: UUID16f7c6c6-4c5e-4a24-8c35-3d3a1e5a4d4e TYPExfs然后用你熟悉的编辑器编辑/etc/fstabsudo vim /etc/fstab在文件末尾添加一行UUID16f7c6c6-4c5e-4a24-8c35-3d3a1e5a4d4e /data xfs defaults 0 0这一行的含义从左到右分别是设备标识UUID、挂载点、文件系统类型、挂载参数、是否备份0表示不备份、是否开机自检0表示不检查。这里强烈建议用UUID而不是直接写/dev/sdb1因为设备名在重启后可能会发生漂移比如之前是sdb之后变成sdc但UUID是唯一的、稳定的不会变。这是在真实生产环境里踩过坑之后总结出来的经验。配置保存之后别忘了验证一下配置是否正确sudo mount -a这个命令会按照/etc/fstab中的配置重新执行挂载。如果没有报错说明配置没问题。如果报错了别重启先检查语法和UUID是否写错。一个有效的小技巧是故意卸载后再执行mount -a验证确保万无一失sudo umount /data sudo mount -a df -h如果df -h能看到/data挂载说明开机自动挂载配置生效。4. 常见问题与排查技巧实录4.1 报错wrong fs type, bad option, bad superblock这是挂载时最常见的一条报错完整信息通常是mount: wrong fs type, bad option, bad superblock on /dev/sdb1, missing codepage or helper program, or other error这个错误看着吓人但实际原因大多数情况下非常简单你还没有格式化这个分区或者格式化用的文件系统类型与mount命令指定的类型不一致。排查思路用lsblk -f查看分区的文件系统类型。FSTYPE一列为空说明没格式化显示为xfs那挂载时就要用mount -t xfs。确认命令没有写错设备名比如把/dev/sdb1写成了/dev/sdb整块盘没有格式化时也会触发类似报错。检查/etc/fstab配置中文件系统类型是否与实际一致。这个报错在配置fstab后重启时也会出现经常导致系统直接进入emergency mode。所以再次强调修改完/etc/fstab一定要执行mount -a验证。4.2 报错特殊设备不存在 或 设备没有发现mount: special device /dev/sdb1 does not exist这个提示十有八九是分区没创建成功。执行lsblk看一下如果没有/dev/sdb1这个设备说明分区表没写入或者创建完分区之后没有执行w保存。解决办法也很直接重新执行fdisk /dev/sdb创建分区后记得w保存退出。4.3 如何扩容已有的数据盘关于扩容分两种情况说。如果数据盘是用LVM管理的扩容比较简单lvextend和xfs_growfs或resize2fs配合使用即可。这个属于进阶操作这里先不展开大家知道有这套工具即可。如果是云服务器直接在控制台扩容了云盘比如从100G扩到200G分区表还是原来的大小你需要让分区和文件系统都跟着变大。步骤大致是先确认内核识别到新容量可能需要重启或扫描设备然后fdisk /dev/sdb删除原分区后用相同起始扇区重建分区注意数据不会丢但操作风险极高必须做好备份再用xfs_growfs /data或resize2fs /dev/sdb1扩展文件系统。注意扩容操作在生产环境需要格外谨慎。除非你非常熟悉整个过程否则建议在操作前做快照云服务器或完整备份物理机。尤其是fdisk下删除分区的操作一个扇区选错就可能毁掉整块盘的数据。4.4 挂载后发现数据盘变只读有时候挂载成功但往里面写数据提示Read-only file system。大概率是文件系统检测到异常进入了只读保护状态也可能是因为磁盘硬件错误或者之前没有正常卸载。用dmesg | tail看看系统日志有没有硬件错误提示。如果是文件系统状态问题尝试卸载后重新挂载或者用fsck检查修复注意fsck必须在卸载状态下执行生产环境慎用。4.5 开机后进入emergency mode原因就是fstab写错了这是fstab配置错误导致的典型故障。挂载配置写错后系统开机挂载失败会跳入emergency mode紧急模式很多新手在这一步就被吓住了。处理思路在emergency mode提示符下输入root密码登录。执行mount -o remount,rw /把根文件系统重新挂载为可读写。用vim /etc/fstab修正错误配置检查UUID、挂载点、文件系统类型。执行mount -a验证通过后reboot重启。这套流程我经历过不止一次记住三步remount根目录、改fstab、mount -a验证。4.6 数据盘挂载前后设备名变了之前说过设备名可能漂移。比如你重启后发现之前挂载好的盘访问不了了df -h里没有lsblk一看原来/dev/sdb变成了/dev/sdc。原因可能是系统启动时设备名分配顺序变化了。解决方案就是我在fstab部分反复强调的使用UUID而不是设备名。UUID不会变只要/etc/fstab里用的是UUID这种问题就基本不会出现。4.7 卸载磁盘时提示target is busy想卸载数据盘却提示umount: /data: target is busy说明有进程正在使用/data目录下的文件。用lsof或者fuser找出是谁占用lsof /data fuser -mv /data确认占用进程后要么等它结束要么用kill结束进程再执行umount。如果实在着急可以用umount -l强制延迟卸载但生产环境不建议可能造成数据损坏。5. 有条件时还可以做的优化5.1 修改挂载参数提升性能/etc/fstab挂载参数不只是defaults一种选择根据不同业务场景可以加参数。xfs文件系统下比较实用的是noatime和nodiratime作用是让系统不再记录文件访问时间减少不必要的写盘操作对数据库和日志类应用有一定性能提升。写法如下UUID16f7c6c6-4c5e-4a24-8c35-3d3a1e5a4d4e /data xfs defaults,noatime,nodiratime 0 05.2 使用LVM管理数据盘如果数据盘以后可能会频繁扩容、缩容或者跨越多个磁盘做存储池我建议直接上LVM。LVM的全称是Logical Volume Manager逻辑卷管理它像一层代理让你操作的是“逻辑卷”而不是物理磁盘分区扩缩容灵活得多。LVM的基本架构是物理卷PV→ 卷组VG→ 逻辑卷LV。相当于你把几块物理硬盘合并成一个大的“硬盘池”再从这个池里切出一个个“逻辑硬盘”。后续加新盘进池子、扩容逻辑卷都是在线操作。LVM的搭建步骤大概是sudo pvcreate /dev/sdb sudo vgcreate vg_data /dev/sdb sudo lvcreate -l 100%FREE -n lv_data vg_data sudo mkfs.xfs /dev/vg_data/lv_data sudo mount /dev/vg_data/lv_data /data这套方案在生成环境尤其常用因为数据盘扩容不用停机在线就能完成。不过LVM也有自己的麻烦比如内核崩溃时可能丢失卷组信息所以还是一句话正规备份不能省。5.3 软链接来整合数据盘和业务目录有朋友会遇到这种情况业务程序死活要求数据必须放在/var/lib/mysql可你不想把数据盘挂载到这个目录里或者/var/lib/mysql已经有系统文件了。这时候可以直接把业务目录挂到数据盘上然后把原目录拷过去之后搬家。或者用软链接的方式把数据盘挂载到/data然后在/var/lib/mysql创建软链接指向/data/mysql。不过我个人不太推荐在生产环境用软链接处理这类问题直接在fstab里把数据盘挂载到业务需要的目标目录更清爽也少一层间接跳转。6. 一个完整实例带你看全流程为了加深理解我把从零开始的完整操作串一遍你照着敲就行。场景CentOS 7系统新增一块100G数据盘设备名/dev/sdb我要将它挂载到/data目录文件系统用xfs。# 1. 查看磁盘状态 lsblk # 2. 给/dev/sdb创建分区 sudo fdisk /dev/sdb # 依次输入n - p - 回车 - 回车 - w # 3. 确认分区生成 lsblk # 应该看到 /dev/sdb1 # 4. 格式化 sudo mkfs.xfs /dev/sdb1 # 5. 创建挂载点并挂载 sudo mkdir -p /data sudo mount /dev/sdb1 /data # 6. 查看挂载结果 df -h # 7. 获取UUID sudo blkid /dev/sdb1 # 8. 写入fstab sudo vim /etc/fstab # 添加UUID上一步得到的UUID /data xfs defaults 0 0 # 9. 验证fstab配置 sudo mount -a # 10. 测试读写 echo test /data/test.txt cat /data/test.txt第9步是最关键的验证步骤。很多人写错fstab之后直接重启结果系统起不来其实一条mount -a就能提前发现问题。7. 操作心得与经验总结最后说几句实在话。数据盘挂载本身不是一个高难度技术栈但它非常考验一个人的细心程度。设备名看错、分区忘记保存、fstab写错、挂载点没建任何一个环节出问题都可能导致数据盘无法正常使用严重的还能把系统搞挂。我的经验是每个命令执行完用lsblk和df -h确认一下结果不要一股脑敲到最后再回头看。关于fstab我再说一次能用UUID就不要用设备名写完必须mount -a验证。这两条做到位至少能避免80%的挂载故障。关于数据安全不管你是格式化新盘还是扩容旧盘备份永远放在第一位。我遇到过不少用户扩展分区时一个操作失误整个数据盘一夜回到解放前。服务器的数据是无价的备份的时间成本完全可以接受。如果你的CentOS版本是8或以上或者用的是Rocky Linux、AlmaLinux这些RHEL系发行版这套流程依然适用命令几乎不需要改动。如果用的是Debian/Ubuntu文件系统管理思路也一样只是安装工具和部分命令细节有差异基本原理通用。数据盘挂载这个技能你花一次时间学会之后的每一次服务器部署、扩容、故障排查都用得上。把它当作Linux服务器入门的第一课不亏。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进