☰
Linux新硬盘挂载实战:从分区格式化到fstab开机自动挂载
2026/10/15 4:47:17 网站建设 项目流程

新机器硬盘挂载,说到底就是把一块还没初始化的磁盘,变成系统里一个能读写的目录。这个动作我在物理服务器、云主机、自己组装的NAS上都做过,命令来来去去就那几条,但真正踩过坑才会明白,每一个步骤都有值得注意的细节。这篇文章按我实际的干活顺序来写:先查盘,再分区格式化,然后临时挂载验证,最后写进fstab做开机自动挂载,再补上几个高频故障的处理办法。如果你刚接触Linux运维,可以当成一篇完整的操作手册;如果你已经有经验,重点看下nofail参数、4K对齐、UUID防漂移这几个点,可能能帮你少踩几个坑。

1. 先搞清楚要做什么:挂载不是格式化就完事

1.1 第一步不是格式化,是给机器做"体检"

拿到新机器,系统装好登录进去,第一步不是急着格式化,而是先给机器做个体检。我见过不少人上来就fdisk -l、mkfs,折腾半天发现操作的其实不是目标盘。体检用两条命令就够了:lsblk和df -h。lsblk列出所有块设备,df -h列出已经挂载的文件系统。通常lsblk里能看到一块几十G到几T的裸盘,没有分区,也没有挂载点,而df -h里完全没有它的影子——这正是我们要处理的那块盘。

这里有个容易误解的点:df看不到不等于盘不存在。裸盘没有文件系统,df自然统计不到。用lsblk看到TYPE那一列是disk的,就是物理盘;下面如果还没有part分区项,说明整块盘还是未分区状态。如果是云主机,设备名通常是vda/vdb;物理服务器通常是sda/sdb,NVMe则是nvme0n1、nvme1n1一类的名字。看到这些名字心里就有数了。现在不少发行版已经全面使用新命名规则,SATA盘的名字也可能不是sda而是别的,但lsblk输出列的含义不变,按TYPE和SIZE来认设备最稳。

1.2 设备名会变,别只记 /dev/sdb

设备名的问题值得多说两句。Linux给磁盘的命名是检测顺序决定的,sda、sdb并不是固定在某个物理槽位上的。同一个机器重启之后,因为PCIe枚举、驱动加载顺序的变化,sdb和sdc有可能互换,这在老一些的内核和某些主板上并不少见。云环境里更热闹,有时磁盘热插拔之后名字会整体往后挪。所以,凡是需要长期引用的地方,都不要写死/dev/sdb这样的路径。

那没格式化的新盘怎么区分?靠型号和序列号。执行ls -l /dev/disk/by-id/,能看到一串包含厂商型号和序列号的链接,比如wwn-0x5000c500xxxx、ata-XXXX这些。这些标识是硬盘出厂固化的,比设备名可靠得多。操作前记下目标盘的容量和序列号,到真正格式化的时候再核对一次,能避免很多悲剧。

1.3 要不要分区:两种场景两种做法

接下来就要回答一个新手常问的问题:这块盘要不要分区?答案取决于用途。云服务器上单独购买的数据盘,如果整块盘都用来做数据存储,我一般不分区,直接在整块盘上建立文件系统。云盘的存储管理在底层已经处理好了,再分一个全区块的分区没有太大意义,命令还能少一步。

物理服务器的独立数据盘,情况相反,我建议先分区再用分区。原因有三个:一是很多备份软件、迁移工具默认期望看到分区表,裸文件系统有时候不认;二是分区可以把引导、数据、交换区域分开,即使当前这块盘只做数据盘,后续要调整用途也方便;三是一旦盘需要跨机器迁移,带标准分区表的盘兼容性更好。如果你的盘要装系统,那更不用说了,必须先分区。

另外提一句,如果以后有做LVM动态扩容的打算,可以在分区阶段就规划好LVM物理卷,这块我不展开,但记在心里,别把分区方案定死就行。

2. 核心细节解析:分区表、文件系统与挂载目录

2.1 分区表选型:GPT 和 MBR 怎么选

