当前位置: 首页>>技术教程>>正文


device-mapper:删除 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 提供的关联名称不再包括断开连接设备的名称。

最佳方法

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

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)

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

次佳方法

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

lvchange -a n [LVM_Group_name]

然后

cryptsetup -v luksClose [LUKS_name]

样本:

lvchange -a n My_vg_crypt
cryptsetup -v luksClose My_Crypt

第三种方法

下次试试懒卸载

umount -l /<folder>

这在大多数情况下对我有用,尤其适用于 hung-up NFS-drives。

第四种方法

以下是我在 Linux Mint 17.3 (~Ubuntu Trusty) 上解决这个问题的方法:

  1. 从 device-mapper 移除设备

    \n

    $ sudo dmsetup remove luks-xxyyzz\n
  2. 映射回来

    \n

    $ sudo cryptsetup open /dev/sdc1 luks-xxyyzz\nEnter passphrase for /dev/sdc1:\n

现在设备可以访问了。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13039.html,未经允许,请勿转载。