无法删除过时的卷

无法删除过时的卷

我有一个外部硬盘通过 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[被?]分离,我就无法摆脱这两个过时的卷esexternalstorage-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

  1. 关闭设备的所有用户,并根据需要备份设备数据。
  2. 用于umount卸载已安装该设备的所有文件系统。
  3. 从任何使用该设备的 md 和 LVM 卷中删除该设备。如果设备是 LVM 卷组的成员,则可能需要使用 pvmove 命令将数据移出设备,然后使用该vgreduce命令删除物理卷,并(可选)pvremove从磁盘删除 LVM 元数据。
  4. 如果设备使用多路径,请运行multipath -l并记下设备的所有路径。然后,使用 删除多路径设备multipath -f device
  5. 运行blockdev --flushbufsdevice 将任何未完成的 I/O 刷新到设备的所有路径。这对于原始设备尤其重要,因为原始设备中没有 umount 或 vgreduce 操作来导致 I/O 刷新。
  6. 删除系统上的应用程序、脚本或实用程序中对设备基于路径的名称(例如 或数字)的任何/dev/sd引用/dev/disk/by-pathmajor:minor这对于确保将来添加的不同设备不会被误认为是当前设备非常重要。
  7. 最后,从 SCSI 子系统中删除到设备的每个路径。为此,请使用命令echo 1 > /sys/block/device-name/device/deletewhere device-name may be sde,例如。此操作的另一个变体是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

相关内容