分区表选型,新机器我基本无脑选GPT,只有极少数老平台才需要MBR。MBR是九十年代的设计,硬顶就是2TB容量、4个主分区,现在一块机械盘都轻松超过2TB,MBR已经不够用了。GPT没有这两个限制,默认支持128个分区,单分区容量上限大到了现实里用不到的程度,而且GPT在磁盘头和尾各存一份分区表,抗损坏能力还强一些。

分区工具上,fdisk能用,但交互式操作容易手滑,parted可以在命令行里直接指定所有参数,更适合写进脚本和文档。还要强烈建议一点:分区起始位置从1MiB开始,而不是从0开始。原因是现代硬盘的物理扇区是4K,如果分区起始位置不在物理扇区边界上,读写会触发读改写放大,性能掉得厉害。从1MiB开始天然对齐,机械盘、固态盘都适用。

2.2 文件系统:XFS、EXT4 还是别的

文件系统的选择,我见过太多人卡在这里来回纠结。直接给结论:XFS和EXT4都可以,二选一完全能满足绝大部分服务器场景。

文件系统适合场景扩容缩容备注
XFS大文件、高并发写入支持在线扩容不支持RHEL系默认,适合数据仓库、归档
EXT4通用、兼容性优先支持支持老牌稳定,小文件表现好
Btrfs需要快照、校验和的特殊需求支持支持功能多但操作复杂,生产环境慎选

XFS是RHEL系发行版的默认选型,适合大文件、高并发写入,在线扩容很方便,xfs_growfs就能扩大;缺点是没办法缩容。EXT4是最稳妥的老牌选择,兼容性最好,小文件表现稳定。Btrfs功能多但坑也多,生产环境我一般不上。拿不定主意就选EXT4,系统默认XFS就跟着用XFS,怎么选都不会错。

格式化本身有个优化点值得说。mkfs.ext4默认会保留5%的块给root,目的是防止文件系统碎片化导致写不进,同时给管理员留紧急空间。对几T的数据盘来说,5%意味着几百GB白白空着,实际数据盘没必要留这么多,把-m参数调到1%甚至0%都是常见的。我一般用mkfs.ext4 -m 1,既保留了root专用空间,又不会浪费太多容量。XFS没有这个保留比例的概念,默认参数直接用就行。

2.3 挂载点规划和临时挂载的讲究

挂载点就是一个空目录,把文件系统"接"到这个目录上之后,往目录里写文件就是往盘里写。挂载点命名建议直观一点:/data、/backup、/srv/data都比随便挂到某个角落要好。创建目录用mkdir -p,确保路径存在。

注意,mount是临时的,重启就没了。而且有个很迷惑人的行为:如果把盘挂到一个非空目录上,目录原来的文件并不会消失,而是被挂载点整个挡住了,看起来好像丢了。恢复的方法是先卸载,文件会重新出现。如果你确实要用数据盘替换某个目录,正确流程是先挂到临时目录、拷贝数据、再挂正式目录,后面第五章会展开讲。

临时挂载的命令很简单:mount /dev/sdb1 /data。文件系统类型系统一般能自动识别,也可以加点参数指定。挂载完用df -hT确认一下文件系统类型和挂载点,确认无误后再往下走。

2.4 格式化前,最后确认一遍

分区和格式化这两个动作是不可逆的,尤其mkfs,执行前一定要再三确认。我的建议是格式化之前先做三件事:lsblk看盘符,blkid看这块盘上有没有现成文件系统,fdisk -l再看一眼容量和型号。如果盘上已经有UUID或者有分区,说明它不是全新盘,再次格式化之前必须想明白为什么。

还有一个铁律:绝对不要对已经挂载的文件系统做格式化。内核通常会拒绝,但某些情况下仍可能造成严重损坏。新机器一般不会遇到,但一旦是热插拔或共享存储场景,操作前先确认没有进程在访问这块盘,拿不准就先umount再动手。

3. 实操过程记录:从裸盘到正常读写

3.1 动手前必须做的三项确认

下面用一台实际机器走一遍完整流程。假设一台物理服务器,系统盘sda已经装好系统,现在要挂两块数据盘:一块2TB的sdb,计划挂到/data;一块4TB的sdc,计划挂到/backup。

