Xen

並非所有 XEN VM 在重新啟動 DOM 0 後都會自動啟動

  • June 2, 2020

在我的 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 主機重新啟動時自動啟動,有時有些會失敗並在 syslog 中拋出這些錯誤:

$ 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

我該如何進一步調試呢?

在啟動xendomains.service所有邏輯卷之前,它看起來可能開始得太早了。vg0您可能必鬚根據系統配置添加/更改一些依賴項。

目前配置導致xendomains.service虛擬機嘗試在集群組件(如和虛擬機管理服務)之前啟動。如果您是一個需要這些集群組件服務才能啟動的集群卷組,您應該更改為啟動它們,而不是.corosync.service``heartbeat.service``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

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...]

我不確定這在 4.11 中是否可用我知道在 6 中它是:

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

當您執行“xe vm-list”時,它將為您提供 UUID。

引用自:https://unix.stackexchange.com/questions/586150