해결책

해결책

내 Xen 호스트(Debian Buster, 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 호스트가 다시 시작될 때 일부 게스트 VM이 자동으로 시작되고 때로는 일부 VM이 실패하고 시스템 로그에 다음 오류가 발생합니다.

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

이 부팅 중에 처음 3개의 VM 네트워크 인터페이스가 나타났고 1000초 후에 콘솔에서 다음 VM을 수동으로 시작한 것을 볼 수 있습니다.

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.serviceVM heartbeat.service관리 서비스 와 같은 클러스터 구성 요소 libvirtd.service. 클러스터 볼륨 그룹에서 활성화하기 위해 이러한 클러스터 구성 요소 서비스가 필요한 경우 대신 시작하도록 vg0변경해야 합니다 .xendomains.serviceAfterBefore

libvirtd서버 측 데몬은 실제로 다른 가상 머신을 시작하고 중지하는 역할을 담당하므로 다른 가상 머신을 시작하려는 시도는 시작된 후에만 수행되어야 합니다 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...]

답변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. 한 번 시작되는 시스템 서비스 만들기

파일을 생성하다/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

시스템 업데이트:

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

관련 정보