动手前,我先执行一次lsblk和blkid,把当前设备状态记到笔记里。lsblk确认盘存在,blkid确认没有文件系统。再fdisk -l核对一下容量,和标签上的容量对得上才继续。这一步麻烦,但值得。

3.2 完整命令走一遍:分区、格式化、挂载

先给两块盘建GPT分区表。parted -s /dev/sdb mklabel gpt,然后mkpart创建分区,起始位置1MiB,结束位置100%。sdc同样处理。

parted -s /dev/sdb mklabel gpt parted -s /dev/sdb mkpart primary xfs 1MiB 100% parted -s /dev/sdc mklabel gpt parted -s /dev/sdc mkpart primary ext4 1MiB 100% partprobe /dev/sdb partprobe /dev/sdc

命令的意思是:mklabel gpt生成GPT分区表,mkpart创建主分区,从1MiB到100%结尾。mkpart后面的xfs和ext4只是分区类型标签,真正决定文件系统的是后面的mkfs命令。partprobe用来通知内核重新读取分区表,避免分区建完了系统还没反应过来。

分区完成后,分别格式化:

mkfs.xfs -f /dev/sdb1 mkfs.ext4 -F -m 1 /dev/sdc1

sdb1用XFS,sdc1用EXT4,同时把默认5%的保留空间降到1%。格式化过程很快,完成后会用一行输出告知UUID和块大小,留意记下来。

创建挂载点并临时挂载:

mkdir -p /data /backup mount /dev/sdb1 /data mount /dev/sdc1 /backup df -hT

df -hT的输出里应该能看到xfs和ext4各一行,挂载点分别指向/data和/backup。此时盘已经能读写,但只是临时状态,重启后会消失。永久挂载的事情放到第四章处理。

3.3 用 dd 和 fio 验证真实性能

临时挂载完成后,我习惯先做一个简单性能验证,确认这块盘的读写速度没有严重偏离预期。最朴素的方法是dd,跳过缓存直接测物理读写速度:

time dd if=/dev/zero of=/data/testfile bs=1M count=1024 oflag=direct time dd if=/data/testfile of=/dev/null bs=1M count=1024 iflag=direct

第一条往盘里写1GB,如果磁盘缓存挡在前面,数据会先落在内存里,速度虚高,所以用oflag=direct绕过缓存。第二条读1GB,同理用iflag=direct。机械盘一般能到100-200MB/s,SATA固态能到400-500MB/s,NVMe能上GB/s。如果速度差得太离谱,就要看看线缆、接口、阵列卡配置了。

想更严谨一点可以用fio做随机读写测试,命令长一点但参数都是一一对应的:

fio --name=randwrite --filename=/data/fio_test --ioengine=libaio --direct=1 \ --rw=randwrite --bs=4k --size=1G --iodepth=32 --runtime=30 --group_reporting

这条命令模拟4K随机写,持续30秒,主要看iops和延迟。测试完记得删掉测试文件:rm -f /data/testfile /data/fio_test,别让测试数据占着盘。

3.4 顺手把属主和权限设好

挂载点创建出来默认属主是root,权限是755。如果这台机器上的业务以普通用户身份跑,应用写/data时很可能报Permission denied。所以挂载完直接设置属主和权限:

chown -R appuser:appgroup /data chown -R backupuser:backupgroup /backup chmod 750 /data chmod 750 /backup

这一步很多人会忘,等应用跑起来才发现没权限,再回头排查。新机器初始化的时候顺手做了,后面省心很多。

4. 永久挂载:一劳永逸的 fstab 配置

4.1 为什么重启后盘会丢

mount是临时挂载,重启之后系统不会记住。Linux启动时只有根文件系统和一些系统必须的挂载点会被自动处理,其他分区想开机自动挂载,必须写进/etc/fstab。fstab全称就是file systems table,系统读它来决定挂哪些盘、用什么选项挂。很多人只做完前面第三步就以为大功告成,结果一旦重启,数据盘上的内容明明还在,系统里却找不到了,原因就在这里。

