ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

Linux硬盘挂载全流程:从lsblk认盘到fstab开机自动挂载与排错

Linux硬盘挂载全流程:从lsblk认盘到fstab开机自动挂载与排错 最近两周我至少收到四个类似消息新买的SSD插上去了系统里看不到盘或者挂载时报个没见过英文错直接卡在wrong fs type那里不知道怎么办还有人在/etc/fstab里写了一行结果重启后愣是卡在emergency mode。这类问题我在工作里遇到过太多次其实Linux挂载硬盘这件事本身并不难难点在于大部分人上来就跳过“认盘”和“选文件系统”这两步直接执行mount一旦环境跟教程不一致就容易翻车。这篇内容我就按自己平时处理服务器的习惯来写从认盘开始到临时挂载、开机自动挂载再到排查各种常见报错最后补一个开发板和NFS场景。不管你是刚把第二块硬盘塞进台式机还是在机房给新机器接存储照着这套路子走基本不会再瞎折腾。1. 挂载之前先认清硬盘1.1 lsblk和blkid两个最常用的“透视镜”拿到一块没有系统的新硬盘多数人第一反应是fdisk -l这个命令确实能看到设备但输出信息非常啰嗦尤其当机器上插了好几块盘一堆扇区、磁头、柱面参数看得人眼花。我更推荐先执行lsblk它的输出是按树形结构列出来的一眼就能看出谁是谁的分区谁还没被分区。lsblk输出大概长这样NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 223.6G 0 disk ├─sda1 8:1 0 500M 0 part /boot/efi ├─sda2 8:2 0 222.7G 0 part / └─sda3 8:3 0 512M 0 part [SWAP] sdb 8:16 0 1.8T 0 disk注意看sdb下面没有任何─子项MOUNTPOINT列也是空的这表示整块盘还没分区、没格式化系统根本不知道该拿它怎么办。这时候直接mount /dev/sdb1 /mnt肯定报错因为/dev/sdb1还不存在。如果想看更详细的文件系统信息用blkid。它会把每块分区当前已经写好的文件系统类型、UUID都列出来blkid输出类似/dev/sda2: UUIDa1b2c3d4... TYPEext4 PARTUUID... /dev/sdb: PTUUID... PTYPEgpt注意sdb那一行只有PTUUID、PTYPE没有TYPE这同样说明它还没有文件系统。一旦你看到某块盘带了TYPEext4这类信息那就说明它曾经被格式化过可以直接挂载。实操心得拿到自己不熟悉的机器先lsblk再blkid两个命令一结合设备的“体检报告”就出来了。别急着敲mount先花十秒钟看清盘后面少踩一半的坑。1.2 分区表GPT还是MBR别再凭感觉分区表决定硬盘怎么组织分区。老的MBR最多支持4个主分区而且单分区容量超过2TB时会有各种别扭GPT没有主分区数量限制也支持更大容量。现在的新硬盘除非你有非常特殊的兼容性要求比如老主板纯Legacy引导、某些老设备固件否则闭着眼睛选GPT就行。我见过有人在2TB以上的新盘上非要手动建MBR分区表结果建完只有不到2TB可用的尴尬场面。所以这里给个明确建议新盘、大容量盘2TB一律GPT老设备、老系统装机引导保留MBR拿不准GPT优先分区工具推荐gdisk或者parted操作风格不同但底层都是改分区表。以最常见的场景为例一块全新的盘打算整块盘分成一个区来用用parted可以这样parted /dev/sdb mklabel gpt parted /dev/sdb mkpart primary ext4 0% 100%0% 100%意思是从头到尾占满整块盘。如果你只想分一半做数据盘可以把后面改成0% 50%再补一条命令建第二个分区。这个百分比写法比直接填扇区号友好太多我处理新盘时基本都用它。1.3 新盘收到之后的基本检查流程收到一块新盘别急着往机箱里塞我一般按下面的顺序走一遍插上盘启动系统后执行lsblk确认系统有没有认到设备如果完全没有优先检查供电和线缆。执行dmesg | tail看看有没有异常报错。新盘通常会看到类似sdb: sdb1的信息如果看到I/O error基本可以断定是盘本身或线材的问题。确认设备名后再确认分区表类型和分区情况。格式化、挂载一步步来。这个流程听起来很基础但真能省下不少排查时间。我遇到过好几次“硬盘插上没反应”的求助最后查下来是SATA线没插紧或者供电线分叉没插到位。“系统认不到盘”九成是硬件问题不是软件问题别一开始就在软件里折腾。2. 临时挂载先跑通再谈永久2.1 决定文件系统ext4、XFS、NTFS/exFAT怎么选挂载之前你得先让盘上有文件系统也就是“格式化”。这块盘将来要拿来做什么决定了你选什么格式场景推荐文件系统理由Linux系统盘、普通数据盘ext4兼容性最好老牌稳定新手首选大文件存储、数据库备份XFS大文件读写性能好适合单文件大容量场景跨Windows/Linux双系统读写NTFS或exFATWindows原生支持Linux要装ntfs-3g移动硬盘、U盘exFAT跨平台兼容好避免单文件4GB限制ext4我还是最推荐给第一次接触Linux的用户原因无他生态最成熟网上能查到的资料最多出了问题也好修。格式化命令mkfs.ext4 /dev/sdb1如果打算整块盘不分区直接格式化也可以mkfs.ext4 /dev/sdb但不建议因为后续做分区调整会非常被动还是老老实实分一个区再格式化。2.2 mount的基本用法和常用参数格式化完成之后临时挂载就简单了mkdir -p /data mount /dev/sdb1 /data挂载的本质是把一块已经格式化好的分区跟系统目录树里的某个目录“连接”起来。这里有个必须理解的逻辑挂载点目录必须是已经存在的空目录。如果目录里原本有文件挂载之后这些文件会被“遮住”你看不到了但数据还在卸载之后又会重新出现。mount还有一些常用参数挑几个最实用的说一下mount -o ro /dev/sdb1 /data # 只读挂载适合排查盘的数据安全场景 mount -o noexec /dev/sdb1 /data # 禁止执行二进制文件适合防病毒的场景 mount -o loop ubuntu.iso /mnt/iso # 挂载镜像文件 mount --bind /data /srv/data # 目录绑定不新建分区也能把目录挂到别处--bind这个用法很多人不知道但它在服务迁移时极好用。比如某个服务写死路径/srv/data而你的真实数据在/data不用挪数据一条bind命令就搞定。2.3 umount卸不掉这说明有人在占用对应mount的是umountumount /data如果提示target is busy说明还有进程在访问这个目录。先执行lsof f -- /data或fuser -mv /data看清楚是谁占着再决定是停掉进程还是用强制卸载兜底。umount -l /data-l参数是lazy umount意思是立刻把这个挂载点从目录树里摘掉但等占用它的进程全部退出后才真正卸载底层设备。这个参数很适合生产环境你不能停掉正在写数据的业务进程但你又确实需要卸载这块盘去处理问题。用了-l之后目录里的数据不会丢进程写到一半的数据也会继续完成写入。踩过的坑很多人习惯cd到挂载目录里再执行umount结果永远提示target is busy。因为当前shell的工作目录还停留在挂载点里shell本身就是那个占用进程。先cd /再umount问题直接消失。3. 开机自动挂载fstab的正确打开方式3.1 fstab的六个字段逐行讲清楚临时挂载只能解决当下重启之后系统不会自动恢复挂载关系所以要把挂载信息写进/etc/fstab。这个文件每行有固定的六个字段我用一个例子来拆解UUIDxxxx-xxxx-xxxx /data ext4 defaults 0 2依次是设备标识推荐写UUID不推荐写/dev/sdb1挂载点一个不存在的目录系统会先创建再挂载文件系统类型这里写ext4挂载选项defaults代表rw, suid, dev, exec, auto, nouser, async的组合dump备份标记基本写0现在很少人用dumpfsck检查顺序根分区写1其他想开机自检的分区写2不想自检写0一个典型的数据盘示例UUIDabcdef00-1234-5678-9abc-def012345678 /data ext4 defaults,nofail 0 23.2 为什么推荐用UUID而不是/dev/sdX新手最喜欢照抄教程里的/dev/sdb1但这是最不该学的一种写法。设备名不是固定的系统每次启动时发现硬盘的顺序不一样很可能这次是/dev/sdb下次就变成/dev/sdc了。一旦设备名错位fstab就会挂错盘。UUID是格式化时随机生成的一串唯一标识部分文件系统也可以手动指定它跟盘走的跟系统启动顺序无关。你把这盘插到另一台机器上UUID还是同一个。获取UUIDblkid /dev/sdb1复制那一长串UUID...里的内容填到fstab里就行。如果有人问“我就一块盘写/dev/sdb1应该没事吧”从概率上确实没事但这习惯不好。哪天你把一块新盘插上去原来的sdb变成了sdc系统起不来了那才是最疼的。UUID虽然长但一劳永逸。3.3 调优选项noatime、nofail、uid/giddefaults能应付大部分场景但几个实用选项值得记一下noatime不记录文件的访问时间。能减少大量写I/O对SSD和机械盘的随机读都有明显帮助。普通数据盘不是特殊审计需求建议加上。nofail如果挂载失败比如外接硬盘没插系统不会卡在emergency mode而是跳过并继续启动。外接盘、虚拟机共享盘强烈建议加。uid和gid只对FAT/NTFS这类没有Unix权限概念的文件系统有效可以指定挂载后文件归属的用户和用户组。后面讲NTFS时会再细说。举个例子一个追求性能的本地数据盘可以这么写UUIDxxxx /data ext4 noatime,nofail 0 2实操心得我维护的服务器里只要遇到外置USB硬盘或云盘冷备目录nofail是必须加的。不加这个哪天设备没插好整个机器开机直接进维护模式值班的人半夜就得爬起来处理。生产环境不要挑战这种风险。3.4 验证fstab别把系统整得开不了机改完fstab想验证对不对不要重启。先执行mount -a-a会把fstab里所有还没挂载的条目按配置挂一遍如果配置有问题这里当场就会报错你还来得及改。如果没报错再执行lsblk确认挂载点生效。另一个稳妥的验证方式是findmnt /data它显示的是当前系统对这个挂载点的真实解析结果。如果fstab写得不对但手动挂载成功了findmnt会提示target is not mounted或是fstab与实测不一致。我还建议改文件之前先备份一下cp /etc/fstab /etc/fstab.bak一旦后面改坏了从单用户模式或live CD里一条cp就能救回来。4. 典型故障报错信息就是最好的线索4.1 “wrong fs type, bad option, bad superblock”到底在说什么挂载时报这串英文错的人特别多mount: /data: wrong fs type, bad option, bad superblock on /dev/sdb1, missing codepage or helper program, or other error.这一长串其实是在说我在挂载点里找不到一个我能识别的文件系统。常见原因有几种盘上根本没有文件系统没格式化或者文件系统已经损坏。指定的挂载类型不对比如明明是ext4盘你写成了-t xfs。缺少对应的文件系统驱动比如挂NTFS盘但没装ntfs-3g。排查办法很简单先blkid /dev/sdb1看它到底识别出的TYPE是什么再跟挂载命令里的-t对比。如果blkid显示TYPEntfs那你需要先装apt install ntfs-3g如果blkid没有任何输出大概率盘没有有效的文件系统只能重新格式化。注意重新格式化会清空所有数据执行之前务必确认盘上没你想要的旧数据。4.2 明明是root为什么还是permission denied挂载成功了但cd /data进去读取文件时提示permission denied。这要分两种情况看如果挂载的是ext4/xfs这类原生Linux文件系统问题出在文件和目录权限上。用ls -l /data看看属主和权限位chown -R 你的用户名:组名 /data改一下即可。如果挂载的是NTFS或exFAT问题不在常规权限而是这两个文件系统没有Unix的owner/group概念内核默认把它们挂载成root拥有普通用户自然进不去。解法是挂载时指定uid/gid。先id 你的用户名查到uid和gid然后mount -t ntfs-3g -o uid1000,gid1000,umask022 /dev/sdb1 /dataumask022含义是创建出来的文件权限是644、目录权限是755普通用户既可以读也拥有自己的文件。想彻底可写可删就把umask设成000——不推荐这样所有用户都能改任何文件双系统共享盘上容易互相误删。4.3 开机进emergency mode大概率是fstab写错了系统重启后没有正常进桌面而是黑屏里出现一句类似You are in emergency mode. After logging in, type journalctl -xb ...第一反应不要慌九成是fstab有问题。先输入root密码进维护模式执行mount -a它会明确告诉你哪一行出错。常见错误包括UUID写错、挂载点不存在、文件系统类型不一致、盘没插好。临时把那行注释掉行首加#再reboot就能先进系统然后再仔细修正配置。还有一种情况需要特别注意挂载点目录本身不在根目录里。如果我写的是/mnt/data但忘记创建/mnt/data目录fstab在实际挂载时会自动创建这个倒不用担心。真正坑的是挂载点的父目录被另一张盘挂载了导致启动顺序对不上这种只能手动先挂父目录再挂子目录。4.4 外接NTFS盘只读挂载和中文乱码双系统用户最常遇到外接NTFS盘只能读、不能写。这往往是ntfs-3g没装或者是Windows开启了快速启动导致NTFS卷标处于“休眠”状态Linux为了安全会以只读方式挂载。先装ntfs-3gapt update apt install -y ntfs-3g如果还是只读进Windows关闭快速启动或者在Linux上强制以读写方式挂载mount -t ntfs-3g -o remove_hiberfile /dev/sdb1 /dataremove_hiberfile会删掉Windows的休眠镜像文件相当于放弃之前休眠状态之后盘就正常可写了。已经有旧内核版本的ntfs驱动也可能造成乱码问题但现代发行版默认UTF-8基本都能正常显示中文文件名。5. 延伸把本地经验迁移到服务器和开发板5.1 挂载NFS网络存储挂了本地盘很多人下一个需求就是挂NAS。NFS是最常见的网络文件共享协议Linux对NFS的支持几乎是原生级别的。假设NAS的IP是192.168.1.10共享目录是/volume1/media你想挂到本机/mnt/nasapt install nfs-common mkdir -p /mnt/nas mount -t nfs 192.168.1.10:/volume1/media /mnt/nas这时用df -h能看到一条网络存储的记录。想要开机自动挂载写进fstab192.168.1.10:/volume1/media /mnt/nas nfs defaults,noatime,nofail 0 0NFS挂载相比本地盘多了网络延迟的变量如果NAS没响应mount命令会卡很久。所以建议在mount参数里加soft和timeomount -t nfs -o soft,timeo50,retrans2 192.168.1.10:/volume1/media /mnt/nassoft表示网络超时后放弃请求并报错hard则会让进程卡住重试。生产环境要数据不丢用hard自己家里玩玩用soft更不容易卡机。5.2 开发板挂载ubuntu主机的目录这块可能偏嵌入式但我觉得值得写。开发板上磁盘空间紧张常常需要直接访问Ubuntu主机上的交叉编译工具链或代码目录。做法也不复杂在Ubuntu主机上装NFS服务把需要共享的目录export出去apt install nfs-kernel-server vim /etc/exports加一行/home/你用户名/shared 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)然后执行exportfs -ra systemctl restart nfs-server开发板上再执行mount命令挂过来效果等同于开发板直接操作主机上的目录。编译产物直接写到主机磁盘开发板的eMMC或TF卡空间压力会小很多。no_root_squash如果不需要建议去掉。root_squash会让远程root在本机自动降权为nobody这对安全性是保护。我自己在调试时图方便加过no_root_squash后来发现一旦开发板被入侵攻击者直接用root写我主机文件想想都后怕。平时调代码完全用不上这个选项默认配置就好。说到最后我还想提一条关于“挂载习惯”的建议不要因为挂载命令看起来简单就跳过前面认盘的环节直接执行。我见过太多翻车案例最后定位都是“挂载点写错”“忘了确认盘上有没有文件系统”“fstab里用了不稳定的设备名”。按我开头说的流程走一遍认盘、分区、格式化、临时挂载、写fstab、mount -a验证每一步都确认好了再往下走Linux挂硬盘这件事就能从“玄学”变成“肌肉记忆”。如果你手边正好有块闲置硬盘挑个不忙的晚上拿我这套流程练一遍之后遇到服务器加盘、开发板扩容、NAS挂载你会发现自己真的不再慌。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表