Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
Ambos lados da revisão anterior Revisão anterior | |||
espec:maquinas_virtuais_uml [2008/12/05 19:28] maziero |
espec:maquinas_virtuais_uml [2020/08/18 19:12] (atual) |
||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== 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): | ||
+ | |||
+ | <code> | ||
+ | (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] | ||
+ | </code> | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code> | ||
+ | (vm1)$ halt | ||
+ | |||
+ | ... [mensagens de shutdown suprimidas] | ||
+ | |||
+ | Disco desta maquina virtual: rootfs32.vm1 | ||
+ | |||
+ | (host)$ [retorno ao shell da máquina real] | ||
+ | </code> | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code> | ||
+ | (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/ | ||
+ | </code> | ||
+ | |||
+ | ==== 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: | ||
+ | |||
+ | <code> | ||
+ | (vm1)$ cd /mnt/usr/local/linux | ||
+ | </code> | ||
+ | |||
+ | ==== 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: | ||
+ | |||
+ | <code> | ||
+ | (vm1)$ ifconfig eth0 20.0.0.119 up | ||
+ | (vm1)$ route add default gw 20.0.0.1 | ||
+ | </code> | ||
+ | |||
+ | **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**: | ||
+ | |||
+ | <code> | ||
+ | (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 | ||
+ | </code> | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code> | ||
+ | (host)$ uml_mconsole vm3 | ||
+ | (vm3) halt | ||
+ | OK | ||
+ | (vm3) quit | ||
+ | (host)$ | ||
+ | </code> | ||
+ | |||
+ | ==== 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]] | ||