ARTICLE DETAIL

资讯详情

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

Linux umount命令实战:解决target is busy与NFS卸载难题

Linux umount命令实战:解决target is busy与NFS卸载难题 无论你是刚接触Linux的学生还是已经在线上环境摸爬滚打了几年的运维umount这个名字你一定不陌生。它和mount一样属于磁盘管理里的日常基础操作但说实话umount的翻车概率远高于mount尤其是在生产环境、多用户服务器或者NFS这类网络文件系统上。很多人第一次遇到target is busy的时候整个人都是懵的明明上一秒还挂得好好的凭什么说卸就卸不下来。这篇是Linux命令大全系列的第七篇专注讲umount的实操。我不打算只给你念一遍man手册而是会从为什么umount会失败讲起把底层原理、排查思路、常用参数、NFS特殊场景、fstab配合以及我实际踩过的坑全部串起来。无论是日常学习、考试面试还是真到了凌晨三点被线上告警叫起来处理挂载点卸载失败你都能从这篇文章里找到可以直接抄的作业。1. 先搞清楚umount到底在做什么1.1 挂载与卸载的一体两面很多人对mount和umount的理解停留在挂上去和卸下来这个层面这没错但不够。文件系统挂载的本质是把一个块设备、分区、ISO镜像、网络共享或者loop设备接入到当前系统目录树中的一个目录节点上。这个目录节点被称为挂载点。umount干的事就是把这种关联关系断开让目录树恢复到这个设备介入之前的状态。但断开不是嘴上说说。内核需要确认这个文件系统上已经没有正在使用的引用才会真正执行断开操作。这里的引用包括正在读写文件的进程、把当前工作目录切到挂载点里的进程、打开的文件描述符以及更为隐蔽的嵌套挂载。只要有一个引用存在内核就会拒绝卸载并抛出target is busy之类的提示。换句话说umount失败不是命令的问题而是文件系统上还吊着东西内核出于安全考虑不让你卸。我在刚玩Linux那会儿遇到这种报错就喜欢直接上umount -f硬来结果大部分时候根本不生效反而把系统搞得更乱。后来才慢慢理解Linux一切皆文件文件系统被占用是常态umount是一门讲究先清场、后卸载的活。1.2 完整可复现的最小实验从建盘到卸载为了把后面所有概念讲清楚先带你做一个可以完整复现的实验。这个实验不需要真实硬盘只需要一个临时文件通过loop设备模拟一块磁盘。整个链路走通之后你对挂载、占用、卸载的理解会扎实很多。第一步创建一个64MB的空文件并格式化为ext4dd if/dev/zero of/tmp/testdisk.img bs1M count64 mkfs.ext4 /tmp/testdisk.img这条命令会生成一个固定大小的镜像文件你可以把它理解成一块虚拟磁盘。mkfs.ext4会在里面写入文件系统元数据。第二步创建挂载点并挂载mkdir -p /mnt/testdisk mount -o loop /tmp/testdisk.img /mnt/testdisk-o loop参数是关键它告诉内核分配一个loop设备把普通文件当作块设备来挂载。挂载成功之后你可以用df -h /mnt/testdisk看到这个64MB的文件系统也可以用losetup -a查看到对应的loop设备。如果是新版本内核的util-linux卸载的时候系统通常会自动帮我们detach loop设备后面细说。第三步正常卸载umount /mnt/testdisk这很正常对不对真正有意思的测试来了。你先cd进挂载点然后在后台挂一个sleep进程再尝试卸载cd /mnt/testdisk sleep 300 umount /mnt/testdisk我敢打赌你会看到类似这样的输出umount: /mnt/testdisk: target is busy.这个target is busy就是今天的主角。因为cd进去之后当前shell的工作目录变成了挂载点相当于有了一个对目录节点的引用。哪怕sleep本身没有打开任何文件光是这个进程的工作目录在挂载点里就已经足够阻止卸载了。你可以试试先退出目录、杀掉后台进程再执行卸载一切恢复正常。这个实验虽然简单却把内核引用计数的思想暴露得明明白白。1.3 umount常用的几个参数到底该怎么选umount的常用参数并不算多但很多人记不住它们各自的适用场景导致用错参数后问题没解决反而埋下隐患。我把常用参数整理成一张表后面各章会逐个展开细讲参数作用适用场景无参数按挂载点或设备名卸载常规本地文件系统卸载-l懒卸载先把挂载点从目录树剥离后台等待占用释放网络文件系统卡死、服务端不可达-f强制卸载NFS等网络文件系统、进程无法杀掉的极端场景-R递归卸载挂载点下所有子挂载出现嵌套挂载时-v显示详细执行信息调试、排查时-a卸载fstab中所有标记为可卸载的文件系统关机前批量卸载手动执行需谨慎-n卸载时不更新/etc/mtab老系统的兼容选项现代系统已基本用不到这里要给一个忠告参数是在你判断清楚原因之后才选的不是用来乱试的。很多人上来就umount -f其实本地文件系统的-f绝大部分时候不会生效反而会让你忽略真正的问题所在。后面第4章我会专门解释这是为什么。2. 为什么umount会报target is busy2.1 最常见原因进程还赖在挂载点里target is busy的底层原因我可以用一个生活场景来解释。你在房间里挂了一块白板上面贴满了便利贴现在想把白板收起来但还有同事正站在白板前记录、有人手里拿着白板笔没放下你说收就收肯定会把人搞懵。内核也是一样的逻辑它需要保证所有访问文件系统的路径都关掉之后才允许把文件系统摘下来。最常见的赖着不走就是有进程的工作目录cwd还在挂载点里。前面实验里的sleep进程就是典型例子。除此之外还有类型多样的文件句柄日志文件、PID文件、socket文件、共享库映射等。只要任何一个进程打开过挂载点目录下的文件卸载就会失败。我遇到过最典型的一次是一个Java应用把日志目录挂在了/data/logs我尝试卸载时一直失败。用fuser等工具定位后才发现应用进程不光打开了日志文件还把当前工作目录也切到了日志目录下结果数据盘只能等应用窗口期重启后再卸。这样的问题在排查之前很难从表面看出来因为你只执行了一个umount命令内核却要检查整个挂载点下的所有引用。2.2 容易被忽略的隐藏引用嵌套挂载除了进程占用嵌套挂载是第二个高频原因而且它比进程占用更隐蔽。所谓嵌套挂载就是在一个挂载点下面又挂了一个文件系统。比如你挂载了/data然后在/data/sub下又挂载了一块新的数据盘此时如果你直接在根上执行umount /data内核同样会告诉你target is busy。为什么因为/data这个挂载点下面还挂着一个子文件系统如果直接卸载/data/data/sub这个子挂载点就会变成悬空的里面的文件不是不见了而是进入了无法通过正常路径访问的奇怪状态。所以内核在有子挂载存在时会拒绝卸载父挂载点本质上也是一种保护机制。这种问题怎么发现用findmnt -R /data可以递归列出挂载点下的所有子挂载一目了然。卸载时则有两个思路要么手动先把子挂载卸掉再卸父挂载要么直接umount -R /data让命令帮你递归处理。但要注意-R是util-linux的扩展嵌入式环境里的busybox不一定支持后面我会再提。2.3 如何用mount和findmnt核对当前挂载状态排查任何umount问题之前第一件事永远是看清楚现在到底挂载了什么。很多人习惯用mount命令查看挂载信息这在老系统里没问题但在现代Linux系统上我更推荐findmnt它的输出格式更清晰还支持按目录树展示层级关系。常用的几条命令# 查看所有挂载点 findmnt # 查看指定挂载点或目录被哪个文件系统覆盖 findmnt -T /mnt/testdisk # 递归查看挂载点下的所有子挂载 findmnt -R /mnt/testdisk # 查看内核实际的挂载表 cat /proc/self/mounts/proc/self/mounts是内核提供的实时挂载信息不依赖用户的/etc/mtab所以它是系统最真实的挂载状态。如果你看到/etc/mtab里的信息和实际不符多半是某个程序手动改过文件而这种情况在服务器上并不罕见。3. 定位占用进程的三种排查方式3.1 lsof先搞清楚谁打开了文件一旦确认umount失败是进程占用导致的下一步就是找出谁占用的。lsof是我用得最多的工具它能列出进程打开的文件列表。针对挂载点排查时有两种用法值得记住。第一种直接指定挂载点目录lsof /mnt/testdisk这条命令会列出所有打开该目录本身或其中文件的进程包括把cwd切到该目录的进程。输出里会包含进程名、PID、打开文件的类型、文件节点等信息。第二种是递归查找挂载点下的所有打开文件lsof D /mnt/testdiskD会递归遍历整个目录树对于挂载点下文件很多的场景更全面但代价是速度慢文件量大时可能明显卡顿。生产环境我一般先直接用lsof /mnt/testdisk没有结果再换D或者配合grep去扫lsof | grep /mnt/testdisk这种写法虽然土但在应急情况下往往最快尤其当你只记得关键词而不知道具体路径格式的时候。3.2 fuser快速列出并处理占用进程如果说lsof是精确定位那fuser就是快速扫描。fuser -v /mnt/testdisk可以直接显示当前有哪些进程正在使用这个挂载点输出里会标明进程的访问类型比如cwd表示当前工作目录、root表示根目录、open表示打开了文件、mmap表示映射了文件。# 仅查看 fuser -v /mnt/testdisk # 查看并终止占用进程谨慎使用 fuser -km /mnt/testdisk-k会向占用进程发送SIGKILL-m是要求把挂载点作为一个文件系统来匹配所有使用它的进程。这招在紧急情况下确实爽但有几点必须提醒第一它只适用于确认这些进程可以安全被杀掉的场景如果你一台生产服务器上跑了数据库贸然fuser -km等于直接让它异常崩溃第二-k默认发SIGKILL进程没有机会做清理工作日志、锁文件、缓冲区都可能出问题。所以我的习惯是先用fuser -v看清楚再手动决定是通知业务方重启进程还是干脆让进程自己退出最后实在不行才考虑强杀。3.3 一个完整的排查流程示例实验真实复现把前面几节串起来用我们之前创建的那个loop设备实验走一遍完整排查流程。假设文件系统已经挂载到/mnt/testdisk有进程占用了现在开始排查# 1. 先看挂载状态 findmnt /mnt/testdisk # 2. 尝试卸载复现问题 umount /mnt/testdisk umount: /mnt/testdisk: target is busy. # 3. 用fuser查看占用进程 fuser -v /mnt/testdisk USER PID ACCESS COMMAND /mnt/testdisk: root 2641 cwd sleep # 4. 用lsof做交叉验证 lsof /mnt/testdisk COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sleep 2641 root cwd DIR 0,45 1024 2 /mnt/testdisk两条命令都对同一个PID给出了结果确认就是sleep进程把工作目录停留在了挂载点。此时的处理方式取决于这个进程能不能安全结束。能安全结束就kill 2641然后重新卸载如果这是别人的应用进程你就要去和业务方确认了。最后的清理动作别忘了把loop设备解除关联# 如果umount没有自动释放loop设备手动释放 losetup -a losetup -d /dev/loop0有些老版本或者特殊挂载方式下umount之后loop设备不会自动detach手动losetup -d是一个好习惯否则loop设备会越积越多最终成为系统资源隐患。4. 强制卸载的三种姿势及风险控制4.1 懒卸载 umount -l什么时候用、怎么用umount -l是我处理NFS挂载卡死时最常用的一招。它的全称叫lazy unmount中文常常翻译成懒卸载。这个名字很有意思它做的事也确实很懒先立刻把挂载点从当前系统的目录树里剥离让新的路径访问无法再走这个挂载点同时把真正的卸载操作推迟到内核检测到该文件系统引用计数归零之后再执行。这就像是一个员工还在工位上敲代码但你已经把他的工位门禁停了、外部联系方式改了让他逐渐成为一个内部还在干活、对外已经失联的人。好处是立竿见影umount命令不会卡住也不会因为网络超时让你干等半小时坏处是如果那个进程还在持续读写数据可能处于一种路径上已经找不到、但句柄依然有效的微妙状态后续继续的IO虽然不会立刻报错但如果底层设备退出或者网络连接彻底断开这些IO就可能丢失或永久阻塞。所以我用umount -l的场景很明确要么是NFS服务端彻底不可达umount已经卡死到无法容忍要么是我已经决定了这台机器接下来会重启先卸掉挂载点让业务路径上不出现故障重启后再彻底清理。4.2 强制卸载 umount -f为什么它救不了本地磁盘很多人把umount -f当成万能钥匙实际上它在本地文件系统上经常毫无作用。原因其实不难理解本地文件系统ext4、xfs等的卸载流程中内核在VFS层检查引用计数这一步是硬性的-f参数并不会绕过这个检查。它的强制语义主要是针对网络文件系统实现的——NFS这类文件系统在实现卸载回调时允许内核通过MNT_FORCE标志直接断开与RPC服务的关联。换句话说umount -f更像是一个我这个客户端不伺候了的声明适用于服务端失联、RPC层无响应的网络文件系统。对本地磁盘执行umount -f时内核要走的那套确认引用已经释放的流程一个都不会少如果还是busy依然busy。实际操作中偶尔会出现一种情况某些网络文件系统挂载已经进入了假死状态普通umount卡死umount -f能立即返回。这里要注意返回成功只代表内核层面的挂载关系断开了但进程持有的旧句柄和未写完的缓存可能依然存在数据一致性风险由你自行承担。4.3 实在卸不掉怎么办重启、单用户与系统封装有一些极端场景进程是内核态的、PID在/proc里根本找不到或者占用者连fuser -km都杀不掉这时候怎么办我的经验是别再和内核硬刚了考虑重启或单用户模式。重启会把所有文件系统重新初始化挂载关系彻底重建是最粗暴但最可靠的兜底方案。还有一种场景是根文件系统或关键系统目录上的挂载点卸载困难。比如你要对根分区做文件系统检查但根分区本身是只读挂载的或者目录被系统进程占用。此时可以进入单用户模式systemctl isolate rescue.target在这个模式下网络服务、多用户进程都不会启动占用最少卸载成功的概率最高。这里有一个很多人容易忽略的点当你使用systemd管理的系统时某些挂载点可能挂载在由systemd创建的挂载单元上。如果直接卸载systemd可能会因为mount单元还处于active状态而自动重新挂载。这种情况下最稳妥的方式是systemctl stop 挂载点.mount让systemd按单元生命周期去处理而不是绕过它直接umount。方案适用场景主要风险umount -lNFS卡死、需要快速脱离旧句柄存在、IO可能永久阻塞umount -fNFS服务端失联数据丢失、缓存不落盘reboot/ 单用户模式本地busy且进程无法清理业务中断、需要停机窗口5. NFS与网络文件系统的卸载实战5.1 NFS卸载为什么会卡到怀疑人生如果说本地文件系统的umount是讲道理那NFS的umount就是拼人品。NFS客户端和服务端之间通过RPC协议通信如果服务端宕机、网络断连或者服务端处于僵死状态客户端的NFS挂载会进入一种协议层等待的状态。此时你执行umount命令会尝试和RPC层确认状态但对方根本不理你于是命令就卡在那里有时候几分钟有时候甚至需要手动加超时。有人可能会问内核不是有全局的IO超时机制吗这取决于你的挂载参数。如果是hard挂载客户端基本上是无限期重试如果是soft挂载超时后才会返回错误。很多人在fstab里写NFS时习惯用默认的hard遇到临时故障就会明显体会到什么叫系统级别的假死。我还遇到过一种更隐蔽的情况NFS挂载点看似没有进程使用但内核的dentry缓存、inode缓存里依然保留着大量目录项信息VFS层在卸载时要做缓存回写和回收。如果缓存数据量很大即便没有活跃进程卸载也可能持续很长时间。所以处理NFS卸载要有缓存喝口水的时间的心理准备。5.2 正确的网络文件系统卸载顺序处理NFS卸载问题我的推荐顺序是第一步先确认是不是真的有进程占用findmnt /mnt/nfs lsof D /mnt/nfs fuser -v /mnt/nfs只要还有进程在引用这个挂载直接卸载必然失败。先把应用停下来或者至少让他们把工作目录切走、关掉打开的文件。第二步尝试常规卸载并给出可见的等待时间umount -v /mnt/nfs如果这条命令在几十秒内返回说明一切正常。如果卡住不要无限等下去直接CtrlC中断切换到下一步。第三步使用懒卸载兜底umount -l /mnt/nfs如果你确定这台机器后续不需要再访问这个NFS路径或者你马上要重启机器umount -l是最务实的方案。它会立刻让挂载点从目录树中消失后续业务不会再因为路径问题报错。第四步处理万一出现的仍显示挂载状态。umount -l之后在某些内核版本上findmnt和/proc/mounts可能还会短暂显示这个挂载点。这时候不要惊慌稍微等几秒再查或者直接cat /proc/self/mounts | grep nfs确认。另外如果是NFS4挂载卸载的时候尽量用umount -t nfs4指定类型避免systemd或mount工具因为类型判断的问题产生额外干扰。5.3 用fstab从源头避免再出问题网络文件系统真正让人头疼的不是卸载这一次操作而是它会反复出现服务器重启后因为网络没准备好挂载不上挂载之后因为参数不对出事时无法顺利卸载。解决这些问题fstab参数是关键。一个比较稳的NFS挂载示例# 设备 挂载点 类型 选项 192.168.10.20:/data /mnt/nfs nfs defaults,_netdev,nofail,soft,timeo50,retrans2,noatime 0 0我来逐个解释_netdev告诉systemd这是一个网络设备必须在网络就绪之后再挂载。没有这个参数开机时如果网卡还没起来挂载很可能失败。nofail挂载失败时不阻断系统启动避免因为NFS不可达导致开机卡在等待状态。softRPC请求超时后返回错误而不是无限重试这对避免系统级挂死很重要。但要明白soft模式对写入类操作有数据一致性风险所以如果你访问的是关键业务数据还要权衡。timeo50RPC超时时间单位是0.1秒50就是5秒。retrans2超时后最多重试2次防止无谓的长时间等待。noatime不更新访问时间减少NFS上的元数据操作能显著降低小文件场景下的RPC压力。我见过很多生产事故都源于fstab里少了nofail和_netdev一台机器在网络环境没准备齐全时开机光是等那个不可达的NFS挂载就等了十几分钟整个集群健康检查全部告警。加参数看似只是改一行字实际是在给系统增加容错能力。6. 与fstab联动让卸载和开机挂载配合得更好6.1 修改fstab后安全加载与测试在umount的日常使用中有一种需求很常见我改完/etc/fstab想在不重启的情况下让新配置生效或者验证配置没问题。这时候不能干等着重启正确做法是先执行mount -a让系统按fstab内容重新挂载所有标记为auto的条目。但mount -a是有副作用的它会尝试挂载fstab中所有没有标记noauto的文件系统万一你在编辑fstab时漏掉了一个括号或者写错了一个挂载点整个命令可能报一堆错甚至意外挂载了原本不想挂载的分区。所以我改fstab的习惯是三步走第一步备份cp /etc/fstab /etc/fstab.bak.$(date %F)第二步用findmnt --verify /etc/fstab检查语法。util-linux新版本提供了这个验证命令能自动检查字段数量、挂载点是否存在、文件系统类型格式是否正常非常实用。第三步再执行mount -a做真实挂载测试。测试通过后该卸载卸载、该验证验证确认无误再放心重启。6.2 临时挂载转持久挂载的几个坑场景很常见你在机器上手动mount了一块数据盘测试下来没问题决定写进fstab让它开机自动挂载。这个转正过程中有几个坑我一个个说。第一挂载点目录必须存在。fstab不会自动帮你创建目录如果/data这个目录不存在mount -a会直接失败。所以动手前先mkdir -p。第二写进fstab之前先确认手动卸载没问题。如果在手动挂载状态下还存在占用问题开机自动挂载后的卸载风险同样存在。比如某个进程会在开机后自动把cwd切进挂载点那这个挂载点就永远无法正常卸载。第三如果你是通过mount -o loop挂载镜像文件fstab里的设备字段要写镜像文件路径而不是loop设备的路径。因为loop设备每次开机的编号可能不同直接写/dev/loop0是在赌运气。第四字段顺序别搞错。fstab的格式固定是设备、挂载点、文件系统类型、挂载选项、dump、pass。很多人把ext4和defaults的位置写反结果系统启动时报wrong fs type。6.3 UUID、label与设备名的稳定性差别fstab里设备的写法直接影响后续umount与mount的稳定性。有三种写法设备名如/dev/sdb1、UUID如UUID8f3a2c5e-xxxx、卷标如LABELDATA。设备名的问题在于内核枚举磁盘的顺序不是固定的插拔硬盘、升级内核、调整BIOS启动项都可能导致/dev/sdb1变成/dev/sdc1。到时候你fstab里写的是sdb1可实际数据盘已经换号了开机要么挂载失败要么挂载到错误设备上。UUID是文件系统创建时生成的全局唯一标识只要你不重新格式化它就不变这是最稳妥的写法。获取UUID用blkidblkid /dev/sdb1卷标则是你在格式化时或者之后通过e2label设置的短名称适合人看但卷标可以重复、也可以后期被改掉稳定性不如UUID。在我的实践里普通数据盘一律用UUID只有NFS这类网络共享才写IP地址形式。这样不仅mount更可靠日后排查umount问题时也能从/proc/mounts里一眼看出哪块盘是哪个设备。7. 两个真实排障案例与平时的维护习惯7.1 案例一日志目录占用导致备份盘卸不下来有次我在处理一台备份服务器新挂了一块外置存储在/backup上备份任务跑完之后需要卸载换盘。执行umount /backup时系统一直报target is busy。一开始我以为是备份进程没退出可查了之后发现备份进程已经结束了。用lsof D /backup往下挖发现一个监控代理进程还驻留在那里。它初始化时把工作目录切到了/backup而后台运行时不占用任何文件句柄只是cwd挂在里面。正常情况下你不会觉得这个目录有什么问题因为它不吃内存、不占IO但这个挂着的cwd就是实实在在的引用挡住了卸载。处理方式很简单让该代理进程重启或者临时把它的工作目录切走问题就解决了。但如果当时我图省事直接用fuser -km /backup这个监控代理被杀掉之后系统监控会立刻报一个代理失联的告警又是一轮不必要的折腾。这个案例让我养成了一个习惯遇到busy永远先看是谁占的再决定怎么处理绝不做无脑强杀。7.2 案例二容器和嵌入式环境里的特殊处理容器场景下umount的坑比传统环境更深。容器有自己的mount namespace容器里挂载的文件系统在宿主机上可能表现为一层传播挂载。你在宿主机执行umount时会遇到挂载点消失后又被systemd或容器运行时自动重建的情况根源就是挂载传播事件在namespace之间传递。处理这类问题我的建议是优先在容器内部卸载或者使用nsenter -t 容器PID -m进入容器的mount namespace操作不要直接在宿主机上硬来。如果你对某个传播挂载非常头疼可以用mount --make-private把挂载点改成私有挂载阻断传播。嵌入式环境则经常是busybox的天下。busybox的umount实现通常很精简不支持-R、可能也不支持-l。我调试嵌入式Linux时遇到挂载点卸载失败多数时候还是先用fuser或lsof找进程然后把进程杀掉再卸。如果交叉编译环境里没有lsof可以手动翻/proc/*/cwd目录ls -l /proc/*/cwd 2/dev/null | grep /mnt/testdisk这招虽然笨但在没有现成工具的情况下往往能救命。7.3 我自己养成的几条umount小习惯做运维这么多年我总结了几条关于umount的个人习惯不一定适合所有人但值得参考。第一卸载前先sync。这条很多人不当回事但sync会把内核缓存里的数据强制刷到磁盘上避免你刚卸载完文件系统残留的脏页又给你带来不必要的风险。尤其在卸载移动硬盘、USB设备前这条几乎是保命级别的动作。第二卸载前习惯性先cd /。如果当前终端就是你自己的shellcd回到根目录可以在一定程度上避免你本人在不知情的情况下占用了挂载点。当然这不解决其他进程的占用问题但至少排除一个常见变量。第三平时测试挂载卸载宁可多用loop设备和镜像文件也不要在生产盘上反复折腾。像本文开头那样的64MB临时镜像完全够你复现绝大多数挂载卸载行为。养成在沙盒环境里试参数的习惯能帮你避开很多生产事故。第四处理完一次卸载故障后把命令和输出贴到自己的故障笔记里。很多人觉得umount的问题大同小异但具体到不同内核版本、不同文件系统、不同systemd版本行为差异能让人抓狂。我当时记录过一个案例旧内核上umount -l之后/proc/mounts里还能看到挂载项新内核上则不会再显示这种细节不记下来下次遇到只会更懵。老实说umount这个命令本身非常简单就是卸载文件系统而已难的一直是它背后的引用计数模型和那些看不见摸不着的隐藏占用。这一章如果你只记住一件事我觉得应该是不要和内核硬刚先把占用者找出来再选择最合适的卸法。这样无论你面对的是本地磁盘、NFS共享、容器挂载还是嵌入式环境大多数问题都能迎刃而解。
返回列表