ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux数据盘卸载与重新挂载实战:从umount到fstab全解析

Linux数据盘卸载与重新挂载实战:从umount到fstab全解析 1. 这块数据盘为什么要动它接手过服务器的人应该都遇到过这种场景机房要搬迁、磁盘出现坏道、机器要从物理机换到虚拟机或者干脆就是想给某个数据盘做一次彻底的清理。不管原因是什么最终落到操作层面就是一句话——把数据盘从服务器上移除然后在目标位置重新挂载。先说清楚一个概念。Linux服务器上的磁盘分成系统盘和数据盘两种角色。系统盘承载操作系统本身里面装着/boot、/usr、/etc这些目录开机启动全靠它。数据盘则是额外挂载出来的存储空间常见的挂载点有/data、/mnt/data、/home这类目录跑业务的数据、数据库文件、日志文件都放在这里。两者最大的区别在于系统盘不能随便拆拆了系统直接起不来数据盘相对独立理论上只要数据还在拆掉重新挂载业务数据一分不少。很多新手容易把“移除数据盘”和“拔掉一个U盘”混为一谈。插在USB口上的U盘右键弹出就能拿走文件系统已经在内核里卸载干净了。但服务器上的数据盘不一样它是通过一块真实的硬件磁盘SATA/SAS/NVMe或者云平台提供的块存储虚拟出来的设备挂着文件系统同时可能有数据库进程、Web服务进程在持续写入。如果你不管不顾直接卸硬盘轻则文件系统损坏重则整块盘的数据表结构错乱到时候哭都来不及。所以这篇内容适合三类人看第一次给服务器做磁盘迁移的运维新手、需要定期处理数据盘扩容或替换的运维老兵、以及那些刚接触Linux开发板或者家用服务器、想把旧硬盘挪到新设备上的折腾爱好者。我会把从卸载到重新挂载的完整链路讲清楚包括命令背后的原理、操作顺序的原因、以及那些踩过才知道的坑。2. 动手之前先搞清楚这盘是怎么挂上去的2.1 查看磁盘现状别凭记忆干活任何一次磁盘操作第一步永远是确认现状。Linux里查看磁盘和挂载信息有三个命令各司其职建议都跑一遍。lsblk df -h blkidlsblk输出的是树状结构能一眼看出磁盘分区和挂载点的对应关系。比如一块 500G 的/dev/sdb下面有个/dev/sdb1分区挂载在/data上lsblk会直接列成层级。df -h查看的是文件系统维度的使用情况能看到每个挂载点用了多少、剩多少。blkid则输出每个分区的 UUID 和文件系统类型这两个信息在后面的配置文件中要用到。重点说一下blkid里的 UUID。UUID 是每个文件系统在创建时生成的一串全局唯一标识符相当于这块分区的“身份证号”。为什么系统能识别一块盘是哪个分区、挂到哪里靠的就是 UUID。在/etc/fstab里写挂载配置时用 UUID 而不是设备路径比如/dev/sdb1是行业标准做法因为设备路径在重启后可能变化但 UUID 不会变。这三条命令跑完后你脑子里应该形成一个清晰的图景目标数据盘是哪块物理盘、有几个分区、文件系统是什么类型、当前挂载在哪个目录、空间使用率多少。如果这些信息你都说不清就别往下一步走。2.2 确认没有进程占用lsof 和 fuser 的用法数据盘移除前最大的风险就是有进程还在往里面写数据。数据库的日志文件、应用生成的临时文件、甚至某个后台脚本在循环写文件这些进程只要还在运行内核就会认为这块盘是“busy”状态直接umount会报错。判断是否有进程占用两个命令比较常用lsof /data fuser -v /datalsof会列出当前打开该目录下文件的所有进程。如果有输出逐条看看是什么进程然后正常停掉服务而不是直接 kill -9。fuser -v更直接会把进程的 PID 和用户名列出来方便你判断是谁在占用。这里要说一个真实教训。我见过有人跳过这一步直接卸载结果umount报 target is busy他不信邪加了-l强制卸载。强制卸载确实能完成但那个正在写文件的进程会挂在一个“幽灵”状态后续除非重启系统否则它写的所有数据都可能导致文件系统异常。所以正确做法是先停服务再确认无占用最后卸载。停服务的具体命令取决于你跑的是什么比如 Nginx 是systemctl stop nginxMySQL 是systemctl stop mysqld务必确认它真的停了再继续。2.3 记录一切UUID、挂载点、文件系统类型手工操作服务器最忌讳的就是靠内存记信息。同一个机房几十台服务器盘符搞混了挂载写错了目录后果很严重。我的习惯是操作前把关键信息写在一个临时文件里像这样设备路径/dev/sdb 分区/dev/sdb1 UUID4a1d0f2e-6b8c-4f3a-9e12-7c6b5a4d3e2f 文件系统类型ext4 当前挂载点/data 数据用途业务数据库文件这些信息从哪来blkid /dev/sdb1能输出 UUID 和文件类型lsblk能确认设备路径df -h能确认挂载点。把这些记下来后面无论是写 fstab 还是排查问题都有据可查。另外要检查一下/etc/fstab。这个文件是 Linux 开机时自动挂载的依据如果数据盘的挂载配置写在这里面移除数据盘之前必须把对应行注释掉或删掉否则下次开机系统会尝试挂载一个不存在的设备轻则警告重则直接进紧急模式maintenance mode。常用的检查命令grep -n data\|sdb\|UUID /etc/fstab只要看到跟目标数据盘相关的行先处理掉再继续。3. 卸载环节比想象中更需要耐心3.1 标准卸载流程umount 的正确姿势确认没有进程占用、fstab 已经处理干净之后就可以执行卸载了。umount /data如果你的数据盘在/etc/mtab里的记录正常、没有进程占用这条命令执行完不会有任何输出然后df -h里对应挂载点就消失了。这就是一次干净的卸载。有几种情况会让卸载失败报错信息各不相同报错信息含义处理方式target is busy有进程正在使用该目录用fuser -v /data找出进程并停掉not in /etc/fstab挂载点不在 fstab临时挂载只要文件系统本身没问题umount 可直接卸载device is busy内核或虚拟内存层面有引用检查是否有 swap 文件或容器挂载着该盘分区有个经验值得分享如果fuser -v查了半天没找到占用但 umount 依然报 busy可以试试延迟卸载umount -l /data-l是 lazy unmount内核会立刻把挂载点从命名空间里摘掉但实际文件系统引用会在最后一个进程释放后才真正卸载。这个操作适合处理那些“查不到谁在占用”的疑难情况但不推荐作为常规手段因为如果系统随后崩溃文件系统可能处于不一致状态。卸载完成的标准不是 umount 命令没报错而是再执行df -h或findmnt /data确认挂载点已经空了。findmnt是个好工具系统自带专门查挂载点状态输出清晰。3.2 物理移除和重挂接不同平台的差异软件层面卸载完成后才轮到你真正把硬盘从服务器上拿下来的操作。这个环节根据你的环境差异很大。物理服务器如果支持热插拔SAS/SATA 背板通常支持可以带电拔盘但如果硬盘处于托架里、机器又比较老我建议先关机再拔。拔盘的时候注意静电防护戴好防静电手环这个细节很多人忽略但静电击穿硬盘主控芯片的事故真实发生过。云服务器云上不存在“物理拔盘”。你需要在云控制台或通过 API 操作先把磁盘从云服务器实例上解绑卸载再挂载到目标实例。操作前记得确认磁盘类型是否兼容、目标实例所在可用区是否一致跨可用区挂载基本不行。重新挂载到新位置时如果数据盘里的文件系统还在直接挂载即可数据都在。但如果是从旧机器拆下来换到新机器新机器的/dev设备名可能跟原来不一样比如原来叫/dev/sdb新机器上变成了/dev/sdc——这也是为什么我一直强调用 UUID 而不要写死设备路径的原因。3.3 临时挂载 vs 开机自动挂载重新挂载数据盘有两种方式区别只在于一次性和持久化。临时挂载适合测试、应急修复这种场景mount /dev/sdb1 /data只要不重启这个挂载就能一直存在。重启后系统不会自动挂载因为内核和 systemd 都没记录这条规则。开机自动挂载则必须写入/etc/fstab。标准配置格式如下UUID4a1d0f2e-6b8c-4f3a-9e12-7c6b5a4d3e2f /data ext4 defaults 0 2字段从左到右分别是设备标识、挂载点、文件系统类型、挂载参数、是否备份0 不备份、fsck 检查顺序根分区为 1数据分区为 2 或 0。写完 fstab 后务必先用mount -a验证一遍配置有没有问题。这条命令会按 fstab 的内容把所有还没挂载的设备挂载一遍。如果报错说明配置写错了立刻改回来如果没报错lsblk也能看到挂载正常那这台机器重启后就会自动挂载了。这条验证习惯极其重要——我见过太多人改完 fstab 直接重启然后眼睁睁看着系统卡在紧急模式里。4. 重新挂载后的验证别急着跑业务4.1 检查文件系统完整性和数据一致性挂载成功只是第一步。数据盘经历过卸载、搬运、重挂这个过程文件系统的元数据可能发生变化尤其如果之前卸载不干净会有隐性问题。挂载后建议做一次文件系统检查。ext4 文件系统用e2fsck -f /dev/sdb1注意这个命令必须在分区未挂载或者以只读方式挂载时才能安全运行所以我通常的流程是umount 之后、mount 之前做检查。如果是 XFS 文件系统对应的命令是xfs_repair -n仅检查模式不做修改。做完文件系统检查再看看关键目录的数据是否完整。比如原来数据盘挂载的是/data里面有个/data/mysql目录存放数据库文件挂载到新机器后用ls -l /data/mysql看看目录结构是否还在、文件大小跟原来是否一致。数据量不大的话直接抽查几个文件对比一下 md5 即可。4.2 写入测试和挂载参数确认重新挂载后很多人检查完数据就觉得万事大吉立刻投入生产这是不对的。数据盘在迁移过程中可能存在各种潜在问题比如块设备映射错误、文件系统状态位没清除、权限变了。最稳妥的做法是做一个写入测试。我的习惯是在挂载目录里创建一个临时文件写入一定量随机数据再读出来比对echo test data /data/.migration_test cat /data/.migration_test rm /data/.migration_test如果读写都正常基本可以确认文件系统可用。接下来用mount命令查看挂载参数是否符合预期比如是否开启了 rw读写、是否启用了 noatime 等优化参数mount | grep /data findmnt /datafindmnt输出里能看到挂载的具体选项如果原始环境开了 noatime 而你新挂载的没开性能可能存在差异需要调整 fstab 里的参数保持一致。还有权限问题容易忽略。数据盘上原有的文件具有属主和权限位比如属于某个 UID 用户如果迁移后的机器上用户 ID 不同会出现“文件在但没权限读”的情况。新机器上要先确认 UID/GID 与原有环境匹配如果对不上用chown -R修正属主。这个坑在迁移 MySQL、Nginx 这类带独立用户的软件时特别常见。5. 常见问题与排查技巧实录5.1 卸载报 target is busy 的完整排查思路这是出现频率最高的问题。有次我处理一台跑着 PostgreSQL 的服务器卸载数据盘时反复报 target is busylsof也查不到任何进程。后来发现是一个后台系统服务挂着数据库目录里的某个监控文件不释放进程名字很隐蔽。最后用lsof D /data这个参数会递归搜索目录下所有打开的文件比lsof /data查得更彻底。找到 PID 后ps -fp PID确认是什么进程然后正常停止。如果确实查不到任何进程可以看下/proc/mounts确认是不是某个绑定挂载或子挂载点挡了道cat /proc/mounts | grep /data如果存在多个指向/data子路径的挂载记录需要先把子挂载点卸载干净才能卸载主挂载点。5.2 挂载报错 wrong fs type 的快速解决重新挂载时如果内核报wrong fs type, bad option, bad superblock on /dev/sdb1通常不是文件系统真的损坏了而是你没告诉内核该用哪种文件系统类型去解析它。mount /dev/sdb1 /data这种写法如果内核无法自动识别比如文件系统类型比较特殊或者之前的 superblock 有残留标记就会报这个错。解法很简单显式指定文件系统类型。mount -t ext4 /dev/sdb1 /data # 或者 mount -t xfs /dev/sdb1 /data还有一种情况系统缺少对应文件系统的内核模块。比如我在某台精简安装的 CentOS 上挂 xfs 分区报unknown filesystem type xfs一查内核模块根本没加载。解决方式modprobe xfs然后挂载就正常了。如果是 ext4 模块缺失同理modprobe ext4。5.3 重新挂载后挂载点目录是空的挂载点目录空荡荡说明数据盘可能没有被真正挂载上去或者挂载到了错误位置。我用df -h检查时如果发现对应容量没有出现再复查一下blkid确认你挂的是不是那块盘。一个经典失误是同时接了多块盘/dev/sdb和/dev/sdc位置对调了你以为是原来的数据盘实际上挂的是另一块空盘。预防办法还是靠 UUID。用mount -U UUID /data挂载就不会认错盘。如果数据盘是新格式化的空盘而你想找回原来数据那先从备份恢复这属于另一个话题这里不展开。5.4 重启后频繁进入 emergency mode这个问题的根因几乎都在/etc/fstab。系统启动时逐条解析 fstab遇到挂载不成功的记录不会跳过而是直接把系统丢进紧急模式让你人工修复。修复方法在紧急模式下执行mount -o remount,rw /让根文件系统可写然后编辑/etc/fstab注释掉或修正错误行保存后重启。为了避免这种局面我养成的习惯是每次修改 fstab 后第一时间执行mount -a验证同时用findmnt --verify检查语法。命令如下findmnt --verify如果有异常它会明确告诉你哪一行有问题。这个工具比肉眼看 fstab 靠谱得多。5.5 一次数据盘迁移踩坑实例丢失的 nodename最后分享一个真实案例。有次要给公司一台服务器做数据盘迁移磁盘本身不大120G跑的是内部使用的监控系统数据不算核心但也不能丢。流程走了卸载、拆盘、装到新机器、挂载看似一切顺利。但重新挂载后系统里原目录的数据文件都是旧的环境变量路径某个服务启动时查不到路径报错。排查了半天才发现旧环境把网络存储指向/data/backup/nfs这种子目录路径迁移后老母鸡变鸭子目录层级没重建服务当然起不来。这个案例告诉我数据盘迁移不只是“把盘换地方”还包括验证环境路径、目录结构、配置文件中的绝对路径引用是否都跟着对上了。所以在重新挂载后除了文件系统检查我会建议顺手跑一遍目标服务的启动脚本用systemctl status看状态别等到业务报障了再来补救。6. 操作积累下来的几条心得处理了太多类似的磁盘操作之后我总结了几条自己的规矩供参考。第一任何磁盘操作前先把备份做好哪怕只是最小化的备份。腾讯云、阿里云这类平台提供的快照功能就是为这种场景准备的物理机做不了快照就至少把关键数据目录用 rsync 拉一份到别的机器。不怕一万就怕万一。第二能用 UUID 就绝不写死设备名。/dev/sda、/dev/sdb这类名字是由内核在开机时按检测顺序分配的换硬盘、加硬盘、改 BIOS 设置都可能让它改变。UUID 是文件系统创建时就固化的标识用它在 fstab 里挂载最安全。第三操作完一定要写记录。什么时间、操作了哪块盘、挂载点改成了什么、UUID 多少、目标机器哪台——这些信息记在内部文档里要么记在标题附近的注释里。半年后别人问你“这块盘什么时候换的”你至少有据可查。第四学会看/var/log/syslog或/var/log/messages。每次挂载、卸载、文件系统报错系统都会往日志里写记录。排查挂载问题缺线索时dmesg | tail或者grep -i mount /var/log/messages往往比搜索引擎更直接。数据盘移除和重新挂载这个事说难不难说简单也不简单。它考验的不是某个命令的用法而是做事时那种步步为营的谨慎感——先查现状再停服务再卸载再确认再挂载再验证。每一步都有它的理由跳一步后面就可能要花双倍的时间来补坑。希望这篇内容能帮你把整套流程理清楚真正操作的时候心里有底踩不到那些我踩过的坑。
返回列表