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.
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
.
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.
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
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
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
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
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
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.
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
.
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
.
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_
é configurada como name
_rootdir/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_
não deve ser configurada para um caminho que inclua um link simbólico, caso contrário as jails não serão iniciadas.name
_rootdir
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
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
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
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.
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
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
Em seguida, pare as jails:
#
service jail stop
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
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
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.
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>.