Arquivo mensal: junho 2014

Gerenciando VMs no VirtualBox por Linha de Comando

Introdução

O VirtualBox é uma ferramenta de fácil utilização para criação de máquinas virtuais. O ambiente gráfico é bastante intuitivo, com poucos cliques o usuário é capaz de colocar uma máquina virtual para executar. Entretanto, algumas vezes é mais cômodo utilizar a linha de comando para gerenciar as máquinas virtuais, principalmente se você deseja criar scripts para automatizar suas tarefas.

Iniciar uma máquina virtual pelo terminal

Ao contrário de outras ferramentas que possuem um comando para cada ação, o VirtualBox tem um comando apenas que engloba todas as ações, o VBoxManage. Não adianta tentar memorizar todas as opções, apenas as principais são importantes. Uma maneira fácil de listar as máquinas virtuais disponíveis é com a opção list.

VBoxManage list vms
"AdmLinux2014" {e5d22843-42b3-40f1-b7cb-1013b31feb99}
"GParted" {23213647-b9bf-41cd-a696-d023527de672}
"pfSense" {c078a303-8283-43b9-8f82-19d7524681d6}

Com a comando VBoxManage list vms, conseguimos ver quais as máquinas virtuais disponíveis. Se e somente se a máquina virtual estiver com os Adicionais para Convidados (Guest Additions), você conseguirá tirar proveito total do VBoxManage. Para inicializar uma VM específica, sem subir a interface gráfica, o ideal é usar o comando VBoxHeadless. Ele é muito útil quando você está hospedando um servidor na VM e não precisa da interface gráfica. O comando completo seria:


VBoxHeadless --startvm AdmLinux2014 --vrde off

Com isso, a VM inicializa, mas sem nenhuma tela para interação. Como controlá-la?

Enviando comandos para uma VM

Claro que você pode configurar o SSH e o redirecionamento de portas para logar na VM e executar comandos. Mas novamente, não é uma boa opção para scripts. É possível enviar um comando através do próprio VirtualBox. Por exemplo, o comando abaixo executa ifconfig em uma máquina virtual chamada AdmLinux2014:


VBoxManage --nologo guestcontrol AdmLinux2014 execute --image \\ "/sbin/ifconfig" --username usuario --password senha --wait-stdout

É um comando muito útil para, caso você esteja atribuindo IP através de uma bridge em uma interface do hospedeiro, descobrir qual o endereço a máquina recebeu.

Conclusão

Com essas duas dicas, é fácil criar um script que inicialize um certo conjunto de VMs e execute comandos de configuração em cada uma. Agora é só usar a imaginação 😉

Anúncios
Etiquetado ,

A simple script for probing status from SLURM cluster nodes.

A common problem that appears once in a while in our cluster at CENAPAD-UFC is that not all the processes are terminated on the nodes when the job is aborted. This is a wrong behavior, and we haven’t been able to fix it within SLURM. The solution I found is to constantly check the nodes to see if any of them has load average greater than the number of cores available. If an overloaded node is found, the administrator may log in and check of zombie processes.

If you have a SLURM cluster, the best way to monitor the nodes is installing Ganglia . But if by any chance you can’t install Ganglia, another solution is using pdsh and a little bit of scripting in Python. The only customization needed is changing the value of numberOfCoresPerNode according your cluster configuration. Also, partition must be the name of a partition with all the nodes you want to monitor.

#!/usr/bin/python
# coding=UTF-8
import os
from collections import OrderedDict

numberOfCoresPerNode = 12
partition = "superlong"

# Retrieve the list of available nodes
stream = os.popen("sinfo -p " + partition + " -t ALLOC,IDLE -o %N | tail -1")
nodeStr = stream.readline()

print "Available nodes are: " + nodeStr[:-1]

# Retrieve the load of each node
stream = os.popen("pdsh -w " + nodeStr[:-1] + " cat /proc/loadavg")
output = {}
for line in stream.readlines() :
key = line.split(":")[0]
value = line.split(":")[1].split(" ")[1]
output[key] = value

# Sort the output dictionary according the keys values
orderedOutput = OrderedDict(sorted(output.items(), key=lambda item: int(item[0][6:])))

# Print information about each node.
print "Node load: "
for key in orderedOutput.keys():
if float(orderedOutput[key]) > numberOfCoresPerNode + 4:
print "OVERLOAD>>>" + key + ":" + orderedOutput[key]
else:
print key + ":" + orderedOutput[key]

We consider that a node is overloaded if the load is greater that the number of cores plus 4. That can be changed at the last for loop.

Etiquetado ,