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):
Apesar de ser uma tecnologia dos anos 1960, as máquinas virtuais vêm sendo cada vez mais utilizadas em várias circunstâncias:
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 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:
halt
)reboot
)stop
e go
)
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)$
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).