Necesito ejecutar un sistema de software destinado a ser instalado como un dispositivo en una máquina dedicada. Para ahorrar energía, planeo ejecutar el sistema en una VM VirtualBox.
El host es una caja Linux estándar con un sistema SysV-Init, el huésped es un Linux muy modificado y preferiría no tener que modificarlo más. VirtualBox se usa en la versión OSE.
Ya he descubierto cómo iniciar la VM cuando se inicia el host ( Editar: esto se hace, como Nikhil menciona a continuación, a través del comando VBoxManager startvm
), pero ¿cómo puedo apagar la VM con gracia? Cualquier script que se ejecute en el host deberá esperar hasta que el invitado se haya apagado por completo.
¿Alguien puede sugerir cómo, por ejemplo, un archivo de servicio que hace esto tendría que verse?
fuente
Respuestas:
¿Has probado
acpipowerbutton
desde este conjunto de comandos?Edite después de leer los comentarios:
Puede usar
acpid
u otras utilidades acpi para que sea elegante. Además, ¿puede proporcionar más información sobre cómo apaga la máquina en este momento?Plain
shutdown
no esperaría por trabajos sin terminar, un retraso de tiempo puede ser demasiado largo.Supongo que no estás usando un administrador de ventanas, así que prueba esta herramienta.
Acabo de ver a este demonio . Tu podrias encontrar esto útil.
fuente
vboxmanage list runningvms
hasta que tu VM se haya ido.En lugar de codificar esto usted mismo, considere usar Vagrant , que está diseñado para crear instancias y controlar instancias de virtualbox. La documentación es excelente y le sugiero que la revise en lugar de intentar rodar la suya.
En resumidas cuentas, crea un archivo de control simple y luego lo ejecuta
vagrant up
para iniciar tantas instancias de VirtualBox como desee. Puede usarvagrant ssh
para iniciar sesión en los hosts yvagrant halt
apagar el host (sin terminar).vagrant destroy
eliminará las instancias.Admite el aprovisionamiento con Puppet, Ansible o Chef y le permite controlar la mayoría de las configuraciones de configuración de VBox expuestas.
fuente
Tengo una aplicación similar a la suya, con una diferencia: necesito reiniciar el sistema y recuperarme de la instantánea.
Lo que le interesa es el modo sin cabeza .
Tengo algunos de estos servicios, así que uso el siguiente script:
VBox_StopRestoreStart.sh
SI desea apagar la máquina virtual con gracia, tiene dos opciones, dependiendo de su aplicación:
VBoxManage controlvm <uuid>|<VMname> acpipowerbutton
VBoxManage controlvm <uuid>|<VMname> acpisleepbutton
VBoxManage controlvm <uuid>|<VMname> savestate
CONSEJOS: Puede que te resulte útil:
VBoxManage list vms
- lista de vms disponiblesrdesktop IP-ADDR:3389
ordesktop-vrdp IP-ADDR:3389
- cuando desea una GUI (incluso remotamente ) cuando ejecuta en modo sin cabeza:VBoxHeadless -s <uuid>|<VMname>
VBoxManage startvm
- Comience con GUI para la depuración localCapítulo relacionado del manual de VirtualBox: Capítulo 7. Máquinas virtuales remotas: paso a paso: crear una máquina virtual en un servidor sin cabeza
PD: si está interesado en soluciones completas ya implementadas, OpenStack parece una opción interesante.
fuente
Consulte la documentación de administración de VM VirtualBox en http://www.virtualbox.org/manual/ch08.html
Para enumerar las máquinas virtuales, use el comando
VBoxManage list vms
Para iniciar la VM, use el comando
VBoxManage startvm
http://www.virtualbox.org/manual/ch08.html#vboxmanage-controlvm
Para controlar VM, use
VBoxManage controlvm
El
controlvm
subcomando le permite cambiar el estado de una máquina virtual que se está ejecutando actualmente. Se puede especificar lo siguiente:VBoxManage controlvm <vm> pause
temporalmente pone una máquina virtual en espera, sin cambiar su estado para siempre. La ventana de VM se pintará en gris para indicar que la VM está actualmente en pausa. (Esto es equivalente a seleccionar el elemento "Pausa" en el menú "Máquina" de la GUI).Use
VBoxManage controlvm <vm> resume
para deshacer un comando de pausa anterior. (Esto es equivalente a seleccionar el elemento "Reanudar" en el menú "Máquina" de la GUI).VBoxManage controlvm <vm> reset
tiene el mismo efecto en una máquina virtual que presionar el botón "Restablecer" en una computadora real: un reinicio en frío de la máquina virtual, que reiniciará y reiniciará el sistema operativo invitado nuevamente de inmediato. El estado de la VM no se guarda de antemano y se pueden perder datos. (Esto es equivalente a seleccionar el elemento "Restablecer" en el menú "Máquina" de la GUI).VBoxManage controlvm <vm> poweroff
tiene el mismo efecto en una máquina virtual que tirar del cable de alimentación en una computadora real. Nuevamente, el estado de la VM no se guarda de antemano, y los datos pueden perderse. (Esto es equivalente a seleccionar el elemento "Cerrar" en el menú "Máquina" de la GUI o presionar el botón de cerrar de la ventana, y luego seleccionar "Apagar la máquina" en el cuadro de diálogo).Después de esto, el estado de la VM estará "Apagado".
fuente
vboxmanage
(todo en minúsculas).VBoxManage controlvm
subcomandos hace eso./etc/init.d/vboxvms-service
secuencia de comandos en el sistema host, que al inicio hará que todos los vms se activen y que al detenerse, todos los vms se apaguen.VBoxManage controlvm savestate
es otra posibilidad (al menos google me dice), guarda el estado de las máquinas y lo apaga limpiamente, pero aún no hay forma de obligar al host a esperar.Para un sistema basado en systemd, puede probar esto.
Paso # 1: crea un archivo de servicio
Paso # 2: habilite el archivo de servicio
Referencias
fuente
VBoxHeadless -s %i
para iniciar yVBoxManage controlvm %i savestate
detener la VM.¿Qué tal enviar el comando vía ssh desde el host al invitado?
No estoy seguro de si funciona y si puede verificar el estado de la máquina después u obtener algo como un estado de salida, pero al menos debería estar limpio.
fuente
Mi solución: en este shellscript, 'root' es el invocador, y 'theuser' es el propietario de 'thevm'
Sé que los vms han terminado cuando la salida del comando
VBoxManage list runningvms
devuelve una cadena vacía.fuente
Para iniciar vm:
Para detener vm:
Enumere todos los vm en ejecución:
fuente
Quizás esto ayude como parte de la solución.
fuente
¿Por qué no inicias sesión en tu invitado y cierras desde allí?
A menos que tenga una buena razón para no instalar sshd y acceder a la VM realmente a través de VBox, elegiría un script que solo emita un
ssh shutdown -h now
. Para ser honesto, crearía un script para cada máquina que lo apaga correctamente y realizo algunos chequeos mientras lo hago.Simplemente empaque un script /etc/init.d/shutdown_vm que llame al otro desde el host, la llamada se bloqueará hasta que esté lista. Este proceso (como se describe) agrega una dependencia de Linux en el invitado pero elimina la dependencia de VBox en el host.
Ir al grano: no necesita acceder a VBox para apagar una máquina, si tiene algún medio para acceder a él (es decir, ssh), entonces el sistema operativo siempre tendrá algún medio para eso (encenderlo, por supuesto, es diferente)
fuente