我想挂载我的闪存驱动器,但错误地将挂载路径设置为/home/my_name
。现在,我的所有文档、下载、图片等都不可用,因为我的闪存驱动器已经取代了我以前的主文件夹。
当我进入终端并输入时,sudo umount /home/my_name
我收到错误消息:
umount: /home/my_name: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
有没有办法解决这个问题,我可以恢复我的旧/home/my_name
文件夹,然后将闪存驱动器安装到适当的位置?
答案1
在非空目录上挂载会隐藏其中包含的文件,这通常称为跟踪。这不会导致文件本身处于危险之中。您可以采取几个简单的步骤来排除故障、修复或(必要时)解决此问题。
确保您的 shell 不会阻止文件系统卸载。
对于安装在 的文件系统sudo fuser -km /home/my_name
,运行sudo fuser -km /home/my_name
以终止访问文件系统的所有进程(如您所做)通常足以让您卸载它。您报告说,当您执行此操作时,您的终端因此被关闭。
如果您在 shell 中的当前目录是您要卸载的挂载点或其子目录之一,就会发生这种情况。(您的 shell 被终止,然后运行它的终端程序会发现 shell 已关闭,并且在大多数设置下也会自动退出,就像您运行命令时一样exit
。)
要解决此问题,只需导航到挂载点之外并尝试再次卸载它。例如,您可以将目录更改为/
第一个:
cd /
sudo umount /home/my_name
查找并关闭或终止正在访问挂载文件的所有进程。
如果您不想使用 终止进程fuser
,或者无法终止进程但需要找出这些进程,则可以使用多种方法查找它们,包括一些图形实用程序。我将在此简要说明其中一种选项。
您可以lsof
在目录上运行以查看哪些进程正在访问其中的文件:
lsof /home/my_name
这对于挂载点很有效。有时,lsof
如果以 root 身份运行,则可以获得更好的信息,尽管这通常不是必需的:
sudo lsof /home/my_name
输出lsof
通常如下所示:
ek@Io:~$ sudo lsof ~/mnt/old
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
flock 15529 ek cwd DIR 7,0 2048 1280 /home/ek/mnt/old
flock 15529 ek 3rW REG 7,0 21114 1311 /home/ek/mnt/old/md5sum.txt
less 15530 ek cwd DIR 7,0 2048 1280 /home/ek/mnt/old
less 15530 ek 3r REG 7,0 21114 1311 /home/ek/mnt/old/md5sum.txt
less 15530 ek 5r REG 7,0 231 1325 /home/ek/mnt/old/README.diskdefines
bash 27465 ek cwd DIR 7,0 2048 1280 /home/ek/mnt/old
这会告诉您正在使用的文件和进程。特别是,如果您遇到 shell 阻止其卸载的情况,而您没有注意到这种情况,则lsof
可以使用以下输出将其清楚地显示出来:
ek@Io:~$ lsof ~/mnt/old
lsof: WARNING: can't stat() tracefs file system /sys/kernel/debug/tracing
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 27465 ek cwd DIR 7,0 2048 1472 /home/ek/mnt/old/boot
在上面的例子中,唯一能阻止文件系统被卸载的是,我使用我的 shell ( bash
) 导航到了挂载点的子目录,并且仍然在那里。
如果您需要有关某个进程的更多信息,一种方法是使用其进程 ID 运行,该进程 ID 在输出ps
的第二列中给出:lsof
ek@Io:~$ ps 27465
PID TTY STAT TIME COMMAND
27465 pts/3 Ss+ 0:04 -bash
您还可以通过进程的 PID 来终止进程(,但请根据您的情况使用适当的数字)。通常最好先尝试此方法,然后再使用更强的。(如果 ,该标志也可以正常工作。)kill 27465
kill -KILL 27465
-9
-KILL
当然,在使用该kill
命令或类似功能之前,最好先尝试以正常方式关闭程序,尤其是当可能存在重要数据时。例如,最好保存文档并关闭文字处理器,而不是使用该命令退出文字处理器kill
。
通过非递归绑定挂载访问影子文件。
作为保罗说是否可以访问被挂载“阴影”的文件?在超级用户,您可以通过创建绑定挂载并导航到挂载所阴影的文件来访问它们:
sudo mkdir /mnt/root
sudo mount --bind / /mnt/root
这些命令略微改编自保罗的精彩回答回答该问题。(我鼓励您查阅该页面以了解更多详细信息。)您不必使用/mnt/root
,但它和其他选择一样好。
如果您这样做,您的整个根文件系统都可以通过 访问/mnt/root
。
如果你有一个单独的/home
分区,那么你需要将绑定挂载绑定到该分区:
sudo mkdir /mnt/home
sudo mount --bind /home /mnt/home
这与 相同/
,只是带有/home
。
重启。
oldfred 的建议重新启动系统是解决此问题的合理方法。如果需要,您应该能够关闭并重新启动系统。您的数据被挂载所隐藏,但不应有丢失的风险。
重新启动应该是安全的,但如果您不想,您不需要重新启动来解决这个问题。如果您在使用上述方法时遇到问题并希望使它们发挥作用,请发表评论或(最好)编辑您的帖子。(其他遇到类似问题的人应该考虑发布新问题。)