4.2 fstab 六个字段逐个拆

fstab每一行六个字段,顺序不能乱:设备标识、挂载点、文件系统类型、挂载选项、dump备份标志、fsck检查顺序。下面这行是典型例子:

UUID=8f2d4c5e-3a18-4b7d-9c62-ef4d2c1a3b2f /data xfs defaults,noatime 0 2
字段示例值含义
设备标识UUID=xxxx用UUID或设备路径指定哪块盘
挂载点/data要挂载到的目录
文件系统类型xfs必须和实际格式化一致
挂载选项defaults,noatime可选多个,用逗号分隔
dump备份标志00表示不备份
fsck检查顺序20不检查,1根分区先检查,2其他分区后检查

前四个字段不用解释,说下后面两个经常被忽略的。第5个字段dump,0表示不使用dump备份。第6个字段fsck,0表示开机不检查文件系统,1表示根分区先检查,2表示其他分区后检查。普通数据盘写0或2都可以,我习惯写2,让系统启动时顺便做一致性检查。

挂载选项里,defaults是rw、suid、dev、exec、auto、nouser、async这些默认项的总和。noatime表示不记录文件访问时间,对大部分数据盘来说能减少写IO,值得加上。如果你的应用需要精确知道文件访问时间,那就老老实实用defaults。

4.3 用 UUID 代替设备名,防盘符漂移

设备标识这里,强烈建议用UUID而不是/dev/sdb1这种写法。UUID是文件系统在创建时生成的一串全局唯一标识,写入文件系统超级块,不依赖设备名。设备名可能因为重启、插拔而改变,UUID不会。获取方法很简单:

blkid /dev/sdb1 /dev/sdc1

输出里能看到每块分区的UUID,复制到fstab里对应位置即可。云主机上有些盘没有格式化就没有UUID,但我们的盘已经格式化过了,一定会有。把UUID写进fstab还有一个好处,跟盘序彻底解耦,就算系统重启后sdb变成了sdc,挂载结果依然准确。

除了UUID,还要考虑一个问题:如果某块盘临时拔走了,或者云平台那边卸载了,没加保护的话,开机会因为fstab里找不到这个设备而卡在紧急模式。解决办法是在挂载选项里加上nofail,意思是设备不存在就跳过,不阻塞启动。对于可插拔的外部盘和云盘,nofail几乎必加;对服务器的固定数据盘,加了也无妨,只是晚一点发现问题。配合nofail,还可以加x-systemd.device-timeout=30s控制设备等待超时时间,但不是必须,知道有这个选项就行。

4.4 改完 fstab,必须 mount -a 验证

改完fstab最关键的一步:验证。直接执行mount -a,这个命令会读取fstab,把所有还没挂载的文件系统都挂载一遍。如果fstab有语法错误、UUID写错、类型不对,这里就会立刻报错,趁系统还能正常启动,赶紧把错误改掉。

如果一切顺利,mount -a不会有输出。确认没问题之后,我建议顺手systemctl daemon-reload一下,让systemd重新读取配置,避免重复挂载的告警。有条件的话直接reboot一次,验证开机自动挂载真正可靠。很多问题的确认方法就是重启,与其等业务重启时发现,不如现在主动重启验证。

5. 常见问题与排查技巧实录

5.1 重启后进紧急模式,不要慌

线上最容易碰到的挂载故障,就是重启之后系统进入了emergency mode。屏幕上通常显示一段欢迎信息,告诉你登录后处理,输入root密码回车,系统会给你一个维护shell。

进去第一件事执行mount -a,它会告诉你哪一行失败了。如果报special device /dev/sdb1 does not exist,说明fstab里的设备标识找不到,可能是UUID写错,也可能是这块盘本来就没接入。如果报wrong fs type,说明文件系统类型写错,查一下blkid输出再改。找到问题行,用vim把错误行注释掉或改对,然后mount -a再验证一次,没问题就reboot。

顺带提醒一下,如果fstab里加了nofail,系统通常不会卡emergency mode,而是直接跳过这个挂载项,可能业务运行几天之后你才发现某块盘没挂上。所以nofail是防启动失败的双刃剑,配置了它,日常巡检就更不能少。

