====== Máquinas Virtuais UML ======
===== Introdução às Máquinas Virtuais =====
Máquina Máquinas virtuais são uma abstração de hardware construída por um **monitor de máquina virtual**. As máquinas virtuais permitem executar vários sistemas operacionais "convidados" sobre um mesmo hardware, simultaneamente. Dessa forma, cada sistema operacional acredita estar executando sobre uma máquina exclusiva.
Há basicamente dois tipos de monitores de máquina virtual: os nativos (ou de tipo I) e os convidados (ou de tipo II):
* **Monitor nativo**: software de baixo nível que executa diretamente sobre o hardware, sendo carregado no computador antes de qualquer sistema operacional.
* **Monitor convidado**: executa sobre um sistema operacional nativo (chamado de sistema hospedeiro), sendo visto como um processo deste.
Apesar de ser uma tecnologia dos anos 1960, as máquinas virtuais vêm sendo cada vez mais utilizadas em várias circunstâncias:
* Executar vários sistemas operacionais sobre o mesmo hardware, simultaneamente;
* Consolidar servidores em ambientes corporativos;
* Web hosting: ao invés de oferecer uma conta em um servidor Web, alugar uma máquina virtual completa e totalmente configurável;
* Desenvolvimento de núcleos de sistema e outros softwares de baixo nível;
* Ensino: cada aluno pode lançar várias máquinas virtuais, com controle total sobre elas e sem interferência nos trabalhos dos demais alunos; as configurações individuais podem ser facilmente preservadas pelo aluno.
Para o leitor interessado no assunto, {{:so:so-cap09.pdf|este texto}} oferece uma visão mais profunda e completa sobre máquinas virtuais.
===== O User-Mode Linux =====
O [[http://user-mode-linux.sourceforge.net|User-Mode Linux]] (UML) é um monitor de máquinas virtuais convidado, que executa como um processo sobre um sistema nativo Linux. Ele recria um sistema Linux completo a partir de uma imagem de sistema em disco. O UML é um projeto //Open Source//, que integra o núcleo oficial Linux a partir da versão 2.6.
No UML, cada máquina virtual é vista como um processo do sistema Linux nativo subjacente. Esse processo contém internamente o monitor de máquina virtual, o núcleo (//kernel//) convidado e os processos da máquina virtual. Todos os dispositivos físicos usados dentro da máquina virtual são virtualizados a partir de recursos do sistema nativo:
* os discos da máquina virtual correpondem a arquivos no sistema nativo;
* As interfaces de rede virtuais são providas por //daemons// executando no sistema nativo;
Os usuários e processos da máquina virtual são distintos dos usuários e processos do sistema nativo; por isso, cada aluno pode ser //root// de suas máquinas virtuais, sem prejuízo para a segurança do sistema.
===== Usando máquinas UML no servidor Espec =====
O servidor [[http://espec.ppgia.pucpr.br]] oferece a possibilidade de criar máquinas virtuais UML a partir de scripts pré-definidos, o que simplifica seu uso. A instalação está baseada na distribuição Linux Fedora 7 (para os mais curiosos, todos os scripts e imagens de disco se encontram no diretório ''/usr/local/uml/'' desse servidor).
==== Inicialização e término ====
Para lançar uma máquina virtual (ou VM), basta chamar o script ''linux'', informando um nome para a máquina a ser criada (deve ser um nome novo, que não esteja em uso por outra máquina virtual do mesmo usuário):
(host)$ linux vm1
... [mensagens de boot suprimidas]
Fedora release 7 (Moonshine)
Kernel 2.6.22.6 on an i686
localhost login: root
(vm1)$ [shell dentro da máquina virtual]
Ao terminar de usar uma máquina virtual, é importante **desligá-la adequadamente** (assim como desligamos um computador real após usá-lo), para manter a consistência das informações em sua imagem de disco virtual. O desligamento de uma VM deve ser feito através dos comandos ''halt'', ''shutdown'' ou ''poweroff'', executados a partir do shell da máquina virtual:
(vm1)$ halt
... [mensagens de shutdown suprimidas]
Disco desta maquina virtual: rootfs32.vm1
(host)$ [retorno ao shell da máquina real]
Ao ser lançada pela primeira vez, cada máquina virtual usa como disco de inicialização uma imagem de disco presente no diretório "''/usr/local/uml''". Todavia, essa imagem inicial pertence ao usuário ''root'' e não pode ser modificada. Por isso, todas as modificações que a máquina virtual faz em seu disco virtual são gravadas em um arquivo no diretório do usuário (no caso acima, o arquivo "''root32.vm1''"). Na próxima vez em que for lançada, a máquina ''vm1'' vai usar o conteúdo do arquivo ''root32.vm1'' para sua inicialização, pois este contém o último estado do disco da máquina virtual.
Os arquivos de imagem ''root32.*'' são mantidos como [[http://en.wikipedia.org/wiki/Sparse_file|arquivos esparsos]], ocupando bem menos espaço em disco que o tamanho apresentado na listagem do comando ''ls''.
==== Pacotes de software ====
A imagem de base das máquinas virtuais UML instaladas no servidor Espec é baseada na distribuição Linux [[http://fedora.redhat.com|Fedora 7]] para 32 bits. Esta distribuição foi escolhida por sua relativa leveza e simplicidade, mas outras distribuições poderão vir a ser adotadas no futuro. Em princípio, qualquer parcote de software em formato RPM previsto para o Fedora 7 32 bits pode ser instalado e usado nas máquinas virtuais. Os pacotes mais freqüentemente usados nos experimentos dos alunos estão disponíveis a partir do diretório ''/usr/local/linux/f7.32/'' do servidor Espec:
(host)$ ls -l /usr/local/linux/f7.32/
total 220
drwxr-xr-x 2 root root 102400 Out 17 2007 all/
drwxr-xr-x 2 root root 4096 Set 22 2007 dns/
drwxr-xr-x 2 root root 4096 Set 22 2007 httpd/
drwxr-xr-x 2 root root 4096 Set 22 2007 lynx/
drwxr-xr-x 2 root root 4096 Set 22 2007 mutt/
drwxr-xr-x 2 root root 4096 Set 22 2007 php/
drwxr-xr-x 2 root root 4096 Set 22 2007 pine/
drwxr-xr-x 2 root root 4096 Set 22 2007 pop-imap/
drwxr-xr-x 2 root root 4096 Set 22 2007 postfix/
drwxr-xr-x 2 root root 4096 Set 22 2007 samba/
drwxr-xr-x 2 root root 4096 Jul 4 15:29 squid/
drwxr-xr-x 2 root root 4096 Set 22 2007 telnet/
drwxr-xr-x 2 root root 4096 Set 22 2007 vsftpd/
drwxr-xr-x 2 root root 4096 Set 22 2007 wireshark/
drwxr-xr-x 2 root root 4096 Set 22 2007 xinetd/
==== Host FS ====
Para facilitar a cópia de arquivos entre as máquinas virtuais e o sistema real subjacente, o diretório raiz ("''/''") do servidor Espec é automaticamente montado dentro de cada máquina virtual, a partir do seu diretório "''/mnt''". Assim, para acessar o diretório "''/usr/local/linux''" do servidor Espec a partir de uma máquina virtual, basta executar:
(vm1)$ cd /mnt/usr/local/linux
==== Interfaces de rede ====
Cada máquina virtual disponível no servidor espec tem ao menos quatro interfaces de rede disponíveis:
* ''eth0'': ligada a um hub virtual onde também estão ligadas as interfaces ''eth0'' de todas as outras máquinas virtuais e também a interface ''tap0'' do servidor espec (que tem endereço IP ''20.0.0.1''). Assim, para que a VM possa se comunicar com o servidor Espec, esta interface deve ser configurada com um endereço IP classe C na forma ''20.0.0.*''.
* ''eth1'': ligada a um hub virtual onde estão ligadas as interfaces ''eth1'' de todas as outras máquinas virtuais; esse switch não está ligado a nenhuma interface real.
* ''eth2'': ligada a um hub virtual onde estão ligadas as interfaces ''eth2'' de todas as outras máquinas virtuais; esse switch não está ligado a nenhuma interface real.
* ''eth3'': ligada a um hub virtual onde estão ligadas as interfaces ''eth3'' de todas as outras máquinas virtuais; esse switch não está ligado a nenhuma interface real.
A figura a seguir ilustra a disposição das máquinas virtuais:
{{ :espec:vms-espec.png |}}
As interfaces de rede da máquina virtual podem ser configuradas normalmente através dos comandos ''ifconfig'' e ''route''. Por exemplo, a configuração da interface ''eth0'' poderia ser:
(vm1)$ ifconfig eth0 20.0.0.119 up
(vm1)$ route add default gw 20.0.0.1
**Importante**: antes de atribuir um endereço IP a uma interface de rede de sua máquina virtual, verifique se esse endereço está livre ou está sendo usado por uma VM de outro usuário. Isso pode ser feito facilmente executando o comando ''ping'' a partir de um terminal do servidor Espec. Obviamente, se alguma máquina responder aos pacotes do comando ''ping'', aquele endereço IP já está ocupado e não poderá ser usado.
==== Console de gerência ====
O ambiente de máquinas virtuais UML provê algumas ferramentas para gerênciar máquinas virtuais. Por exemplo, o comando ''uml_mconsole'' provê um console de gerência que pode ser usado para controlar uma máquina virtual a partir de um terminal da máquina real (em nosso caso, o servidor Espec). Assim, para gerenciar a máquina virtual ''vm1'', basta executar o seguinte comando em um terminal **fora da máquina virtual**:
(host)$ uml_mconsole vm1
(vm1) help
OK Commands:
version - Get kernel version
help - Print this message
halt - Halt UML
reboot - Reboot UML
config = - Add a new device to UML;
same syntax as command line
config - Query the configuration of a device
remove - Remove a device from UML
sysrq - Performs the SysRq action controlled by the letter
cad - invoke the Ctrl-Alt-Del handler
stop - pause the UML; it will do nothing until it receives a 'go'
go - continue the UML after a 'stop'
log - make UML enter into the kernel log
proc - returns the contents of the UML's /proc/
stack - returns the stack of the specified pid
Additional local mconsole commands:
quit - Quit mconsole
switch - Switch control to the given machine
log -f - use contents of as UML log messages
mconsole-version - version of this mconsole program
Pela informação fornecida pelo "help" do console de gerência, percebemos que é possivel:
* encerrar a VM (comando ''halt'')
* reiniciar a VM (comando ''reboot'')
* pausar e continuar a execução da VM (comandos ''stop'' e ''go'')
* alterar configurações e consultar informações internas
Uma situação **muito freqüente** é acidentalmente fechar a janela de terminal de uma máquina virtual. Nesse caso, a máquina virtual continua executando, mas não é mais possível interagir com ela nem encerrá-la normalmente (//shutdown//). Esse problema pode ser resolvido através do console de gerência: para encerrar a execução de uma máquina virtual ''vm3'', basta abrir outro terminal no servidor Espec e executar:
(host)$ uml_mconsole vm3
(vm3) halt
OK
(vm3) quit
(host)$
==== Display gráfico ====
FIXME
Explicar sobre o desvio de display de aplicações gráficas da máquina virtual para a máquina real (conferir primeiro se ainda está funcionando).
===== Mais informações =====
* {{:so:so-cap09.pdf|Capítulo de livro sobre máquinas virtuais}}
* [[http://user-mode-linux.sourceforge.net]]
* [[http://en.wikipedia.org/wiki/User-mode_Linux]]