我有一个设置,其中一个通过光纤通道连接的 SAN 存储可供两个主机(在块级别)访问。我想在存储上创建两个 lvm2 物理卷:和pv1
,pv2
目前它们分别是两个卷组的唯一成员:vg1
和vg2
。我的主机应该独占使用它们,并且“不要触碰另一个”。
由于 SAN 对两台主机都可见,因此 lvm 结构对两台主机都可见。(我测试过:在一台主机上创建逻辑卷会导致它们在 /dev/mapper 下对另一台主机可见)。我想确保只会host1
修改vg1
并且host2
只会修改vg2
以防止数据损坏。
是否可以保证当我不明确执行任何 lvm 命令时,lvm 守护进程和内核不会重新调整范围/优化属于其他主机的卷组,从而损坏它?
答案1
不,仅让 VG 在两个系统上都可见不会损坏任何东西,但让 VG 在两个主机上都可见是危险的(因为某些过程、脚本或人为操作失误并选择错误的磁盘的可能性)。您可以过滤掉它们,这样在执行 PV 扫描时,每个主机都会忽略它不应该接触的 LUN。因此,每个主机一次只能检测到一个 VG。这在您的场景和许多其他场景中都很有用。
顺便说一句(在我深入讨论这个问题之前),您可以考虑在 SAN 级别处理这个问题,并将这些 LUN 分成不同的目标。这样,基础块设备就不会被“错误的”启动器拾取。除非有真的您希望 LUN 同时在两个主机上可见是有充分理由的。
接下来,我们将在 LVM 配置中创建过滤器。这通过一系列正则表达式进行控制,以限制“pvscan”检测某些块设备(或某些类型的块设备)。我们在 /etc/lvm/lvm.conf 文件中进行了此更改
在该配置中,您将发现(大约一半)一行显示“global_filter=”。该文件应该会给出一些如何使用它的提示,但让我们先了解一些概念。
首先,您应该根据不会更改的路径允许和限制块设备。不要使用 /dev/sda 之类的东西来选择磁盘。这可能会发生变化,并且您的过滤器将不可靠。相反,请使用 /dev/disk/by-id/ 或 /dev/disk/by-path/ 之类的东西。这两个目录都包含符号链接,这些链接使用有关 LUN 的实际信息来识别它们。by-id 使用 SCSI ID,by-path 使用物理主机路径和总线类型。尽可能使用 by-id,因为它最可靠。由于这些是上述目录中的符号链接,因此您可以使用“ls -l”将它们与它们对应的 /dev/sd* 路径进行匹配。
使用该 by-id 路径,您可以创建一个全局 LVM 过滤器,使扫描在将来的扫描中拒绝该不需要的块设备。构造此行时,请先放置允许条目(用“a”表示),然后放置拒绝条目(用“r”表示)。该过滤器的示例可能如下所示:
global_filter=[ "a|.*|","r|/dev/disk/by-id/id-of-unwanted-disk.*|" ]
语句用方括号括起来。语句用引号括起来,并用逗号分隔。斜杠用于打开和关闭包含斜杠的语句(就像这些语句一样)。根据正则表达式标准,在该拒绝语句中的星号前放置一个点,以定义一个万能通配符。此行表示“允许除此驱动器之外的所有内容,以及可能来自此驱动器的所有分区。”这个被拒绝的驱动器将是您不希望 LVM 查看的 LUN。
保存此编辑后,使用“pvscan”进行测试。如果结果符合您的预期,则您不需要的 VG 将不再显示。在另一台主机上执行相同操作,您便拥有了一个安全的过滤器。
但说真的,如果可以的话,请使用 iSCSI 目标隔离这些 LUN。这要容易得多,并且不需要在两个主机上进行配置即可成功。