解决方法

解决方法

在我的 Xen 主机(Debian Buster 中的 systemd,Xen 4.11)上,我通常会自动启动所有来宾 VM。我将所有虚拟机配置添加/etc/xen/auto/为底层配置的链接,例如

/etc/xen/auto/proxy.cfg -> /etc/xen/proxy.cfg
/etc/xen/auto/vm04.matrix.cfg -> /etc/xen/vm04.matrix.cfg
...

有时,某些来宾虚拟机会在 DOM0 主机重新启动时自动启动,有时某些虚拟机会失败并在系统日志中抛出以下错误:

$ grep "Starting Xen domain" /var/log/syslog
May 12 08:38:36 dom0 xendomains[1103]: Starting Xen domain proxy (from /etc/xen/auto/proxy.cfg)...done.
May 12 08:38:36 dom0 xendomains[1103]: Starting Xen domain vm04.matrix.de (from /etc/xen/auto/vm04.matrix.cfg)...failed.

如果失败,则\var\log\syslog引导期间失败的错误包括:

Starting Xen domain vm04.matrix (from /etc/xen/auto/vm04.matrix.cfg)...failed.
libxl: error: libxl_device.c:417:libxl__device_disk_set_backend: Disk vdev=xvda2 failed to stat: /dev/vg0/vm04.matrix-disk: No such file or directory
libxl: error: libxl_create.c:983:initiate_domain_create: Domain 4:Unable to set disk defaults for disk 0
libxl: error: libxl_domain.c:1034:libxl__destroy_domid: Domain 4:Non-existant domain
libxl: error: libxl_domain.c:993:domain_destroy_callback: Domain 4:Unable to destroy guest
libxl: error: libxl_domain.c:920:domain_destroy_cb: Domain 4:Destruction of domain failed

---

Starting Xen domain proxy (from /etc/xen/auto/proxy.cfg)...failed.
libxl: error: libxl_device.c:417:libxl__device_disk_set_backend: Disk vdev=xvda2 failed to stat: /dev/vg0/proxy-disk: No such file or directory
libxl: error: libxl_create.c:983:initiate_domain_create: Domain 1:Unable to set disk defaults for disk 0
libxl: error: libxl_domain.c:1034:libxl__destroy_domid: Domain 1:Non-existant domain
libxl: error: libxl_domain.c:993:domain_destroy_callback: Domain 1:Unable to destroy guest
libxl: error: libxl_domain.c:920:domain_destroy_cb: Domain 1:Destruction of domain failed

除了安装点之外,文件/etc/xen/proxy.cfg和文件都是相同的。/etc/xen/vm04.matrix.cfg

如果我xen create /etc/xen/vm04.matrix.cfg稍后手动启动,它会正常启动,只是在主机启动期间不会自动启动。

调试

为了调试问题,我将其添加到/etc/default/grub

GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=4096M,max:4096M loglvl=all guest_loglvl=all"

并调用update-grub,但重新启动后,系统日志中的错误消息是相同的。我在两者中都找不到任何可疑之处dmesg。没有提及任何来宾主机名。仅此可见,问题所在:

# dmesg|grep dev|tail
[   11.348931] xen:xen_evtchn: Event-channel device installed
[   22.006020] device vif3.0 entered promiscuous mode
[   25.362878] device vif5.0 entered promiscuous mode
[   28.636912] device vif6.0 entered promiscuous mode
[ 1004.501654] device vif7.0 entered promiscuous mode
...

您只会看到,前三个虚拟机网络接口确实在这次启动期间启动,1000 秒后我在控制台上手动启动了下一个虚拟机。

Xen 加载得很好:

$ systemctl --type=service | grep -i xen
xen.service                        loaded active running LSB: Xen daemons                                                             
xendomains.service                 loaded active running LSB: Start/stop secondary xen domains

我认为问题的最佳提示是启动期间该卷不存在:

/dev/vg0/proxy-disk: No such file or directory

也许 xen 在引导过程中启动得太早?

