在某些情况下,当您尝试卸载文件系统尤其是NFS时,它会显示“设备正忙”消息。当NFS服务器有一些问题(主要是无法访问)并且您有一个软NFS挂载时,通常会发生这种情况。
如果正常NFS卸载失败,我们可以尝试不同的方法和选项。在本教程中,我将解释如何在Linux中执行强制卸载。
在我们的场景中,我们有一个NFS文件系统安装在/var/student目录上。
让我们首先使用df命令显示所有挂载的目录。
# df -hFilesystem Size Used Avail Use% Mounted on/dev/vda1 20G 1.3G 18G 7% /devtmpfs 236M 0 236M 0% /devtmpfs 245M 0 245M 0% /dev/shmtmpfs 245M 8.4M 237M 4% /runtmpfs 245M 0 245M 0% /sys/fs/cgrouptmpfs 49M 0 49M 0% /run/user/010.128.20.241:/var/student 20G 1.3G 18G 7% /mnt/nfs/student_srv10.128.20.241:/home 20G 1.3G 18G 7% /mnt/nfs/home_srv当我们尝试卸载远程分区时,我们会收到一条错误消息。以下示例显示卸载失败,因为设备正忙:
# umount /mnt/nfs/student_srv/umount.nfs4: /mnt/nfs/student_srv: device is busy1)使用 lsof
lsof (列出打开的文件)命令显示特定文件系统、目录或设备上所有打开的文件以及与它们关联的进程的列表。默认情况下,它会列出当前打开的所有文件、共享库和目录,并提供尽可能多的关于它们的信息。
在这里,我们可以使用lsof命令找到与我们的挂载点对应的PID(进程ID),然后杀死该进程。
# lsof /mnt/nfs/student_srv/COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEbash 24098 root cwd DIR 253,1 4096 519062 /mnt/nfs/student_srvbash 24125 root cwd DIR 253,1 4096 519062 /mnt/nfs/student_srvvim 24144 student cwd DIR 253,1 4096 519062 /mnt/nfs/student_srv这里我们有使用挂载目录的进程的3个PID。您可以看到vim命令,这意味着“student”用户正在编辑文件。你可以通知用户停止他的动作或终止进程。
现在,让我们看看结果:
# lsof /mnt/nfs/student_srv/COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEbash 24098 root cwd DIR 253,1 4096 519062 /mnt/nfs/student_srvbash 24125 root cwd DIR 253,1 4096 519062 /mnt/nfs/student_srv你可以看到我们的用户已经停止了他的修改,但我们仍然有bash命令在执行,但我们不知道为什么。我们现在可以使用kill命令杀死这两个进程。
现在我们将杀死第一个bash进程
# kill -9 24098
我们可以验证结果
# lsof /mnt/nfs/student_srv/COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEbash 24125 root cwd DIR 253,1 4096 519062 /mnt/nfs/student_srv我们可以看到有一个进程被杀死
# kill -9 24125现在让我们验证第二个过程
# lsof /mnt/nfs/student_srv/现在让我们尝试卸载文件夹
# umount /mnt/nfs/student_srv/umount: /mnt/nfs/student_srv/: not mounted我们的操作已自动卸载文件夹,但让我们使用df命令检查。
# df -hFilesystem Size Used Avail Use% Mounted on/dev/vda1 20G 1.3G 18G 7% /devtmpfs 236M 0 236M 0% /devtmpfs 245M 0 245M 0% /dev/shmtmpfs 245M 8.3M 237M 4% /runtmpfs 245M 0 245M 0% /sys/fs/cgrouptmpfs 49M 0 49M 0% /run/user/010.128.20.241:/home 20G 1.3G 18G 7% /mnt/nfs/home_srv从输出中,我们可以看到目录/mnt/nfs/student_srv已从系统中卸载。
2)使用fuser
fuser(查找用户进程)命令有助于识别阻止您卸载文件系统的进程。它查找与您作为命令行参数提供的任何文件、目录或文件系统挂载点相关联的用户进程。
# fuser /mnt/nfs/student_srv//mnt/nfs/student_srv: 24191c我们可以使用带有-m选项的fuser命令,该选项列出访问文件系统上的文件或挂载点的所有进程,以及-v显示结果的选项,例如带有PID、用户和执行命令的ps命令。
# fuser -mv /mnt/nfs/student_srv/ USER PID ACCESS COMMAND/mnt/nfs/student_srv: root kernel mount /mnt/nfs/home_srv root 24191 ..c.. bash root 24275 ..c.. bash student 24290 ..c.. vim您可以看到正在执行的命令。
# fuser -mv /mnt/nfs/student_srv/ USER PID ACCESS COMMAND/mnt/nfs/student_srv: root kernel mount /mnt/nfs/home_srv root 24191 ..c.. bash root 24275 ..c.. bash-k使用fuser命令,可以不使用kill命令直接杀死正在执行的进程
# fuser -kmv /mnt/nfs/student_srv/ USER PID ACCESS COMMAND/mnt/nfs/student_srv: root kernel mount /mnt/nfs/home_srv root 24191 ..c.. bash root 24275 ..c.. bash检查结果
# fuser -mv /mnt/nfs/student_srv/ USER PID ACCESS COMMAND/mnt/nfs/student_srv: root kernel mount /mnt/nfs/home_srv似乎只有挂载在执行。让我们尝试卸载文件夹
# umount /mnt/nfs/student_srv/我们没有更多的错误消息。检查挂载点
# df -hFilesystem Size Used Avail Use% Mounted on/dev/vda1 20G 1.3G 18G 7% /devtmpfs 236M 0 236M 0% /devtmpfs 245M 0 245M 0% /dev/shmtmpfs 245M 8.3M 237M 4% /runtmpfs 245M 0 245M 0% /sys/fs/cgrouptmpfs 49M 0 49M 0% /run/user/010.128.20.241:/home 20G 1.3G 18G 7% /mnt/nfs/home_srv我们可以看到该/mnt/nfs/student_srv文件夹已按照我们的意愿卸载。
3) lazy卸载
卸载命令具有-l执行延迟卸载的选项(需要内核2.4.11或更高版本)。挂载将从文件系统命名空间中删除(因此您将不会再看到它/mnt/nfs/student )但它保持挂载,因此访问它的程序可以继续这样做。当最后一个访问它的程序退出时,卸载实际上会发生。
# fuser -mv /mnt/nfs/student_srv/ USER PID ACCESS COMMAND/mnt/nfs/student_srv: root kernel mount /mnt/nfs/home_srv root 24366 ..c.. bash root 24381 ..c.. bash student 24398 ..c.. vim我们可以看到该文件夹正忙。现在让我们尝试做一个惰性卸载
# umount -l /mnt/nfs/student_srv/我们没有错误消息。我们将检查命令是否被正确执行
# echo $?0现在让我们检查挂载点
# df -hFilesystem Size Used Avail Use% Mounted on/dev/vda1 20G 1.3G 18G 7% /devtmpfs 236M 0 236M 0% /devtmpfs 245M 0 245M 0% /dev/shmtmpfs 245M 8.4M 237M 4% /runtmpfs 245M 0 245M 0% /sys/fs/cgrouptmpfs 49M 0 49M 0% /run/user/010.128.20.241:/home 20G 1.3G 18G 7% /mnt/nfs/home_srv我们可以看到挂载点/mnt/nfs/student_srv没有再次出现,但正如我们之前所说,例如,我们的'student'用户仍在修改他的文件,可以创建新文件等。在服务器上,我们可以看到用户正在修改。
由于紧急情况,我们可能需要卸载分区,或者只是删除设备,但由于该设备正忙,可能会出现问题。在决定解决问题的方法之前,检查系统上的每个进程非常重要。lsof和fuser命令可以轻松识别阻止您卸载文件系统的进程。最后,如果您想使用强制卸载使用-f选项。
# umount -f -l /mnt/nfs/student_srv/结论
在本教程中,我们了解了当您无法在Linux和Unix风格的系统中卸载时可用的不同选项。所有提到的强制卸载选项都应该适用于所有Linux发行版,如Ubuntu、Mint等。