在 Linux 中强制卸载的 3 种方法显示“设备正忙”

在某些情况下,当您尝试卸载文件系统尤其是NFS时,它会显示设备正忙消息。当NFS服务器有一些问题(主要是无法访问)并且您有一个软NFS挂载时,通常会发生这种情况。

如果正常NFS卸载失败,我们可以尝试不同的方法和选项。在本教程中,我将解释如何在Linux中执行强制卸载。

在我们的场景中,我们有一个NFS文件系统安装在/var/student目录上。

让我们首先使用df命令显示所有挂载的目录。

# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 20G 1.3G 18G 7% /
devtmpfs 236M 0 236M 0% /dev
tmpfs 245M 0 245M 0% /dev/shm
tmpfs 245M 8.4M 237M 4% /run
tmpfs 245M 0 245M 0% /sys/fs/cgroup
tmpfs 49M 0 49M 0% /run/user/0
10.128.20.241:/var/student 20G 1.3G 18G 7% /mnt/nfs/student_srv
10.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 busy

1)使用 lsof

lsof (列出打开的文件)命令显示特定文件系统、目录或设备上所有打开的文件以及与它们关联的进程的列表。默认情况下,它会列出当前打开的所有文件、共享库和目录,并提供尽可能多的关于它们的信息。

在这里,我们可以使用lsof命令找到与我们的挂载点对应的PID(进程ID),然后杀死该进程。

# lsof /mnt/nfs/student_srv/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 24098 root cwd DIR 253,1 4096 519062 /mnt/nfs/student_srv
bash 24125 root cwd DIR 253,1 4096 519062 /mnt/nfs/student_srv
vim 24144 student cwd DIR 253,1 4096 519062 /mnt/nfs/student_srv

这里我们有使用挂载目录的进程的3PID。您可以看到vim命令,这意味着“student”用户正在编辑文件。你可以通知用户停止他的动作或终止进程。

现在,让我们看看结果:

# lsof /mnt/nfs/student_srv/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 24098 root cwd DIR 253,1 4096 519062 /mnt/nfs/student_srv
bash 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 NAME
bash 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 -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 20G 1.3G 18G 7% /
devtmpfs 236M 0 236M 0% /dev
tmpfs 245M 0 245M 0% /dev/shm
tmpfs 245M 8.3M 237M 4% /run
tmpfs 245M 0 245M 0% /sys/fs/cgroup
tmpfs 49M 0 49M 0% /run/user/0
10.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 -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 20G 1.3G 18G 7% /
devtmpfs 236M 0 236M 0% /dev
tmpfs 245M 0 245M 0% /dev/shm
tmpfs 245M 8.3M 237M 4% /run
tmpfs 245M 0 245M 0% /sys/fs/cgroup
tmpfs 49M 0 49M 0% /run/user/0
10.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 -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 20G 1.3G 18G 7% /
devtmpfs 236M 0 236M 0% /dev
tmpfs 245M 0 245M 0% /dev/shm
tmpfs 245M 8.4M 237M 4% /run
tmpfs 245M 0 245M 0% /sys/fs/cgroup
tmpfs 49M 0 49M 0% /run/user/0
10.128.20.241:/home 20G 1.3G 18G 7% /mnt/nfs/home_srv

我们可以看到挂载点/mnt/nfs/student_srv没有再次出现,但正如我们之前所说,例如,我们的'student'用户仍在修改他的文件,可以创建新文件等。在服务器上,我们可以看到用户正在修改。

由于紧急情况,我们可能需要卸载分区,或者只是删除设备,但由于该设备正忙,可能会出现问题。在决定解决问题的方法之前,检查系统上的每个进程非常重要。lsoffuser命令可以轻松识别阻止您卸载文件系统的进程。最后,如果您想使用强制卸载使用-f选项。

# umount -f -l /mnt/nfs/student_srv/

结论

在本教程中,我们了解了当您无法在LinuxUnix风格的系统中卸载时可用的不同选项。所有提到的强制卸载选项都应该适用于所有Linux发行版,如UbuntuMint等。


版权声明:本文为taoxicun原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。