User-Mode Linux
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 usuário pode ser root de suas máquinas virtuais, sem prejuÃzo para a segurança do sistema.
Ambiente de testes
Todos os passos foram realizados no Ubuntu 8.04 64 bits. O equipamento utilizado foi um Dell Vostro 1500 com:
- Processador Intel 2.2 (T7500)
- 4 GB de memória
- 160 GB de disco
Preparação do Kernel
- Baixar o último kernel.
- Descompactar.
- Preparar o kernel com configurações padrões:
make ARCH=um defconfig
- Entrar no kernel e desabilitar algumas coisas (suporte a módulo, som, sistemas de arquivos não utilizados, etc). Caso você não se sinta confortável em alterar alguma configuração, este passo pode ser pulado.
make ARCH=um menuconfig
- Compilar:
make ARCH=um linux
- Diminuir o tamanho do executável (retirar informações de compilação):
strip linux
Preparação da imagem
- Criar o arquivo:
dd if=/dev/zero of=ubuntu-root bs=1024K count=1000
- Formatar a imagem:
mkfs.ext3 ubuntu-root
- Criar o diretório root (que será utilizado para montarmos a imagem):
mkdir root
- Montar a imagem neste diretório:
sudo mount -o loop ubuntu-root root
- Instalar o pacote debootstrap (pular se já estiver instalado):
sudo apt-get install debootstrap
- criar uma imagem do Ubuntu Gutsy 64 bits:
sudo debootstrap –arch amd64 –verbose hardy root http://archive.ubuntulinux.org/ubuntu
- Criar uma cópia de segurança da imagem, para não precisar repetir o passo anterior:
sudo umount root
cp ubuntu-root ubuntu-root.bkp
sudo mount -o loop ubuntu-root root
Configuração da imagem (o diretório root está montado em /home/marcos/uml/root)
- Arquivo /etc/fstab (montado no diretório /home/marcos/uml/root):
# UNCONFIGURED FSTAB FOR BASE SYSTEM
/dev/ubd0 / ext3 defaults 0 1
proc /proc proc defaults 0 0 - /etc/hostname (montado no diretório /home/marcos/uml/root):
uml_laureano
- /etc/hosts (montado no diretório /home/marcos/uml/root):
127.0.0.1 localhost uml_laureano
- /etc/network/interfaces (montado no diretório /home/marcos/uml/root):
# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or
# /usr/share/doc/ifupdown/examples for more information.
auto lo
iface lo inet loopback - /etc/apt/sources.list (montado no diretório /home/marcos/uml/root):
# Ubuntu supported packages
deb http://br.archive.ubuntu.com/ubuntu hardy main restricted
deb http://br.archive.ubuntu.com/ubuntu hardy-updates main restricted
deb http://security.ubuntu.com/ubuntu hardy-security main restricteddeb-src http://br.archive.ubuntu.com/ubuntu hardy main restricted
deb-src http://br.archive.ubuntu.com/ubuntu hardy-updates main restricted
deb-src http://security.ubuntu.com/ubuntu hardy-security main restricted# Ubuntu community supported packages
deb http://br.archive.ubuntu.com/ubuntu hardy universe multiverse
deb http://br.archive.ubuntu.com/ubuntu hardy-updates universe multiverse
deb http://security.ubuntu.com/ubuntu hardy-security universe multiversedeb-src http://br.archive.ubuntu.com/ubuntu hardy universe multiverse
deb-src http://br.archive.ubuntu.com/ubuntu hardy-updates universe multiverse
deb-src http://security.ubuntu.com/ubuntu hardy-security universe multiverse# Ubuntu backports project
deb http://br.archive.ubuntu.com/ubuntu hardy-backports main restricted universe multiverse
deb-src http://br.archive.ubuntu.com/ubuntu hardy-backports main restricted universe multiverse
- /etc/securetty (para login seguro), (montado no diretório /home/marcos/uml/root):
mv securetty securetty.old
Criar o arquivo com o conteúdo abaixo:
tty0
ttys/0
- Criar device no /dev (montado no diretório /home/marcos/uml/root):
sudo mknod –mode=660 ubd0 b 98 0
sudo chown root:disk ubd0 - Criar um usuário dentro da imagem:
sudo chroot /home/marcos/uml/root
adduser laureano (e responder a questões)grouapp admin
usermod -a -G admin laureano
visudo (incluir a linha:)
# habilita aos membros do grupo admin ter acesso como root
%admin ALL=(ALL) ALL
exit (finaliza o chroot)
- Criar o arquivo /etc/event.d/tty0 (montado no diretório /home/marcos/uml/root):
# tty0 – getty
#start on runlevel 2
start on runlevel 3
start on runlevel 4
start on runlevel 5stop on shutdown
respawn
exec /sbin/getty 38400 tty0 - Desmonstar a imagem e fazer uma cópia de segurança:
sudo umount root
cp ubuntu-root ubuntu-root-preparado.bkp
Instalação da rede
- Instalar o pacote uml-utilities
sudo apt-get install uml-utilities
Configuração da rede no host
- Criar a interface virtual para qualquer um ter acesso:
sudo /usr/sbin/tunctl -u nobody
- Configurar a interface criada:
sudo /sbin/ifconfig tap0 10.0.0.1 down
sudo /sbin/ifconfig tap0 10.0.0.1 up - Executar o daemon do uml_utilities (permitir as interfaces eth1 até ethN):
sudo /usr/bin/uml_switch -hub -tap tap0 -daemon >/dev/null 2>&1
- Permitir que qualquer usuário posso se conectar ao daemon:
sudo chmod ugo+w /tmp/uml.ctl
Lançar a máquina virtual
- ./linux ubd0=vm0,ubuntu-root eth0=daemon eth1=mcast,,224.4.0.1,,5 eth2=mcast,,224.4.0.2,,5
Onde:
- ubd0=vm0,ubuntu-root : cria uma imagem espelho (vm0) da imagem principal (ubuntu-root), todas as alterações serão gravadas na imagem espelho (conhecida como qcow).
- eth1=daemon : conexão com daemon
- eth1=mcast,,224.4.0.1,,5 eth2=mcast,,224.4.0.2,,5 : permite adicionar mais 2 interfaces de na imagem convidada. O eth1 está ligada a um switch 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. O eth2 está ligada a um switch 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.
Configuração da rede no guest
- Utilizar o usuário root ou o usuário criado anteriormente (neste caso é necessário utilizar o comando sudo para execução dos comandos)
- Configurar a interface eth0:
ifconfig eth0 10.0.0.2 up
route add default gw 10.0.0.1
ping 10.0.0.1 (verifica o acesso com o host)
Mais sobre configuração de rede no Linux.
Agradecimentos ao professor Maziero que passou as dicas de configuração do daemon.
Olá Prof. Marcos,
Em tempos de Docker está raro o uso de UML. Mas ainda existem aplicações para UML e o seu tutorial está quase em dia, somente uma sugestão para quem for instalar o Debian 8 em que as configurações de inicialização não são mais as mesmas:
Ao invés de criar o arquivo “/etc/event.d/tty0” edite o seguinte arquivo:
“/lib/systemd/system/getty-static.service”
e modifique:
…
ExecStart=/bin/systemctl –no-block start getty@tty0.service
…
Deverá funcionar 😉
Att,
Hermano
Setembro de 2009.
Olá professor,
Gostaria de utilizar esse tutorial como citação em meu trabalho de conclusão de curso.
Poderia me informar a data que escreveu este artigo?
Grato.
Estou no meio do processo.. 🙂
No meu ubuntu, antes de começar a compilar o kernel, baixei as seguintes packages:
update
build-essential
kernel-package
gcc
libncurses5
libncurses5-dev
libqt3-mt-dev
até agora está indo bem.. estamos no debootstrap..
abraços e parabéns pelo how-to
Pingback: Ambiente de testes para módulos no Linux Kernel « Catojo.
Pingback: Configuração do User-Mode Linux
Pingback: Marcos Laureano » Novo guia no ar…