A máquina virtual utilizada será a VirtualBox. Apenas garanta que está com a última versão, certifique-se em https://www.virtualbox.org/wiki/Downloads
Vou ser o mais sucinto e direto ao objetivo possível, deixo a teoria para que você pesquise e estude por conta própria.
PVM é a abreviação para Parallel Virtual Machine, ou em português, Máquina Paralela Virtual.
PVM é um sistema de passagem de mensagens que habilita uma rede de computadores Unix/Linux serem utilizados como um computador único com processador e memória distribuídos. Essa rede é chamada de máquina virtual (não confunda com o VirtualBox, é outro tipo de máquina virtual).
PVM pode ser utilizado em muitos níveis diferentes. No nível mais alto, ou modo transparente, as tarefas são automaticamente executadas no computador pertencente à máquina virtual mais apropriado. No modo dependente de arquitetura, o usuário especifica qual dos computadores deve executar uma tarefa em particular. No modo baixo nível, o usuário precisa especificar qual computador deve executar qual tarefa. Em todos esses modos, PVM cuida das conversões de dados necessárias para cada computador, assim como deve acontecer no modo baixo nível.
PVM é um sistema de passagem de mensagem muito flexível. Ele suporta a maioria dos formatos de computação paralela. Ele permite que qualquer paradigma de linguagem de programação seja usado e todas as estruturas necessárias para que seja possível utilizar-se da PVM são fornecidas por ela própria.
O objetivo deste tutorial é mostrar como instalar e configurar uma PVM usando duas máquinas virtuais rodando Linux Debian hospedadas em um computador rodando Windows 8. Mas é possível adicionar, teoricamente, infinitos equipamentos, de qualquer maneira, seja heterogênea ou homogênea, à máquina virtual (PVM) a qualquer hora.
Sobre a programação para PVM vou deixar aqui apenas um pequeno exemplo para que possamos verificar o correto funcionamento da máquina virtual, sendo assim será necessária uma pesquisa mais aprofundada para conhecer todos os mecanismos e facilidades disponíveis para a programação paralela usando a PVM.
De início vou considerar que você tem duas máquinas virtuais, com o Debian instalado, em seu computador. A instalação pode ser a mais simples e leve possível, usarei apenas o console (terminal). Você pode dar uma olhada no Realizar uma instalação mínima do Debian em uma máquina virtual para ter uma ideia de como fazer isso.
O primeiro passo a ser dado, depois de ter o sistema operacional instalado, é atualizar o sistema em AMBAS as máquinas virtuais, para isso use:
{code}
apt-get update
apt-get dist-upgrade
apt-get autoclean
{/code}
A rede dessas máquinas virtuais deve ser do tipo Rede Interna, para que elas se comportem como se fosse máquinas reais em uma rede própria, portanto faça essa configuração em ambas máquinas virtuais.
As máquinas devem ter nomes distintos, para alterar o nome:
{code}
vi /etc/hostname
{/code}
Coloque nomes distintos que facilite a identificação dos componentes do seu cluster.
Também devem ter IP fixo:
{code}
vi /etc/network/interface
{/code}
Usando a seguinte configuração:
{code}
allow-hotplug eth0
iface eth0 inet static
address 10.0.0.1
netmask 255.0.0.0
gateway 10.0.0.1
dns-server 10.0.0.1
{/code}
Onde,
allow-hotplug permite que a placa funcione como plug-and-play.
iface determina que o endereço será fixo (estático).
address é o endereço IP.
netmask é a máscara de rede.
gateway é o endereço do gateway padrão (roteador).
dns-server é o endereço do servidor DNS.
Para uma máquina escolhi o IP 10.0.0.1 e para outra 10.0.0.2, sendo que os dois IPs devem fazer parte da mesma rede física (entre as máquinas virtuais, no caso) e lógica.
Vamos acertar a resolução de nomes entre os nós (máquinas):
{code}
vi /etc/hosts
{/code}
Adicione ao final do arquivo o nome e IP do nó um no nó dois e vice-versa, usando o seguinte formato:
Endereço_IP Nome_do_Host
No meu caso, no nó um:
{code}
10.0.0.1 maquina01
10.0.0.2 maquina02
{/code}
No meu caso, no nó dois:
{code}
10.0.0.1 maquina01
10.0.0.2 maquina02
{/code}
Feito a configuração de nome e IP verifique se há comunicação entre eles, use o ping entre o um nó e o outro usando o nome do nó.
{code}
ping maquina01
{/code}
{code}
ping maquina02
{/code}
A comunicação entre os nós deverá ser feita sem interferência (interação) do usuário, por isso precisaremos deixar o SSH sem senha entre o master (nó um) e o slave (nó dois).
No nó um (master):
{code}
ssh-keygen –t dsa –f ~/.ssh/id_dsa
{/code}
Quando solicitado senha, apenas dê ENTER.
Para exportar a chave criptográfica para o nó dois (slave) faça o que é indicado abaixo. Note que você precisará da senha do usuário do computador remoto quando solicitado:
{code}
cat ~/.ssh/id_dsa.pub | ssh root@10.0.0.2 ‘cat - >> /root/.ssh/authorized_keys’
{/code}
De novo no nó um:
{code}
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
{/code}
Para testar tente uma conexão entre o nó master e o slave, não deverá ser solicitado senha, apenas o cadastro de confiabilidade:
{code}
ssh maquina02
{/code}
Feche o SSH. Foi apenas para teste.
Agora instale o PVM em AMBOS nós (nas duas máquinas):
{code}
apt-get install pvm pvm-dev
{/code}
Para adicionar os nós ao PVM faça o que segue no nó master. Note o que o master não precisa ser adicionado a si mesmo:
{code}
pvm
add maquina02
{/code}
Para confirmar se o nó foi adicionado, execute o seguinte comando ainda dentro do PVM:
{code}
conf
{/code}
Para sair do PVM e deixa-lo rodando em segundo plano:
{code}
quit
{/code}
Se você usar o comando halt o PVM será encerrado.
Vamos escrever um código exemplo para testar o PVM:
{code}
#include<stdio.h>
#include “pvm3.h”
int main() {
int mytid, info;
mytid = pvm_mytid();
printf(“\nOla, eu sou a tarefa numero %d\n\n”, mytid);
info = pvm_exit();
return info;
}
{/code}
Esse programa exemplifica a programação básica para a PVM. O processo inicia na PVM, faz algum processamento (no caso o printf) que pode incluir passagem de mensagens e outras coisas, sai da PVM e finalmente encerra o programa. Esse é um pequeno exemplo para iniciar, mas exemplifica bem o funcionamento da programação para pvm.
Para compilar use:
{code}
gcc nome_do_programa.c –o nome_do_programa –I$PVM_ROOT/include –L$PVM_ROOT/lib/LINUX –lpvm3 –lnsl
{/code}
Onde:
nome_do_programa.c é o nome do seu arquivo com o código fonte.
nome_do_programa é o arquivo que conterá o binário compilado (executável).
–I$PVM_ROOT/include local onde estão os includes da PVM.
–L$PVM_ROOT/lib/LINUX local das bibliotecas da PVM, no caso, para o sistema operacional Linux.
Para executá-lo:
{code}
./teste
{/code}
Agora podemos executá-lo dentro da PVM:
{code}
pvm
{/code}
Verifique se os nós já estão adicionados, caso contrário re-adicione:
{code}
conf
{/code}
Executando com a criação de cinco processos do mesmo programa:
{code}
spawn -5 -> ./teste
{/code}
Agora é com você: procure mais informações sobre programação para PVM e passagem de mensagens de maneira que seus programas possam ser executados parte em um nó (master) e parte em outros nós (slaves) aproveitando o máximo do cluster criado. Você pode aumentar ou diminuir o número de processos a serem criados para testar o desempenho e também aumentar ou diminuir o número de nós para verificar o desempenho.
Os comandos principais do console da PVM são:
add – adiciona nós à máquina virtual
alias – define ou cria apelidos para comandos
conf – mostra a configuração da máquina virtual com todos os dados dos nós adicionados nela
delete – remove nó da máquina virtual
echo – retorna argumentos
halt – interrompe a execução da máquina virtual
help – mostra ajuda interativa sobre os comandos da PVM
id – mostra a identificação da tarefa do console
jobs – mostra todos os processos em execução
kill – pode ser utilizado para interromper um processo na PVM
mstat – mostra o estado de um determinado nó
ps –a – lista todos os processos atuais na máquina virtual
pstat – mostra o estado de um determinado processo
quit – sai do console, mas deixa a PVM em funcionamento
reset – interrompe todos os processos da PVM
setenv – mostra ou ajusta variáveis de ambiente
sig – envia sinal a uma tarefa ou processo
spawn – executa uma aplicação na PVM
trace – ajusta ou mostra o caminho de um evento
unalias – remove apelido de comando
version – mostra a versão da PVM