LVM引起的云计算OpenStack重大故障

137 阅读2分钟

📒 让我们站在以年为节点的时间线上,看看一年时间做了什么、未来还能做什么

背景介绍

在云计算或者OpenStack的集群,如果存储方面是通过FC或ISCSI协议访问块存储,那么/etc/lvm/lvm.conf 的配置可能会产生隐患,问题表现报错可能是块设备被占用 map in use的错误。lsof 根本无法探测到占用的进程或用户。

简单来说,如果宿主机系统的LVM配置是默认配置,并且云镜像的根分区通过LVM构建,那么使用FC或ISCSI发放的虚拟就可能产生如下问题

  • 卷卸载不掉
  • 计算节点宿主机启动进入虚拟机的系统、或无法启动

LVM设备扫描

在操作系统启动时,会运行 vgscan 命令扫描系统上的块设备查找 LVM 标签,以确定哪些是物理卷,读取元数据并构建卷组列表。出现问题的原因就是LVM服务扫描到了带有lvm标签的云盘。

docs.redhat.com/zh_hans/doc…

当 lvmetad 守护进程运行时,/etc/lvm/lvm.conf 文件中的 filter = 设置不会在执行 pvscan --cache device 命令时应用。要过滤设备,您需要使用 global_filter = 设置。未通过全局筛选,且不会被 LVM 打开的设备,永远不会被扫描。例如,您可能需要使用全局过滤器,例如,当在虚拟机中使用 LVM 设备,且您不希望虚拟机中设备的内容被物理主机扫描时。

默认过滤器会添加所有发现的设备,因为配置文件中没有配置过滤器:

filter = [ "a/.*/" ]

以下过滤器删除了 cdrom 设备,以避免在驱动器没有介质时的延迟:

filter = [ "r|/dev/cdrom|" ]

下面的过滤器添加了所有 loop,并删除了所有其他块设备:

filter = [ "a/loop.*/", "r/.*/" ]

下面的过滤器添加了所有 loop 和 IDE,并删除了所有其他块设备:

filter =[ "a|loop.*|", "a|/dev/hd.*|", "r|.*|" ]

下面的过滤器只添加第一个 IDE 驱动器中的分区 8,同时删除所有其它块设备:

filter = [ "a|^/dev/hda8$|", "r/.*/" ]

End:总结与期待

LVM的引入,在物理设备上增加了一层逻辑设备,增加了系统复杂性。

如非必要,不要使用LVM构建根分区,安装操作系统。不建议使用LVM构建制作云镜像(公有云中关于自定义镜像制作均有说明)。