14.5. Atualizando Múltiplas Jails
Anterior | Capítulo 14. Jails | Próxima

## 14.5. Atualizando Múltiplas Jails

Contribuido por Daniel Gerzo.
Baseado em uma idéia apresentada por Simon L. B. Nielsen.
E artigo escrito por Ken Tom.

O gerenciamento de várias jails pode se tornar problemático porque toda jail tem que ser recompilada a partir do zero sempre que for atualizada. Isso pode ser demorado e entediante se muitas jails forem criadas e atualizadas manualmente.

Esta seção demonstra um método para resolver esse problema compartilhando com segurança o máximo possível entre jails usando montagens somente leitura mount_nullfs(8), para que a atualização seja mais simples. Isso torna mais atraente colocar serviços únicos, como HTTP, DNS e SMTP, em jails individuais. Além disso, fornece uma maneira simples de adicionar, remover e atualizar jails.

### Nota:

Existem soluções mais simples, como o ezjail, que fornece um método mais fácil de administrar as jails do FreeBSD, mas é menos versátil que essa configuração. O ezjail é coberto com mais detalhes em Seção 14.6, “Gerenciando Jails com o ezjail”.

Os objetivos da configuração descrita nesta seção são:

- Criar uma estrutura de jail simples e fácil de entender que não exija a execução de um installworld completo em todas as jails.

- Facilitar a adição de novas jails ou remoção das já existentes.

- Facilitar a atualização ou upgrade de jails existentes.

- Tornar possível a utilização de uma branch customizada do FreeBSD.

- Seja paranoico com a segurança, reduzindo ao máximo a possibilidade de comprometimento.

- Economize espaço e inodes, tanto quanto possível.

Esse design depende de um template master único, read-only, que é montado em cada jail e em um dispositivo read-write por jail. Um dispositivo pode ser um disco físico separado, uma partição ou um dispositivo de memória com suporte a vnode. Este exemplo usa montagens nullfs read-write.

O layout do sistema de arquivos é o seguinte:

- As jails são hospedadas na partição `/home`.

- Cada jail será montada no diretório `/home/j`.

- O template para cada jail e a partição read-only para todos as jails é `/home/j/mroot`.

- Um diretório em branco será criado para cada jail no diretório `/home/j`.

- Cada jail terá um diretório `/s` que será vinculado à parte de read-write do sistema.

- Cada jail terá seu próprio sistema de read-write baseado em `/home/j/skel`.

- A parte de read-write de cada jail será criada em `/home/js`.

### 14.5.1. Criando o Template

Esta seção descreve as etapas necessárias para criar o template master.

É recomendado primeiramente atualizar o sistema host FreeBSD para a branch -RELEASE mais recente usando as instruções em Seção 23.5, “Atualizando o FreeBSD a partir do código fonte”. Adicionalmente, este template usa o pacote ou port sysutils/cpdup e o portsnap será utilizado ​​para baixar a Coleção de Ports do FreeBSD.

1. Primeiro, crie uma estrutura de diretório para o sistema de arquivo read-only que conterá os binários do FreeBSD para as jails. Em seguida, altere para o diretório de código-fonte do FreeBSD e instale o sistema de arquivos read-only no template das jails:

       # mkdir /home/j /home/j/mroot
       # cd /usr/src
       # make installworld DESTDIR=/home/j/mroot

2. Em seguida, prepare uma Coleção de Ports do FreeBSD para as jails, assim como uma árvore de código fonte do FreeBSD, que são necessários para o mergemaster:

       # cd /home/j/mroot
       # mkdir usr/ports
       # portsnap -p /home/j/mroot/usr/ports fetch extract
       # cpdup /usr/src /home/j/mroot/usr/src

3. Crie um esqueleto para a parte de read-write do sistema:

       # mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles
       # mv etc /home/j/skel
       # mv usr/local /home/j/skel/usr-local
       # mv tmp /home/j/skel
       # mv var /home/j/skel
       # mv root /home/j/skel

4. Use o mergemaster para instalar os arquivos de configuração ausentes. Em seguida, remova os diretórios extras criados pelo mergemaster:

       # mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i
       # cd /home/j/skel
       # rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev

5. Agora, faça os links dos sistema de arquivos read-write ao sistema de arquivos read-only. Certifique-se de que os links simbólicos sejam criados nos locais corretos de `s/`, pois a criação de diretórios nos locais errados fará com que a instalação falhe.

       # cd /home/j/mroot
       # mkdir s
       # ln -s s/etc etc
       # ln -s s/home home
       # ln -s s/root root
       # ln -s ../s/usr-local usr/local
       # ln -s ../s/usr-X11R6 usr/X11R6
       # ln -s ../../s/distfiles usr/ports/distfiles
       # ln -s s/tmp tmp
       # ln -s s/var var

6. Como último passo, crie um arquivo `/home/j/skel/etc/make.conf` genérico contendo esta linha:

       WRKDIRPREFIX?=  /s/portbuild

   Isto torna possível compilar ports do FreeBSD dentro de cada jail. Lembre-se de que o diretório do ports faz parte do sistema somente leitura. O caminho customizado para o `WRKDIRPREFIX` permite que compilações sejam feitas na parte read-write de cada jail.

### 14.5.2. Criando Jails

O template jail agora pode ser usado para preparar e configurar as jails no arquivo `/etc/rc.conf`. Este exemplo demonstra a criação de 3 jails: `NS`, `MAIL` e `WWW`.

