问题描述
当我离开我的电脑时,我的加密 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) 上解决这个问题的方法:
-
从 device-mapper 移除设备
\n
$ sudo dmsetup remove luks-xxyyzz\n
-
映射回来
\n
$ sudo cryptsetup open /dev/sdc1 luks-xxyyzz\nEnter passphrase for /dev/sdc1:\n
现在设备可以访问了。