首页 / 资讯中心 / 文章详情

Linux新硬盘挂载全攻略:从分区、格式化到fstab开机自动挂载

Linux新硬盘挂载全攻略:从分区、格式化到fstab开机自动挂载 ★ FEATURED ARTICLE
1. 为什么新硬盘插上之后系统里“什么都没有”先聊一个很多Linux新手都会碰到的场景你给服务器加了一块新盘SATA线插好开机进系统lsblk里能清清楚楚看到sdb这块设备但df -h里完全没有它的影子cd /mnt/data也提示目录不存在。这时候很多人第一反应是“盘坏了”或者“系统没识别”其实都不是。Linux的存储管理逻辑和Windows有一个很大的区别Windows插入新磁盘后会自动识别、初始化甚至会直接分配一个盘符给你用但Linux更倾向于“你不明确告诉我怎么用我就不动它”。这是出于安全和可控性的考虑——系统不知道这块盘是要做数据盘、备份盘还是替换某块故障盘贸然格式化或自动挂载反而容易出事。所以新磁盘在Linux里默认是“裸设备”状态需要人工完成三个步骤才能真正投入使用分区、格式化、挂载。这篇文章就是围绕这三步展开的同时会带上我在实际运维中踩过的坑和总结出来的习惯。无论你是刚接触Linux的小白还是已经能熟练操作mount命令但想弄明白fstab细节的中级用户这篇都应该对你有帮助。我会尽量把每个操作背后的“为什么”也讲清楚——有些命令你知道怎么敲但如果不知道为什么要这么敲换一个场景就很容易卡住。1.1 磁盘没“接入目录树”之前系统不知道该怎么用它要理解挂载先要理解Linux的一个核心设计一切皆文件。你看到的文件、目录、设备、进程信息、内核参数统统是以文件或目录的形式暴露在根目录/之下的。磁盘本身在Linux里也被抽象成一个设备文件比如/dev/sdb但这个设备文件只是“通往硬件的一道门”它不等于磁盘上的数据已经能用了。磁盘上存的是文件系统比如ext4、xfs、btrfs文件系统里才是你可以访问的目录和文件。但要让这些目录和文件出现在Linux的目录树中必须经过一次“接入”动作——把这个文件系统挂载到某个目录下。这个目录就叫挂载点mount point。挂载完成之后你访问挂载点目录就等于在访问磁盘上的内容。我经常用一个比喻来解释把根目录/想象成一棵树的树干挂载点就像是树干上的一个枝节。磁盘就像是一棵独立的树你要么把它整个接到某个枝节上让它成为这棵大树的一部分要么它就只能躺在地上你看见它但没法爬上去摘果子。如果没挂载系统知道有一块叫sdb的盘但不知道它的文件系统里有什么自然也就不可能通过路径去访问。1.2 先分清三类状态没分区、有分区没格式化、格式化没挂载很多人在排查“新盘用不了”的时候会拿着一堆命令挨个试但方向错了。实际操作中一块盘不能使用通常只有三种情况先判断是哪一种再动手完全没分区lsblk里只能看到sdb这一层下面没有sdb1这样的子项。这种情况盘上连分区表都没有需要先分区。有分区但没格式化lsblk里能看到sdb1但blkid命令查不到这个分区的文件系统类型。这种情况分区表有了但分区里没有文件系统系统没法写入数据需要格式化。有分区、已格式化、但没挂载blkid能显示TYPEext4之类的信息但df -h不显示访问挂载点目录也是空的。这种情况只需要mount挂载即可。判断命令用lsblk -f最直观它会把设备、分区、文件系统类型、UUID、挂载点一次全列出来。没有文件系统类型的格子就是未格式化没有挂载点的就是没挂载。我自己的习惯是拿到任何一台新机器第一个存储命令就是lsblk -f信息量足够大又不会像fdisk -l那样刷屏。2. 挂载背后的设计逻辑把磁盘“接”到目录树的某个节点有了上面的基础你可能会想挂载不就是执行一条mount命令吗对但要想挂载得从容、用得长久还得理解几个关键设计其中最重要的一条是挂载点本质是一个目录而目录本身属于根文件系统。这意味着你可以把磁盘挂载到任意一个空目录甚至可以在挂载之后继续在这个挂载点下创建子目录、再挂别的文件系统。Linux的一切皆文件、目录树统一管理的设计让多块磁盘、多个分区可以互相嵌套、灵活组合。而Windows的盘符机制本质上是给每个存储卷分配一个独立的顶层级名字C:、D:它和Linux的目录树是两种完全不同的组织思路。2.1 挂载点是什么——和Windows盘符的区别Windows用户习惯了一个盘一个字母C盘是系统、D盘是软件、E盘是资料。这套逻辑简单直观但有局限性盘符是“平级”的你不能把D盘“放”到C盘的某个目录里面去。而Linux的挂载点天然就是目录树的一部分比如我把一块数据盘挂到/home那么以后所有用户的家目录数据都会落在这块盘上挂到/var/lib/dockerDocker的容器数据就存储在这块盘上。这种灵活性在服务器场景里非常实用。那挂载点是不是随便选原则很简单目录必须存在且最好为空。如果你挂到一个不存在的目录mount命令会直接报错如果你挂到一个有内容的目录原有的文件不会消失但会在挂载期间被“遮住”暂时看不见。这个问题我们后面会单独讲因为它坑过不少人。还有一点需要注意挂载点和Windows“插上就能用”的体验完全不同。Linux里即使你挂好了重启之后挂载关系也会丢失除非写进了/etc/fstab。这也是为什么很多人第一次在虚拟机里挂载完ISO或数据盘、重启后又找不到了然后一脸疑惑——不是盘坏了是挂载关系没持久化。2.2 设备名会变UUID不会变为什么现代方案都推荐UUID挂载时最常见的方式是mount /dev/sdb1 /mnt/data这没什么问题但如果你要把这条挂载写进开机自启文件我强烈建议不要直接用/dev/sdb1这种写法而是用UUID。为什么因为/dev/sdX这种命名是内核按识别顺序分配的不是固定的物理标签。你今天插着两块盘系统先识别到sda、再识别到sdb明天你换了个SATA口、或者多接了一块U盘原来的sdb可能就变成了sdc。如果fstab里绑定的是/dev/sdb1设备名一变开机时系统就挂载失败严重时甚至直接卡在启动界面。UUID就完全没有这个问题。它是文件系统创建时生成的一个全局唯一标识符相当于这块分区在Linux世界里的“身份证号”。只要分区不被重新格式化UUID永远不会变。用UUID写挂载配置无论设备名怎么变系统都能准确找到目标分区。查看UUID很简单blkid /dev/sda1或者lsblk -f都能看。顺带一提现在很多新工具也在推使用/dev/disk/by-uuid/或/dev/disk/by-label/这类稳定路径底层原理其实类似都是为了绕过不稳定的设备名。3. 从零挂载一块全新磁盘完整操作链路现在到了动手环节。假设机器上有一块全新的、没有分区、没有格式化的数据盘设备名是/dev/sdb。我要带你完整走一遍确认设备、分区、格式化、挂载、验证。全程命令我都按实际生产环境的标准来也会解释每一步为什么要这么做。3.1 用lsblk确认设备状态操作之前先确认状态。执行lsblk -f输出大概是这样的NAME FSTYPE LABEL UUID MOUNTPOINT sda ├─sda1 xfs abc123... /boot ├─sda2 xfs def456... / └─sda3 swap swap [SWAP] sdb看到sdb下面是空的FSTYPE和UUID都没有说明这就是一块完全没处理过的盘。容量等信息可以用lsblk -b再看一眼确认是不是你要操作的那块盘。这一步非常重要我反复提醒自己一切存储操作之前先确认设备名再确认容量最后确认FSTYPE为空。如果设备名看错了格式化错了盘数据就真没了。关于恢复数据那是另一个悲伤的故事尽量不要给自己创造这种故事。3.2 fdisk分区实操分区工具很多fdisk、parted、gdisk各有擅长。对于最常见的MBR分区表、单块数据盘的场景fdisk足够好用。比如把/dev/sdb整块盘分成一个分区fdisk /dev/sdb进入交互界面后依次输入n # 新建分区 p # 主分区 1 # 分区编号 回车 # 起始扇区默认 回车 # 结束扇区默认 w # 写入分区表并退出输入w之后fdisk会把分区表写入磁盘。如果系统提示需要重启或重读分区表执行partprobe /dev/sdb让内核重新读取分区表而不需要重启。然后再用lsblk看应该能看到sdb1了。有一点我想多说现在新机器和大容量磁盘2TB以上越来越多GPT分区表逐渐取代了MBR。如果是一块超过2TB的盘或者你要分超过4个主分区我建议直接改用gdisk也就是gpt fdisk操作逻辑和fdisk几乎一样。判断用哪种2TB以下、分区数量不超过4个用MBR没问题否则用GPT。这是很实用的一条选型经验。3.3 格式化和mount挂载分区完成后分区还只是个“空壳”里面没有文件系统。现在给sdb1格式化mkfs.ext4 /dev/sdb1看到Writing superblocks和filesystem之类的一串反馈说明格式化完成。然后就是挂载mkdir -p /mnt/data mount /dev/sdb1 /mnt/data df -h此时df -h里应该能看到/dev/sdb1已经挂载在/mnt/data容量和预期一致。为了确认写入正常可以顺手测试echo hello disk /mnt/data/test.txt cat /mnt/data/test.txt能读到内容说明这块盘已经完全可用了。整个过程看下来是不是挺简单的不过我要提醒一句这里只是“临时挂载”一旦重启这个挂载关系就会消失要让它永久生效必须配置/etc/fstab下一章细讲。还有一个容易忽略的点挂载之后立刻用df -h看容量有时候会发现可用空间比标称容量少。比如一块4TB的盘格式化后可用约3.6TB左右这是正常的厂商的TB按十进制换算、文件系统又要占用一些元数据空间不用怀疑盘有问题。3.4 为什么我会默认选择ext4格式化这一步文件系统类型有很多选择ext4、xfs、btrfs、zfs……我给大多数普通数据盘都会选ext4原因很务实兼容性最好几乎所有Linux发行版默认都支持ext4内核里直接内置支持模块不需要额外装东西。你把盘拔下来插到另一台机器上大概率直接就能用。可缩小可扩展ext4既支持扩容也支持缩容虽然缩容不建议频繁做xfs只能扩容、不能缩容这个限制在需要重新规划分区时会比较麻烦。稳定性久经考验ext4从2008年发布至今十几年各种异常断电、内核崩溃的场景都被验证过无数遍了对于普通业务数据盘来说非常稳。那什么时候选xfs如果你的场景是大量大文件读写、文件数量巨大比如视频存储、大数据分析集群xfs在特定模式下性能更好。另外RHEL/CentOS 7及以后版本的系统盘默认就是xfs这是发行版的默认选择跟着走也没问题。但如果是自己添加的数据盘、不确定未来要做什么调整我还是先用ext4稳妥第一。4. 开机自动挂载fstab的正确打开方式临时挂载只解决眼前的问题真正让磁盘“安家落户”要靠/etc/fstab。这个文件的名字是file system table的缩写系统启动时会读取它把里面定义好的文件系统逐一挂载。我见过不少人手动挂载一切正常改完fstab重启后系统直接起不来就是因为没弄懂fstab的字段含义。4.1 fstab每一列到底在说什么打开/etc/fstab每一行对应一条挂载规则一共六列用空格或Tab分隔。以上面挂载/dev/sdb1到/mnt/data为例会写成这样UUID2e80a6b7-9c34-4f2a-b4a1-04e6f2e8c1a9 /mnt/data ext4 defaults 0 2六列的含义分别如下列含义说明1设备标识推荐写UUID也可以用设备名或LABEL但UUID最稳2挂载点必须存在的目录3文件系统类型ext4、xfs、swap等要与实际格式一致4挂载选项defaults是最常用的一组默认选项也可以填noatime等5是否dump备份通常填0表示不做dump备份6fsck检查顺序根分区填1其它分区填2不检查就填0这里最关键的认知是fstab不会帮你验证选项对不对它只是照单执行。选项写错、设备标识写错、挂载点不存在开机时就会挂载失败。而根据系统配置挂载失败可能会跳过启动继续也可能会进入紧急模式让你手动修复启动卡住。所以改fstab之前一定先备份改完必须验证。4.2 我建议的fstab写法与验证流程获取UUIDblkid /dev/sdb1然后编辑fstab推荐用vim或nano。写入那一行的时候要注意第一列用UUIDxxxxxx要完整复制小心别漏掉字母挂载点写绝对路径文件系统类型写ext4挂载选项大多数场景写defaults就够了。写完之后千万别急着重启先执行mount -a这个命令就是读取fstab中所有还没有挂载的条目并尝试挂载。如果配置有误mount -a会当场报错比如wrong fs type, bad option, bad superblock这时你还有机会现场修改不用折腾进救援模式。确认mount -a没有报错后再用df -h确认确实挂上了最后才考虑重启验证。我自己的习惯是新装一台机器、改完fstab都会在重启前专门跑一次mount -a这个习惯帮我挡下过至少两次“起不来的机”。4.3 fstab写错导致开机进不了系统怎么办就算再小心也有翻车的时候。比如你把挂载点写成了不存在的目录重启后发现系统卡在Give root password for maintenance之类的界面。这时候不用慌思路很简单以只读方式进入系统修改fstab恢复启动。常见的处理思路是重启进入救援模式或单用户模式不同发行版入口不同通常在GRUB菜单里选recovery mode或者在内核启动参数里加systemd.unitrescue.target。进入救援模式后根文件系统默认是只读的先重新挂载为可读写mount -o remount,rw /然后找到fstab里出错的那一行改掉或注释掉行首加#保存后重启。如果fstab里的错误特别离谱你甚至可以在救援模式直接注释掉所有新加的行先让系统正常起来再说。我在救援模式里修复过好几次之后总结出一个教训fstab新增的每一行前面加个注释说明用途出问题排查的时候一眼就能定位到是自己刚加的那行而不是在系统原有的几十行里翻来找去。5. 卸载、设备忙与挂载点“文件消失”三个高频坑挂载只是前半段日常运维里更常碰到的是卸载和由此引发的一系列诡异现象。我逐一来说这几个坑几乎每个人都会踩一次。5.1 “target is busy”的真实原因和排查方法卸载命令是umount注意拼写不是unmount。当你执行umount /mnt/data如果提示target is busy说明有进程正在使用这个挂载点下的文件。这是Linux的保护机制避免你在文件被占用时强行卸载导致数据不一致或进程崩溃。这时候正确的做法是找出谁在用而不是直接上强制卸载。排查命令fuser -m /mnt/data lsof | grep /mnt/datafuser -m能直接显示占用挂载点的进程号lsof列得更详细能看到具体是哪个进程、打开了哪个文件。知道进程后正常关闭它再卸载就通了fuser -km /mnt/data # 终止占用进程慎用 umount /mnt/datafuser -km比较暴力它会终止所有使用该挂载点的进程如果这些进程是重要的业务进程会造成服务中断。所以我建议优先用lsof定位和业务方确认后再关闭进程不要一上来就杀。还有一个很多人不知道的当前shell的当前目录如果正好在挂载点里面也会导致卸载失败。你在/mnt/data目录下执行umount /mnt/data就会报busy因为shell自己占用了这个目录。解决办法很简单cd /之后再执行卸载。5.2 挂载点下原有文件被“遮住”是怎么回事这个坑非常隐蔽。假设/mnt/data这个目录原本就存在里面已经放了一些文件。你把新盘挂载到这个目录后会发现原来的文件不见了——别慌不是被删了它们只是“被遮住”了。挂载的底层机制是挂载点目录原本对应根文件系统上的一个inode挂载之后这个目录被替换为指向新文件系统根目录的入口。所以你在挂载点下看到的一切都是新文件系统里的内容原来的文件仍然存在于根文件系统上只是暂时不可见。等你执行umount原目录里的文件会原封不动地重新出现。这个机制本身没毛病但会造成两种事故一种是管理员忘了挂载点下还有数据直接格式化新盘回头发现“旧数据找不到了”另一种是往挂载点目录里写数据以为写进了新盘其实写进了被遮住的原目录磁盘空间没变化一脸懵。我的建议是挂载之前先确保挂载点目录是空的。如果目录非空先把里面的东西挪走挂载完成后再拷回来。这样能避免绝大多数“文件消失”的误会。5.3 sync到底要不要手动执行很多人习惯在卸载前执行sync认为这样能把缓存写进磁盘。其实sync的作用是强制把内核的脏页缓存刷到磁盘它确实能加速数据落盘。但现代的umount本身会执行一次文件系统同步正常卸载时它会等待所有数据写回后才会成功返回。那我还要不要手动sync我的习惯是拔U盘、移动硬盘之前我会手动sync一次。因为有些操作系统在特定条件下卸载返回成功但缓存还没完全落盘虽然比较少见多执行一次sync成本极低却能换来数据安全上的确定性。至于服务器上的数据盘正常走umount流程就够了不用额外sync。顺带提醒一个操作习惯任何移动存储设备物理拔出之前一定要先卸载否则缓存里的数据可能没写全轻则文件损坏重则整个文件系统损坏。6. 进阶用法和我个人的一些习惯到这里从分区、格式化、挂载到fstab、卸载一个完整的磁盘生命周期已经走完了。最后我再分享几个进阶用法和长期运维中沉淀下来的习惯。6.1 用mount --bind给目录“做分身”mount --bind是我特别喜欢的一个参数它的作用是把一个已挂载的目录或任意目录挂载到另一个位置相当于给目录做了一个“影子入口”。最典型的用法某个程序写死了一个路径比如/opt/app/logs但你的日志数据盘实际挂在/data/logs你不想改程序配置就可以用bind mountmkdir -p /opt/app/logs mount --bind /data/logs /opt/app/logs这样一来程序写入/opt/app/logs的内容实际会落到/data/logs也就是你的数据盘上。这个操作在不动程序配置的前提下实现数据重定向实测非常方便也完全可以写进fstabfstab挂载选项里写bind即可。bind mount还有个隐藏特性它不仅绑定了目录本身还绑定了挂载关系。如果你在源目录下再挂载别的文件系统通过绑定入口也能看到。这个特性在容器场景里尤其有用——把宿主机的目录bind进容器容器里就能直接访问宿主机的数据这就是容器-v参数底层依赖的机制。6.2 fstab参数里值得留意的安全项除了defaultsfstab的第四列还可以叠加很多选项。生产环境里我比较看重这几个noatime不更新文件访问时间。默认的atime更新会导致每次读文件都要写一次元数据对机械盘和小文件场景影响很明显。加了noatime之后能减少大量不必要的磁盘写操作对性能和寿命都有好处。noexec禁止在该文件系统上执行二进制程序。挂在/tmp这类普通用户可写的目录时加这个选项能阻挡一部分利用临时目录落盘执行的攻击手法。nosuid禁止setuid位生效。挂在用户可写的挂载点时要考虑防止普通用户运行带setuid的程序提权。nodev禁止在该文件系统上创建设备文件。挂在普通数据目录时加上能再收紧一层。组合写法就是逗号连接比如UUIDxxx /mnt/data ext4 defaults,noatime,nosuid,nodev 0 2这些选项不是越多越好但了解它们的作用在安全意识比较强的环境里能少挨几顿审计的批评。6.3 我的最终建议一套稳妥的磁盘上机流程最后总结一套我每次给机器加数据盘都会走的流程算是多年养成的一个“肌肉记忆”lsblk -f确认设备名和状态绝不靠猜。分区2TB以下用fdisk2TB以上用gdiskGPT分区表。partprobe重读分区表再lsblk -f确认分区出现。mkfs.ext4格式化分区格式化前再瞟一眼设备名。mkdir创建挂载点确认目录为空。mount临时挂载df -h验证。blkid取UUID写入/etc/fstab。mount -a验证fstab没有错误再决定要不要重启确认。保存好操作记录包括UUID、挂载点、用途方便以后排查。这套流程看起来平淡无奇但每一步都是在“搞清楚现状之后再做动作”。Linux存储操作最怕的就是脑补——你以为这块盘是sdb实际可能是sdc你以为挂载点目录是空的里面其实躺着一堆旧日志。只要把“先确认、再操作、后验证”这个习惯刻进脑子里你在Linux磁盘挂载这件事上基本就不会翻大车。说到最后我在实际使用中的一个体会是Linux的存储体系看着命令多、概念杂但核心线索其实就一条——文件系统要接入目录树才能被访问接入要经过挂载持久化接入要靠fstab。其他所有工具和参数都是围绕这条主线展开的。把这条主线想明白了哪怕换一套发行版、换一种文件系统你也很快能自己推断出该怎么做。
阅读完成 · 觉得有帮助?
咨询建站