Archive for the ‘isolamento’ Tag

User-Mode Linux

Virtualização de sistemas

Quando a questão é virtualização, as primeiras opções nas quais se pensa são as soluções mais robustas e famosas, como Xen, VMWare, VirtualPC, VirtualBox, dentre algumas outras. Mas pra quê matar uma mosca com uma bazuca? Quando o que se quer é uma forma simples de rodar outro sistema Linux, seja para testar softwares instáveis, novos Kernels Linux, ou então para testar seus programas bugados sem comprometer a integridade do seu sistema, uma opção excelente é o UML! Não, não estou falando da entediante Unified Modelling Language, mas sim do projeto User-Mode Linux, mais conhecido pelo seu acrônimo anteriormente referido.

O UML permite que um kernel Linux, apropriadamente compilado, rode como um processo comum em um sistema operacional Linux. Isso mesmo, cada kernel “convidado” aparece como um processo normal no sistema, podendo ser manipulado da mesma forma que os outros processos. Linux inside Linux! 🙂

Pausa para observação: quando escrevo “convidado”, me refiro a um sistema virtual, que não esteja rodando diretamente sobre o hardware físico. Já o termo “hospedeiro”, como o nome já deixa claro, refere-se ao sistema que abriga os processos “convidados”, ou seja, o sistema operacional real, rodando sobre o hardware real.

Uma instância de um Kernel UML não exige uma quantidade grande de recursos, podendo-se tranqüilamente rodar vários kernels concomitantemente em uma mesma máquina. Para podermos usufruir da segurança oferecida pelo isolamento que máquinas virtuais propiciam, não basta apenas um Kernel rodando em modo usuário, mas também um sistema de arquivos individual para cada sistema
convidado. O UML provê isso através de um simples arquivo, que contém toda a imagem do um sistema e que fica contido no sistema de arquivos do hospedeiro. Assim, torna-se possível alocar um sistema de arquivos separado para cada instância de máquina virtual que estivermos rodando, sendo que cada um desses sistema é armazenado como um arquivo simples no disco.

Pode-se encontrar sistemas de arquivos, com sistemas completos instalados, para download na internet [2,3], mas também é uma tarefa simples gerar seu próprio sistema de arquivos, com um sistema personalizado [4].

O isolamento entre os sistemas convidados é uma das características que tornam o UML uma alternativa especialmente interessante para criação de sandboxes.

Sandbox é uma técnica para oferecer segurança em sistemas computacionais na qual os sistemas rodam totalmente isolados, de forma que qualquer comportamento anômalo de um sistema não interfira nos outros. É particularmente útil para a hospedagem de diversos serviços independentes dentro de um mesmo sistema físico, de forma que a invasão ou qualquer outra falha de um serviço não comprometa o funcionamento dos outros.

É possível, com algumas configurações adicionais, adicionar suporte a rede em um kernel UML. Pode-se, inclusive, configurar uma rede de sistemas virtuais, onde um utilitário para o UML faz o serviço de um switch virtual, o uml_switch [5]. Esse utilitário fica rodando no sistema hospedeiro, agindo
como se fosse um switch de rede físico, permitindo que os sistemas virtuais comuniquem-se entre si e com o mundo exterior. Assim, pode-se fazer simulações de redes de computadores, como mostra o artigo [7].

Mãos na massa

Bom, chega de papo e vamos instalar e utilizar o UML.

Instalação genérica

  • Baixe um Kernel Linux e compile-o para a arquitetura ‘um‘, que é a arquitetura do User-Mode Linux. [6]

Outra observação: a arquitetura ‘um‘ é, na verdade, um port do kernel Linux para sua própria interface de chamadas de sistema.

  • Gere um Sistema de Arquivos ou então baixe um pronto. [3,4]
  • Rode o kernel passando o sistema de arquivos como parâmetros. Por exemplo, supondo que você tenha gerado um kernel chamado ‘linux’, coloque-o em alguma passta que esteja em seu $PATH, para que possa rodá-lo sempre a partir do seu shell favorito. Então, tendo gerado (ou baixado) um sistema de arquivos chamado ‘root-fs’, você deve rodar o UML da seguinte forma:

$ linux ubd0=/path/to/root-fs

Simples, não? Caso você tenha compilado o seu kernel corretamente e gerado um sistema de arquivos compatível, seu sistema virtual já deve estar rodando. Não entrarei em detalhes sobre os possíveis problemas que podem ocorrer, pois existe bastante documentação sobre isso.

Instalação em sistemas Debian/Ubuntu
Caso utilize Debian ou Ubuntu, você pode instalar o User-Mode Linux através do gerenciador de pacotes apt:

$ apt-get install user-mode-linux

Após instalado, você terá em seu ambiente, um programa novo chamado ‘linux.uml’, que é o kernel Linux previamente compilado para a arquitetura ‘um’.


Referências:

[1] http://user-mode-linux.sourceforge.net/ – página oficial do projeto

[2] http://uml.nagafix.co.uk/ – download de sistemas de arquivos prontos para utilização por um kernel UML.

[3] http://uml.jfdi.org/uml/Wiki.jsp?pageUMLRootFilesystems

[4] http://uml.jfdi.org/uml/Wiki.jsp?pageBuildingRootFileSystems – Como criar seu sistema personalizado.

[5] http://user-mode-linux.sourceforge.net/downloads.html – Downloads User-Mode Linux

[6] http://uml.jfdi.org/uml/Wiki.jsp?pageBuildingUML – Compilando o UML