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

设备映射器:删除 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就不再包含断开连接的设备的名称。

答案1

经过两年的奋斗,我想我终于彻底解决了它!

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)

一旦关闭了所有文件,可能需要使用问题中显示的一些命令行工具来关闭现有的挂载,然后才能正常重新打开它。

答案2

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

lvchange -a n [LVM_Group_name]

然后

cryptsetup -v luksClose [LUKS_name]

样本:

lvchange -a n My_vg_crypt
cryptsetup -v luksClose My_Crypt

答案3

下次尝试惰性卸载

umount -l /<folder>

对于我来说,大多数情况下这都是有效的,尤其对于挂起的 NFS 驱动器很有用。

答案4

我遇到过类似的情况,但无法通过移除设备来解决问题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

相关内容