我在物理服务器上安装了 XCP-ng。我使用了 500 GB 的 SSD,并让 XCP-ng 使用整个磁盘,其中 XCP-ng 只使用了 15 GiB;其余的是 VG 中的可用空间。
现在,我使用所有可用空间在该 VG 上创建了一个新的 LV。我在 XCP-ng 中将此 LV 用作 SR 存储(本地 LVM),它按预期运行。
问题是它以某种方式创建了一个“嵌套” VG,至少我创建的 LV 似乎表现得像一个 VG。但是,它不会在启动时自动激活。
系统启动时,会自动激活“主” VG,其中包含所有 LV(包括我创建的 LV),但运行时vgchange -ay
,它会激活一个新 VG(大小与我创建的 LV 相同)。只有这样,我才能在 XCP-ng 和 VM 中使用该存储。
您知道如何让它自动激活这些“嵌套”的 VG 吗?
我曾尝试:
- 创建一个
systemd
服务来运行vgchange -ay
,但它失败并显示退出代码3
; - 修改
/etc/lvm/lvm.config
为包括auto_activation_volume_list
设置为两个 VG 的名称数组。
到目前为止还没有任何帮助。
答案1
我通过将所需命令放入来解决了这个问题crontab
。
请注意,可以将命令放入脚本中,甚至可以记录输出。此外,我还将命令 ( xe pbd-plug
) 附加到尝试将 PBD 插入主机。这样我就可以访问虚拟机的硬盘了。
# cat /var/spool/cron/root
@reboot /usr/sbin/vgchange -ay &> /dev/null; /usr/sbin/vgchange -ay &> /dev/null; /opt/xensource/bin/xe pbd-plug uuid=71389ed2-d0e3-ba07-d734-b907757d9c44 &> /dev/null
答案2
您可以创建一个 systemd 单元并安排它在 XCP 组件之前启动:
# Make sure the file doesn't already exist
$ ls /etc/systemd/system/lvm-activate.service
ls: cannot access /etc/systemd/system/lvm-activate.service
# create it
$ echo >/etc/systemd/system/lvm-activate.service <<END
[Install]
WantedBy=multi-user.target
Before=xenopsd-xc.service
RequiredBy=xenopsd-xc.service
[Service]
Type=oneshot
ExecStart=/usr/sbin/vgchange -ay
END
# enable it
$ systemctl daemon-reload
$ systemctl enable lvm-activate
答案3
在 RHEL8(CentOS8)上,您可以将 VG 激活添加到 /etc/systemd/system/sysinit.target.wants/lvm2-monitor.service
[Unit]
Description=Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or progress polling
Documentation=man:dmeventd(8) man:lvcreate(8) man:lvchange(8) man:vgchange(8)
Requires=dm-event.socket
After=dm-event.socket dm-event.service lvm2-activation.service
Before=local-fs-pre.target shutdown.target
DefaultDependencies=no
Conflicts=shutdown.target
[Service]
Type=oneshot
Environment=LVM_SUPPRESS_LOCKING_FAILURE_MESSAGES=1
ExecStart=/usr/sbin/lvm vgchange -ay
ExecStart=/usr/sbin/lvm vgchange --monitor y
ExecStop=/usr/sbin/lvm vgchange --monitor n
RemainAfterExit=yes
[Install]
WantedBy=sysinit.target