设备映射器:删除对luks-xxxx的ioctl操作失败:设备或资源忙

当我离开电脑一段时间后,我的加密USB驱动器不知何故意外卸载了(尽管当时它仍然物理连接着)。我还没有能够恢复(尚未尝试重新启动)。我现在已经完全断开了设备,但是当我尝试删除/dev/mapper中的悬空条目时,仍然显示"设备或资源忙"。我是否可以重新连接并挂载驱动器而无需重新启动?
以下是我尝试过的方法(长名称更改为"xxxxx")...
$ sudo dmsetup ls
luks-xxxxx (252:1)
luks-yyyyy (252:0)

$ sudo umount /dev/mapper/luks-xxxxx
umount: /dev/mapper/luks-xxxxx: not mounted

$ sudo fuser --kill /dev/mapper/luks-xxxxx
$ echo $?
1

$ sudo dmsetup info -c luks-xxxxx
Name       Maj Min Stat Open Targ Event  UUID
luks-xxxxx 252   1 L--w    1    1      0 CRYPT-LUKS1-xxxxx-luks-xxxxx

$ sudo dmsetup remove luks-xxxxx
device-mapper: remove ioctl on luks-xxxx failed: Device or resource busy
Command failed

重新连接设备后...
$ sudo cryptsetup luksOpen "/dev/sde1" "luks-xxxxx"
Device luks-xxxxx already exists.

[编辑]我解决了这个问题,这次是通过关闭一个没有打开文件但是从相关设备的文件夹中启动的GUI文本编辑器。所以问题变得更具体:如何确定哪个应用程序正在占用设备?
请注意,因为一旦设备断开连接,lsof似乎没有提供简单的解决方案,所以lsof提供的相关名称不再包括已断开设备的名称。

在CentOS上遇到了同样的问题。找到了这个链接:http://www.krenel.org/unable-to-remove-lvm-volumen-created-by-xen-device-or-resource-busy/,但是我没有显示设备已挂载。 - Lars Nordin
看起来与这个已关闭的修复错误报告非常相似:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=574126 - Brent Bradburn
警告:如本示例所示,使用sudo挂载可能会导致您无法通过用户空间文件管理器正常弹出。 - Brent Bradburn
这种情况最近对我来说并不常见,但今天发生了(我不小心拔掉了一个驱动器)。在Ubuntu 18.04上,错误信息是“无法激活设备,文件已存在”,但它并没有提供关于哪个文件(或者luks-xxxx名称)的详细帮助。幸运的是,我通过查看连接和未连接驱动器时的/dev/disk/by-uuid,成功找到了解决方法。解决方法与之前相同(先运行sudo dmsetup ls,然后运行sudo lsof |grep xxx,x,最后关闭/终止相关进程)。 - Brent Bradburn
6个回答

经过两年的努力,我终于完全解决了这个问题! dmsetup ls 命令可以提供你所需的数据。
$ sudo dmsetup ls
luks-xxxxx (252:1)

那么

sudo lsof |grep 252,1   ## notice translation: (252:1) => 252,1

似乎在某些情况下,sudo可能是至关重要的。
这应该为您提供关闭设备上所有打开文件所需的信息,包括打开文件的名称和有问题应用程序的进程ID。您可以尝试直接转到这些应用程序并关闭它们,但也可以采取一种强制性的方法,例如:
kill -9 (process ID)

一旦您关闭了所有文件,问题中显示的一些命令行工具可能是必要的,以便在正常重新打开之前关闭现有的挂载。

6请注意需要进行微小的翻译调整:(252:1) 应该翻译为 252,1 - Brent Bradburn
太棒了,谢谢你这个终于有效的回复! - Candid Dauth
3嗯,奇怪的是,lsof并没有显示任何进程在(陈旧的)设备上持有句柄。 - Frederick Nord
不幸的是 sudo lsof |grep 253:3 对我来说并没有起作用。在标准输出中没有任何结果,而在错误输出中却出现了数百个类似于 no pwd entry for UID 70 的错误提示。 - Tyler Rick
@TylerRick,注意需要进行轻微的翻译:(253:3) 变成了 grep 253,3。关于你的 stderr 问题我不清楚,但这个翻译可能是为了在标准输出上获得结果而必要的。 - Brent Bradburn
这还不错。虽然并非在每种情况下都适用(例如,当SCST有打开的文件时)。毕竟这么多年过去了,你会认为有人会创造一个能够显示绝对所有打开设备或文件的工具。唉。 - CR.

