设备映射器:删除 luks-xxxx 上的 ioctl 失败:设备或资源繁忙

nob*_*bar 35 umount luks 13.10

当我离开我的电脑时,我的加密 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
Run Code Online (Sandbox Code Playgroud)

重新连接设备后...

$ sudo cryptsetup luksOpen "/dev/sde1" "luks-xxxxx"
Device luks-xxxxx already exists.
Run Code Online (Sandbox Code Playgroud)

[编辑] 这一次,我通过关闭没有打开文件但已从相关设备上的文件夹启动的 GUI 文本编辑器解决了该问题。所以问题变得更加具体:您如何确定哪个应用程序使设备保持打开状态?

请记住,这lsof似乎不是一个简单的解决方案,因为一旦设备断开连接,提供的关联名称lsof不再包括断开连接的设备的名称。

nob*_*bar 35

经过两年的斗争,我想我终于完全破解了它!

dmsetup ls 为您提供所需的数据:

$ sudo dmsetup ls
luks-xxxxx (252:1)
Run Code Online (Sandbox Code Playgroud)

然后

sudo lsof |grep 252,1
Run Code Online (Sandbox Code Playgroud)

这似乎sudo在这里很关键——至少在某些情况下是这样。


这应该为您提供关闭设备上所有打开文件所需的信息——包括打开文件的名称和违规应用程序的进程 ID。您可以简单地转到这些应用程序并关闭它们,但蛮力方法可能类似于:

kill -9 (process ID)
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意所需的轻微翻译:`(252:1)` 变为 `252,1`。 (5认同)
  • 嗯。奇怪的是,lsof 没有显示任何持有(陈旧)设备上句柄的进程。 (4认同)

小智 14

尝试在停止密码之前停止 LVM 组:

lvchange -a n [LVM_Group_name]

然后

cryptsetup -v luksClose [LUKS_name]

样本:

lvchange -a n My_vg_crypt
cryptsetup -v luksClose My_Crypt
Run Code Online (Sandbox Code Playgroud)

  • 首先使用 [@nobar's answer](http://askubuntu.com/a/682007/478705)(但在 `kill -9` 之前尝试 `kill`)。然而,@nobar 的解决方案对我来说还不够——似乎内核本身因为 LVM 设备映射而打开了设备——这个答案解决了这个问题。 (2认同)