systemctl cat xen.service|uniq
# /run/systemd/generator.late/xen.service
# Automatically generated by systemd-sysv-generator

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/init.d/xen
Description=LSB: Xen daemons
Before=multi-user.target
Before=graphical.target
After=remote-fs.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SuccessExitStatus=5 6
ExecStart=/etc/init.d/xen start
ExecStop=/etc/init.d/xen stop
systemctl cat xendomains.service|uniq
# /run/systemd/generator.late/xendomains.service
# Automatically generated by systemd-sysv-generator

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/init.d/xendomains
Description=LSB: Start/stop secondary xen domains
Before=multi-user.target
Before=graphical.target
Before=corosync.service
Before=heartbeat.service
Before=libvirtd.service
After=network-online.target
After=remote-fs.target
After=xen.service
After=drbd.service
After=iscsi.service
After=openvswitch-switch.service
After=nfs-kernel-server.service
Wants=network-online.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SuccessExitStatus=5 6
ExecStart=/etc/init.d/xendomains start
ExecStop=/etc/init.d/xendomains stop
ExecReload=/etc/init.d/xendomains reload

我怎样才能进一步调试这个?

答案1

xendomains.service在所有逻辑卷都vg0被激活之前,看起来可能开始得太早了。您可能需要添加/更改一些依赖项以适合您的系统配置。

当前配置导致xendomains.service虚拟机尝试启动集群组件,例如corosync.serviceVMheartbeat.service管理服务libvirtd.service。如果您的vg0集群卷组需要这些集群组件服务才能激活,则应更改xendomains.service为启动After它们,而不是Before.

由于libvirtd服务器端守护进程实际上负责启动和停止其他虚拟机,因此尝试启动其他虚拟机可能只应在libvirtd.service启动后进行。

systemctl edit xendomains.service应该在指定的编辑器中打开一个空的临时文件,然后该文件将自动成为该单元的覆盖文件xendomains.service/etc/systemd/system/xendomains.service.d/override.conf或类似的文件。

但手册页systemd.unit(5)说:

依赖项(After=等)无法重置为空列表,因此只能在 drop-ins 中添加依赖项。如果要删除依赖项,则必须覆盖整个单元。

因此创建覆盖文件在这里不起作用。相反,您需要将现有的自动生成的单元文件复制到/etc/systemd/system/xendomains.service

systemctl cat xendomains.service | uniq >/etc/systemd/system/xendomains.service

然后您可以/etc/systemd/system/xendomains.service使用您喜欢的编辑器进行编辑,最后运行systemctl daemon-reload以使更改生效。您应该编辑依赖项列表,使其如下所示:

[...the lines before this should be left as is...]
Description=LSB: Start/stop secondary xen domains
Before=multi-user.target
Before=graphical.target
After=corosync.service
After=heartbeat.service
After=libvirtd.service
After=network-online.target
After=remote-fs.target
After=xen.service
After=drbd.service
After=iscsi.service
After=openvswitch-switch.service
After=nfs-kernel-server.service
Wants=network-online.target
[...the lines after this should be left as is...]

答案2

我不确定这在 4.11 中是否可用,我知道在 6 中是:

xe pool-param-set uuid=UUID other-config:auto_poweron=true

当您执行“xe vm-list”时,将为您提供 UUID。

答案3

解决方法

如果没有解决方案来启动所有虚拟机,您可以创建一个新脚本,检查 /etc/xen/auto 中的所有配置,如果未启动则手动启动它们。

1.创建一个文件/usr/local/sbin/xen-start-all-auto

#!/bin/bash
cd /etc/xen/auto/

for x in *; do
 d=$(echo $x|sed 's/.cfg$//g')
 echo check $d ...
 lvs|grep $d-disk|grep -v snap|grep -q -- '-ao'
 if [ $? == 1 ]; then
   xen create $x
 else
   echo ok
 fi
done

并使其可执行:

sudo chmod +x /usr/local/sbin/xen-start-all-auto

2.创建启动一次的systemd服务

创建一个文件/etc/systemd/system/xen-autostart.service

[Unit]
Description=starts all XEN vms in /etc/xen/auto if they are not started already 1 minute after system start

[Service]
TimeoutStartSec=infinity
ExecStartPre=/bin/sleep 60
ExecStart=/bin/bash /usr/local/sbin/xen-start-all-auto

[Install]
WantedBy=default.target

更新 systemd:

systemctl daemon-reload
systemctl enable xen-autostart
systemctl start xen-autostart &

相关内容