尝试在停止密码之前停止LVM组:
``` lvchange -a n [LVM_Group_name] ```
然后
``` cryptsetup -v luksClose [LUKS_name] ```
示例:
lvchange -a n My_vg_crypt
cryptsetup -v luksClose My_Crypt

2首先使用@nobar的答案,但在尝试kill -9之前,请尝试使用kill命令。然而,@nobar的解决方案对我来说不够有效-似乎是因为内核本身由于LVM设备映射而打开了该设备-这个答案解决了这个问题。 - Tom Hale
在我的情况下,被接受的答案中的grep没有找到任何匹配项,但这个方法有效。 - user000001

下次试试懒惰卸载。
umount -l /<folder>

这对我来说大多数时候都有效,尤其是在处理挂起的NFS驱动器时非常有用。

我尝试了这个,但对手头的问题没有帮助。我猜你实际上不能在NFS上使用LUKS,这只是一个试探性的建议。 - Brent Bradburn
这正是我的问题,我忘记了我需要先卸载映射的存储设备 :D - holms

这是我在Linux Mint 17.3(~Ubuntu Trusty)上解决这个问题的方法:
1. 从设备映射器中移除该设备 ``` $ sudo dmsetup remove luks-xxyyzz ```
2. 进行重新映射 ``` $ sudo cryptsetup open /dev/sdc1 luks-xxyyzz 为 /dev/sdc1 输入密码: ```
现在设备可以访问了。

2这篇帖子可能对某些人有所帮助,但正如问题中所指出的那样——有时候dmsetup remove会报告“命令执行失败”。 - Brent Bradburn

我曾经遇到过类似的情况,但无法通过移除luks-xxxx设备来解决问题。相反,我不得不移除ubuntu--vg-root
我的情况是:
  • 在设备被锁定之前,我不小心将其移除了。
  • 尝试在事后锁定或移除luks设备时,出现了一个“忙”错误信息。
  • 解锁同一设备失败,因为已经存在同名设备。
  • lsof没有显示该设备有任何打开的句柄。
帮助我的是拔掉物理设备,并使用以下命令移除ubuntu--vg-root设备:
sudo dmsetup remove ubuntu--vg-root

那时候,我能够用我平常的设置正常激活和解密外部设备。
udisksctl unlock -b /dev/sda3
sudo lvchange --activate y ubuntu-vg/root

我曾经遇到过一个类似的问题,是关于一块内部硬盘的。尽管卷组存在且可访问,但执行vgscan命令后没有返回任何结果,这时候我采取了最后的办法,终于解决了我的问题。 - Stanley F.

我在操作中意外关闭了一个加密的USB驱动器,结果出现了这个问题。 我进行了大量研究——阅读了许多论坛上提出的问题。 在尝试了一堆其他的解决方案(并且弄糟了其中一个可能有效的方案)并注意到对很多人来说,它似乎在某个时间点神奇地自行修复后,我尝试了显而易见的简单解决方法:

重新启动

神奇!计算机忘记了所有的烦恼,并愉快地挂载了驱动器。


1如果你不介意重新启动的话,当然可以!我之所以问这个问题,只是因为我想避免被一个反复出现的问题强制重新启动。 - Brent Bradburn
2哦!就在你的问题中,明确地说着“无需重新启动”。抱歉。在我查看的所有问题中,这个问题似乎提供了一些最有帮助的信息(而且仍然在我的浏览器中打开),所以我决定在这里留下我的评论来“补充”信息。显然,我没有回去重新阅读问题,至少承认我的“答案”并没有回答到位。抱歉,并感谢你指出这一点;我会更加小心的。 - Charles Boling