1. Adicione as seguintes linhas ao arquivo `/etc/fstab`, para que o template read-only e o espaço read-write das jails estejam disponível nas respectivas jails:

       /home/j/mroot   /home/j/ns     nullfs  ro  0   0
       /home/j/mroot   /home/j/mail   nullfs  ro  0   0
       /home/j/mroot   /home/j/www    nullfs  ro  0   0
       /home/js/ns     /home/j/ns/s   nullfs  rw  0   0
       /home/js/mail   /home/j/mail/s nullfs  rw  0   0
       /home/js/www    /home/j/www/s  nullfs  rw  0   0

   Para evitar que o fsck verifique as montagens nullfs durante a inicialização e o dump faça backup das montagens nullfs read-only das jails, as duas últimas colunas são ambos definidos para `0`.

2. Configure as jails no arquivo `/etc/rc.conf`:

       jail_enable="YES"
       jail_set_hostname_allow="NO"
       jail_list="ns mail www"
       jail_ns_hostname="ns.example.org"
       jail_ns_ip="192.168.3.17"
       jail_ns_rootdir="/usr/home/j/ns"
       jail_ns_devfs_enable="YES"
       jail_mail_hostname="mail.example.org"
       jail_mail_ip="192.168.3.18"
       jail_mail_rootdir="/usr/home/j/mail"
       jail_mail_devfs_enable="YES"
       jail_www_hostname="www.example.org"
       jail_www_ip="62.123.43.14"
       jail_www_rootdir="/usr/home/j/www"
       jail_www_devfs_enable="YES"

   A variável `jail_`name`_rootdir` é configurada como `/usr/home` em vez de `/home` porque o caminho físico de `/home` em uma instalação padrão do FreeBSD é `/usr/home`. A variável `jail_`name`_rootdir` não deve ser configurada para um caminho que inclua um link simbólico, caso contrário as jails não serão iniciadas.

3. Crie os pontos de montagem necessários para o sistema de arquivos read-only de cada jail:

       # mkdir /home/j/ns /home/j/mail /home/j/www

4. Instale o template read-write em cada jail usando sysutils/cpdup:

       # mkdir /home/js
       # cpdup /home/j/skel /home/js/ns
       # cpdup /home/j/skel /home/js/mail
       # cpdup /home/j/skel /home/js/www

5. Nesta fase, as jails estão compiladas e preparadas para execução. Primeiro, monte os sistemas de arquivos necessários para cada jail e, em seguida, inicie-as:

       # mount -a
       # service jail start

As jails devem estar funcionando agora. Para verificar se eles foram iniciadas corretamente, use `jls`. Sua saída deve ser semelhante ao seguinte:

    # jls
       JID  IP Address      Hostname                      Path
         3  192.168.3.17    ns.example.org                /home/j/ns
         2  192.168.3.18    mail.example.org              /home/j/mail
         1  62.123.43.14    www.example.org               /home/j/www

Neste ponto, deve ser possível entrar em cada jail, adicionar novos usuários ou configurar daemons. A coluna `JID` indica o número de identificação da jail de cada jail em execução. Use o seguinte comando para executar tarefas administrativas na jail cujo JID é `3`:

    # jexec 3 tcsh

### 14.5.3. Fazendo Upgrade

O design dessa configuração fornece uma maneira fácil de atualizar as jails existentes, minimizando o tempo de downtime. Além disso, fornece uma maneira de reverter para a versão mais antiga, caso ocorra algum problema.

1. O primeiro passo é atualizar o sistema host. Em seguida, crie um novo template temporário read-only em `/home/j/mroot2`.

       # mkdir /home/j/mroot2
       # cd /usr/src
       # make installworld DESTDIR=/home/j/mroot2
       # cd /home/j/mroot2
       # cpdup /usr/src usr/src
       # mkdir s

   O `installworld` cria alguns diretórios desnecessários, que devem ser removidos:

       # chflags -R 0 var
       # rm -R etc var root usr/local tmp

2. Recrie os links simbólicos read-write para o sistema de arquivos master:

       # ln -s s/etc etc
       # ln -s s/root root
       # ln -s s/home home
       # ln -s ../s/usr-local usr/local
       # ln -s ../s/usr-X11R6 usr/X11R6
       # ln -s s/tmp tmp
       # ln -s s/var var

3. Em seguida, pare as jails:

       # service jail stop

4. Desmonte os sistemas de arquivos originais, pois os sistemas read-write estão conectados ao sistema read-only (`/s`):

       # umount /home/j/ns/s
       # umount /home/j/ns
       # umount /home/j/mail/s
       # umount /home/j/mail
       # umount /home/j/www/s
       # umount /home/j/www

5. Mova o antigo sistema de arquivos read-only e substitua-o pelo novo. Isso servirá como backup e arquivamento do antigo sistema de arquivos read-only se algo der errado. A convenção de nomenclatura usada aqui corresponde a quando um novo sistema de arquivos read-only foi criado. Mova a Coleção de Ports do FreeBSD original para o novo sistema de arquivos para economizar espaço e inodes:

       # cd /home/j
       # mv mroot mroot.20060601
       # mv mroot2 mroot
       # mv mroot.20060601/usr/ports mroot/usr

6. Neste ponto, o novo template read-only está pronto, então a única tarefa restante é remontar os sistemas de arquivos e iniciar as jails:

       # mount -a
       # service jail start

Use `jls` para verificar se as jails foram iniciadas corretamente. Execute `mergemaster` em cada jail para atualizar os arquivos de configuração.

Anterior | Acima | Próxima
14.4. Tuning e Administração | Principal | 14.6. Gerenciando Jails com o ezjail

All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.