libvirt: comando para inicializar todas as máquinas virtuais convidadas com inicialização automática ativada

3

Estou usando o Debian Jessie como um host de máquina virtual usando libvirt / qemu / kvm.

Configurei algumas máquinas virtuais convidadas para serem iniciadas automaticamente quando o SO do host for inicializado, e isso está funcionando bem.

Para fins de manutenção, estou executando "service libvirt-guests stop" para desligar todos os convidados (mas não o host).

Depois de fazer minha manutenção, quero inicializar todos os convidados facilmente (sem reinicializar o host).

Existe um único comando que iniciará todas as VMs convidadas novamente? Estou interessado em saber sobre ambos:

  1. um comando para iniciar novamente todos os convidados marcados com autostart

  2. um comando para iniciar todos os convidados novamente que estavam em execução antes de eu executar "service libvirt-guests stop"

A reinicialização do sistema operacional host atingiria o número 1, mas não quero reinicializar o host.

Eu tentei, "service libvirt-guests start" , mas não parece fazer isso.

    
por LaVache 03.07.2016 / 13:45

4 respostas

3

Como a solução @ jason-harris. Mas mais simples e comece apenas marcado para início automático.

for i in $(virsh list --name --autostart); do virsh start $i; done

UPD: eu testei no libvirt 3.2.0 (CentOS 7.4.1708)

    
por 12.05.2018 / 02:03
1
#! /bin/bash

xmlfiles=( $(find /etc/libvirt/qemu/autostart/ -name '*.xml') )

for f in "${xmlfiles[@]}" ; do
  domain=$(xml2 < $f | awk -F= '$1 == "/domain/name" {print $2}')

  # only start domain if it's not already running
  if ! virsh list | grep -q " ${domain} .*running" ; then
    virsh start "$domain"
  #else
    # optionally reboot domain otherwise
    #virsh reboot "$domain"
  fi

done

Este script requer o utilitário xml2 (no pacote xml2 no debian e provavelmente no ubuntu também).

Ele usa xml2 para extrair o (s) nome (s) de domínio de todos os arquivos XML no diretório qemu autostart do libvirt e executa virsh start neles, caso ainda não estejam em execução.

Salve em algum lugar em seu PATH, como algo como virsh-autostart.sh (ou qualquer coisa que faça sentido para você) e torne-o executável com chmod .

    
por 03.07.2016 / 18:15
1

Eu não acredito que exista um comando simples para fazer isso (mas seria ótimo!).

Eu faço isso com bastante frequência e geralmente é apenas um script rápido / um comando de linha usando um loop for e algum awk.

Lembre-se de que, se o hipervisor estiver conectado a outros hipervisores, convém cortar esse link temporariamente para que você não interfira inadvertidamente com outras VMs em outros hipervisores. Eu não vi muita gente realmente usar isso, mas eu queria apontar isso.

Por exemplo, você pode digitar o seguinte para obter o resultado desejado, supondo que deseja ativar tudo novamente. Isso pressupõe que você é root:

for i in 'virsh list --all|awk '{print $2}'|grep -v Name'; do virsh start $i; done

O comando se divide assim:

virsh list --all

Mostra todas as máquinas virtuais, estejam elas ou não.

awk '{print $2}'|grep -v Name

Estamos removendo as colunas desnecessárias e apenas imprimindo a coluna com os nomes das máquinas virtuais. Então pegamos a linha de cabeçalho com o grep, já que não é realmente uma máquina virtual.

virsh start $i

Liga a máquina virtual.

E isso é tudo em volta de um loop geral.

    
por 03.07.2016 / 21:41
0

Eu uso systemctl restart libvirtd.service . Funciona sem uma falha no CentOS 7 (host).

    
por 24.04.2017 / 18:57