首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不是所有XEN VM在重新启动DOM 0之后自动启动

不是所有XEN VM在重新启动DOM 0之后自动启动
EN

Unix & Linux用户
提问于 2020-05-12 13:06:35
回答 3查看 1K关注 0票数 1

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

代码语言:javascript
复制
/etc/xen/auto/proxy.cfg -> /etc/xen/proxy.cfg
/etc/xen/auto/vm04.matrix.cfg -> /etc/xen/vm04.matrix.cfg
...

有时,一些来宾VM在重新启动DOM0主机时会自动启动,有时会失败,并在syslog中抛出这些错误:

代码语言:javascript
复制
$ 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中围绕失败的错误是:

代码语言:javascript
复制
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中添加了以下内容

代码语言:javascript
复制
GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=4096M,max:4096M loglvl=all guest_loglvl=all"

名为update-grub,但是在重新启动之后,syslog中的错误消息是相同的。我在dmesg也找不到可疑的东西。没有提到任何客人的主机名。只有这一点表明,问题是:

代码语言:javascript
复制
# 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
...

您只看到,前三个VM网络接口在启动时确实启动了,1000秒后,我在控制台上手动启动了下一个VM。

Xen装载得很好:

代码语言:javascript
复制
$ 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

我认为这个问题的最佳提示是,在引导过程中卷不在那里:

代码语言:javascript
复制
/dev/vg0/proxy-disk: No such file or directory

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

代码语言:javascript
复制
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
代码语言:javascript
复制
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

如何进一步调试?

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2020-06-01 10:02:08

解决方案

如果没有任何解决方案来启动所有VM,则可以创建一个新脚本,该脚本检查/etc/xen/auto中的所有信任项,并在未启动时手动启动它们。

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

代码语言:javascript
复制
#!/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

并使其可执行:

代码语言:javascript
复制
sudo chmod +x /usr/local/sbin/xen-start-all-auto

2.创建一个一旦

启动的systemd服务

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

代码语言:javascript
复制
[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

使用:

更新系统:

代码语言:javascript
复制
systemctl daemon-reload
systemctl enable xen-autostart
systemctl start xen-autostart &
票数 0
EN

Unix & Linux用户

发布于 2020-05-26 07:01:22

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

当前的配置导致xendomains.service,因此VM尝试在集群组件(如corosync.serviceheartbeat.service以及VM管理服务libvirtd.service )之前启动。如果您的vg0是一个群集卷组,它需要这些集群组件服务才能激活,则应该更改xendomains.service以启动After,而不是Before

而且,由于libvirtd是一个服务器端守护进程,它实际上处理其他VM的启动和停止,所以启动其他VM的尝试很可能只在启动libvirtd.service之后才会发生。

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

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

依赖关系(After=等)不能将其重置为空列表,因此只能在下拉列表中添加依赖项。如果要删除依赖项,则必须覆盖整个单元。

所以创建一个覆盖文件在这里是行不通的。相反,您需要将现有的自动生成的单元文件复制到/etc/systemd/system/xendomains.service

代码语言:javascript
复制
systemctl cat xendomains.service | uniq >/etc/systemd/system/xendomains.service

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

代码语言:javascript
复制
[...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
EN

Unix & Linux用户

发布于 2020-05-29 14:36:20

我不确定这是否在4.11,我知道在6,它是:

代码语言:javascript
复制
xe pool-param-set uuid=UUID other-config:auto_poweron=true

当您执行"xe vm-list“时,将给出UUID。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/586150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档