5.2 系统里看不到新盘

另一个高频问题:云平台明明已经把数据盘挂到了机器上,系统里lsblk却看不到。这通常是因为虚拟机热插拔设备之后,内核没有主动扫描新硬件。手工触发一次SCSI总线扫描:

for host in /sys/class/scsi_host/host*; do echo "- - -" > "$host/scan"; done

命令里的三个短横线分别代表channel、target、lun三个参数,写成空值就是让内核自动探测新设备。执行完再lsblk,盘大概率就出现了。如果你用的是云平台,有些情况下还需要去控制台确认这块盘确实已经挂载到了对应的实例上,而不是挂到别的机器去了。物理服务器如果系统里看不到盘,先确认RAID卡里有没有把新盘配置成虚拟磁盘,或者检查HBA模式、背板槽位、线缆是否插紧,这几个环节漏掉任何一个,系统都不可能识别出新盘。

5.3 挂载到非空目录,原有数据"消失"了

挂载到非空目录引起"数据消失"的案例我见过好几次,处理方式其实很简单。假如/backup原本放着一堆文件,你把新盘直接mount上去,访问/backup看到的全是新盘内容,原来的文件像人间蒸发一样。这是Linux挂载机制的正常表现——原目录被挂载点遮挡了,不是被删除。

正确做法是先把原目录内容搬到新盘里。步骤是先建一个临时挂载点,比如/mnt/newbackup,把新盘挂上去;然后用rsync把原目录内容同步过去:rsync -av /backup/ /mnt/newbackup/。同步完成核对一下文件数和大小,确认无误后,把原/backup下内容移走或清空,再umount临时挂载点,把新盘正式挂到/backup。整个过程不丢数据,也不会有遮蔽问题。

5.4 文件系统异常与磁盘健康检查

挂载成功后还要关注盘本身健康。如果某天应用写文件报Read-only file system,dmesg里刷出一堆I/O error,多半是文件系统出了问题。处理原则是先停掉应用、卸载挂载点,再做检查和修复。

ext4文件系统用e2fsck -f /dev/sdc1,xfs文件系统用xfs_repair -n /dev/sdb1做只读检查,需要修复时去掉-n执行。修复前记得先备份,文件系统修复工具不是万能的,万一结构坏得厉害,有备份才不会彻底抓瞎。日常预防上,smartctl -H /dev/sdb查看SMART状态,有条件就把磁盘空间和SMART告警接到监控系统,不用每天手动看。新机器通常不会遇到这些问题,但提前知道处理路径,真出状况时不至于手忙脚乱。

6. 踩过坑之后,我整理出的几条固定习惯

6.1 开工前必做的三件事

踩过几次坑之后,我给自己定了一条规矩:新机器硬盘挂载,开工前先做三件事。第一,lsblk加blkid,把盘符和UUID记下来;第二,格式化之前fdisk -l核对容量和序列号;第三,想好挂载点和文件系统再动工具。看起来多余,但每次都能防住低级错误。尤其是多块盘一起上的时候,没有记录,操作到一半很容易把自己的盘认成别人的盘。

6.2 改配置前先备份,注释写清楚

第二是备份和注释。改fstab之前,先cp一份,比如cp /etc/fstab /etc/fstab.bak.$(date +%F)。改完以后在关键行加注释,写明这块盘用来放什么数据、是哪天挂载的、预计给谁用。新机器可能只有你一个人折腾,时间一长、人员一换,一行清晰注释比什么都管用。我有一次接手一台机器,fstab里三块盘全是裸的UUID,没有任何说明,排查问题只能一块一块mount去试,十分被动。

6.3 让监控替你看盘

第三是让监控替你看盘。磁盘不会自己报错,等到它满了才被发现已经晚了。新盘上线后,我至少会把空间使用率加入监控,设置85%告警;有条件再盯inode和SMART。平时就算没时间巡检,告警也会替你盯着。对我个人来说,做完一次新机器硬盘挂载,最踏实的不是确认当前一切正常,而是确认后续有任何异常都会有人通知我,这比记多少命令都重要。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询