Configuração do User-Mode Linux

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 restricted

    deb-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 multiverse

    deb-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 5

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

7 respostas a Configuração do User-Mode Linux

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

  2. Jonathan disse:

    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.

  3. Marcelo Kohler disse:

    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

  4. Pingback: Ambiente de testes para módulos no Linux Kernel « Catojo.

  5. Pingback: Configuração do User-Mode Linux

  6. Pingback: Marcos Laureano » Novo guia no ar…

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *