我有一个外部硬盘通过 USB 连接到我的 Ubuntu 笔记本电脑。整个硬盘均经过 LUKS 加密。加密层旁边有一个我安装到的 LVM 卷/mnt/es
。打开后,lsblk
看到的一切是:
sdc 8:32 0 2.7T 0 disk
└─es (dm-6) 252:6 0 2.7T 0 crypt
└─externalstorage-externalstorage (dm-7) 252:7 0 2.7T 0 lvm /mnt/es
有时,硬盘驱动器会以某种方式与卷“分离”,在这种情况下,数据将无法访问:
sdc 8:32 0 2.7T 0 disk
es (dm-6) 252:6 0 2.7T 0 crypt
└─externalstorage-externalstorage (dm-7) 252:7 0 2.7T 0 lvm
我注意到,这种情况通常发生在笔记本电脑进入睡眠状态时。
现在的问题是,一旦sdc
[被?]分离,我就无法摆脱这两个过时的卷es
并externalstorage-externalstorage
再次重用它们的名称。我做的第一件事就是umount /mnt/es
一切顺利。但是,即使未安装该卷,我也无法删除它:
dmsetup remove --force /dev/mapper/externalstorage-externalstorage
device-mapper: resume ioctl on externalstorage-externalstorage failed: Invalid argument
device-mapper: remove ioctl on externalstorage-externalstorage failed: Device or resource busy
Command failed
该info
命令显示该卷已打开:
dmsetup info -c /dev/mapper/externalstorage-externalstorage
Name Maj Min Stat Open Targ Event UUID
externalstorage-externalstorage 252 7 L--w 1 1 0 LVM-R4bAWzxJ8Cy3MBIjmPps60Rd3cFVyBStxTeKaR6gBHdefTYfJNWhHfA8tzqOBHns
这似乎是保持音量的原因,但它并没有告诉我太多信息:
fuser -m /dev/mapper/externalstorage-externalstorage
Cannot stat file /proc/5687/fd/4: Stale file handle
Cannot stat file /proc/5687/fd/5: Stale file handle
Cannot stat file /proc/5687/fd/6: Stale file handle
Cannot stat file /proc/5687/fd/7: Stale file handle
Cannot stat file /proc/5687/fd/11: Stale file handle
从 LVM 的角度来看,它也无法访问:
pvdisplay
/dev/externalstorage/externalstorage: read failed after 0 of 4096 at 2981780979712: Input/output error
/dev/externalstorage/externalstorage: read failed after 0 of 4096 at 2981781037056: Input/output error
/dev/externalstorage/externalstorage: read failed after 0 of 4096 at 0: Input/output error
/dev/externalstorage/externalstorage: read failed after 0 of 4096 at 4096: Input/output error
有趣的是,此时cryptsetup luksClose es
可以重复任意多次,而不会产生任何可见的影响或错误消息。
那么我怎样才能摆脱这些过时的卷(除了重新启动之外)?有什么方法可以从一开始就防止问题发生,即为什么会sdc
时不时地分离?
[Ubuntu 14.04.3 LTS,内核 3.19.0-42-generic]
更新
vgchange -an
产生与上面类似的错误:
/dev/mapper/es: read failed after 0 of 4096 at 3000590794752: Input/output error
/dev/mapper/es: read failed after 0 of 4096 at 3000590876672: Input/output error
/dev/mapper/es: read failed after 0 of 4096 at 0: Input/output error
/dev/mapper/es: read failed after 0 of 4096 at 4096: Input/output error
/dev/externalstorage/externalstorage: read failed after 0 of 4096 at 2981780979712: Input/output error
/dev/externalstorage/externalstorage: read failed after 0 of 4096 at 2981781037056: Input/output error
/dev/externalstorage/externalstorage: read failed after 0 of 4096 at 0: Input/output error
/dev/externalstorage/externalstorage: read failed after 0 of 4096 at 4096: Input/output error
答案1
这更像是猜测,但看起来您需要先停用 lvm,然后才能删除 crypt 映射,基本上是从内部返回:
首先,您需要卸载 lvm 上的所有过时的文件系统:
umount -f /mnt/es
然后停用您似乎拥有的 lvm在上面密码设置。即使您有其他 vg,以下操作也应该停用任何可能的功能,而不会损害使用任何其他 vg 的系统:
vgchange -an
之后,您可以使用 dmsetup 删除 cryptsetup 创建的映射(!)
dmsetup remove externalstorage
(有些名字可能记错了,欢迎指正)
这似乎是一个基本问题,在睡眠期间,你的USB驱动器从总线上掉下来,当它回来时,块系统发现sdb消失了,尽管现在有一个sdc。
答案2
- 关闭设备的所有用户,并根据需要备份设备数据。
- 用于
umount
卸载已安装该设备的所有文件系统。 - 从任何使用该设备的 md 和 LVM 卷中删除该设备。如果设备是 LVM 卷组的成员,则可能需要使用 pvmove 命令将数据移出设备,然后使用该
vgreduce
命令删除物理卷,并(可选)pvremove
从磁盘删除 LVM 元数据。 - 如果设备使用多路径,请运行
multipath -l
并记下设备的所有路径。然后,使用 删除多路径设备multipath -f device
。 - 运行
blockdev --flushbufs
device 将任何未完成的 I/O 刷新到设备的所有路径。这对于原始设备尤其重要,因为原始设备中没有 umount 或 vgreduce 操作来导致 I/O 刷新。 - 删除系统上的应用程序、脚本或实用程序中对设备基于路径的名称(例如 或数字)的任何
/dev/sd
引用/dev/disk/by-path
。major:minor
这对于确保将来添加的不同设备不会被误认为是当前设备非常重要。 - 最后,从 SCSI 子系统中删除到设备的每个路径。为此,请使用命令
echo 1 > /sys/block/device-name/device/delete
where device-name may besde
,例如。此操作的另一个变体是echo 1 > /sys/class/scsi_device/h:c:t:l/device/delete
,其中h
是 HBA 编号,c
是 HBA 上的通道,t
是 SCSI 目标 ID,l
是 LUN。
欲了解更多详情,请参阅红帽文档!
您还可以使用sg_utils
脚本来删除陈旧的卷重新扫描-scsi-bus.sh!