![解决方法](https://linux22.com/image/173105/%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95.png)
在我的 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.service
VMheartbeat.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 &