Máquinas Virtuais UML

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, este texto oferece uma visão mais profunda e completa sobre máquinas virtuais.

O 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.

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).

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 arquivos esparsos, ocupando bem menos espaço em disco que o tamanho apresentado na listagem do comando ls.

A imagem de base das máquinas virtuais UML instaladas no servidor Espec é baseada na distribuição Linux 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/

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

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:

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.

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 <dev>=<config> - Add a new device to UML;  
	same syntax as command line 
    config <dev> - Query the configuration of a device 
    remove <dev> - Remove a device from UML 
    sysrq <letter> - 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 <string> - make UML enter <string> into the kernel log
    proc <file> - returns the contents of the UML's /proc/<file>
    stack <pid> - returns the stack of the specified pid

Additional local mconsole commands:
    quit - Quit mconsole
    switch <socket-name> - Switch control to the given machine
    log -f <filename> - use contents of <filename> 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)$

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).

  • espec/maquinas_virtuais_uml.txt
  • Última modificação: 2020/08/18 19:12
  • por 127.0.0.1