Trabalhar com pacotes em um ambiente isolado. Usando conjuntos de dados e prisões zfs

No artigo anterior, descrevemos como o sistema de distribuição de plug-ins funciona na nova versão do ICS. Hoje vamos falar sobre como implantar um único plugin no sistema.

É melhor executar cada plug-in em uma caixa de proteção adaptada especificamente aos requisitos do plug-in. Além disso, em um ambiente que permitirá ao sistema interagir com o plugin e os plugins entre si. A seguir, para entender que isso se aplica ao manuseio padrão de embalagens, usaremos o termo “embalagem”.



O que escolher?



O que é usado para isso na maioria dos casos? Docker, é claro!



pkg install docker



pkg: Nenhum pacote disponível para instalar correspondente ao 'docker' foi encontrado nos repositórios O







Docker não tem suporte oficial para o FreeBSD e, claro, não existe tal pacote no repositório. Na versão anterior do IKS, usamos uma porta de docker autoescrita não oficial, mas seu suporte é bastante trabalhoso e, além disso, muitas armadilhas surgem ao usá-lo.







Mas o FreeBSD tem seu próprio suporte nativo para ambientes isolados. É chamado de prisão e não é pior para nossos propósitos do que docker. É importante notar que ele apareceu muito antes dos contêineres no Linux. Vamos ver como um contêiner típico é configurado (uma célula na terminologia bsd).



Preparar o conjunto de dados e instalar o pacote



Em primeiro lugar, você precisa criar um conjunto de dados no qual a célula do pacote será configurada. Nosso sistema usa o sistema de arquivos ZFS, que nos permite criar qualquer número de conjuntos de dados herdados.



Por padrão, o sistema possui um conjunto de dados com o mundo base do FreeBSD, a partir do qual criamos um instantâneo (instantâneo):



zfs snapshot zp000111 / freebsd @ snap



zp000111 é o nome do nosso pool de sistema de arquivos raiz. Podemos ver isso por meio do comando zfs mount . zp000111 / freebsd é o nome do conjunto de dados que armazena o mundo. O nome do instantâneo é indicado pelo símbolo @ . Criamos este instantâneo uma vez e, no futuro, todos os conjuntos de dados para pacotes serão herdados dele.



A partir desse instantâneo, criamos um clone no qual nosso pacote viverá:



zfs clone zp000111 / freebsd @ snap zp000111 / packets / <packet_name>



Primeiro, montaremos o conjunto de dados no sistema atual:



mount -t zfs zp000111 / packets / < packet_name> / mnt / packets / <packet_name>



E agora podemos instalar o pacote necessário nele:



pkg -r / mnt / packets / <packet_name> install -y <packet_name> A



opção -r garante a instalação dentro do diretório especificado.



Se necessário, podemos instalar outros pacotes necessários, por exemplo mc para um trabalho conveniente dentro do pacote.



Realizamos desmontagem. Isso não é necessário, mas útil para percorrer todo o caminho para iniciar a célula no futuro:



umount / mnt / packets / <packet_name>



Preparação de células



Primeiro, você precisa decidir sobre o armazenamento dos dados do pacote no sistema de produção. Que seja / usr / local / share / packets.



Adicione o diretório <packet_name>



mkdir / usr / local / share / packets / <packet_name> a ele.



Agora crie um arquivo com o ponto de montagem <packet_name> .fstab. Ele contém informações para a prisão sobre qual diretório no conjunto de dados montado está sincronizado:



/ usr / local / share / packets / <packet_name> / mnt / packets / <packet_name> / usr / local / share / data nullfs rw 0 0



Este é como informamos que o diretório / usr / local / share / data será conectado ao diretório em nosso sistema de trabalho em nosso pacote montado. Esta é uma prisão (sistema de arquivos nullfs), tanto a leitura quanto a gravação são permitidas para troca de dados com um sistema externo (rw), salvando informações sobre o sistema de arquivos e verificando sua integridade não é necessário (0 e 0).



Salvamos o arquivo em um local conveniente, por exemplo, em /usr/local/etc/packets/<packet_name>/<packet_name>.fstab



Agora precisamos definir o arquivo de configuração para a jaula de nosso pacote.



Uma configuração típica com configurações mínimas se parece com isto
host.hostname = "<packet_name>";

path = " /mnt/packets/<packet_name>";

interface = «em0»;

ip4.addr = 192.168.0.1;

allow.raw_sockets = 1;

exec.start = "/bin/sh /etc/rc";

exec.stop = "/bin/sh /etc/rc.shutdown;";

exec.clean;

enforce_statfs = 0;

mount.devfs;

mount.fstab = /usr/local/etc/packets/<packet_name>/<packet_name>.fstab;



Especificamos uma das placas de rede no sistema como a interface. Atribuímos a ele um endereço IP, que estará disponível externamente. Além disso, para que as funções de rede funcionem, como ping ou traceroute, habilitamos a opção allow.raw_sockets.



A seção de comando exec especifica quais comandos executar para iniciar e desligar o sistema dentro da prisão. Como este é o mundo padrão do FreeBSD, especificamos os caminhos básicos para ligar e desligar o sistema.



Com as três últimas opções, permitimos montar sistemas externos, conectar dispositivos físicos e montar nossa pasta de dados dentro da jaula para uma pasta externa de acordo com o arquivo fstab criado.



Salvamos nosso arquivo em um local conveniente, por exemplo, no mesmo diretório /usr/local/etc/packets/<packet_name>/<packet_name>.jail.conf





Estamos prontos para lançar o pacote na gaiola. Vamos começar montando o conjunto de dados do pacote:



mount -t zfs zp000111 / packets / <packet_name> / mnt / packets / <packet_name>



Agora podemos executar a



prisão : jail -f / usr / local / etc / packets / <packet_name> / <packet_name> .jail.conf -c <packet_name>



Com a opção -r, especificamos o caminho para o arquivo de configuração e -c que é necessário criar uma nova jaula com o nome especificado.



Nossa célula foi iniciada, podemos verificar:



jls -j <packet_name>



Uma linha com o nome da célula e seu id no sistema carcerário será exibida.



Agora, se precisarmos entrar no sistema de trabalho do pacote, execute o comando:



jexec <jail_id>/ bin / tcsh



Para parar a



prisão



e desmontar o pacote, execute os comandos reversos: jail -f /usr/local/etc/packets/<packet_name>/<packet_name>.jail.conf -r <packet_name> umount / mnt / packets / <packet_name >



Além disso, todos os dados salvos pelo pacote na pasta / usr / local / share / data de seu sistema de arquivos estarão disponíveis no caminho / usr / local / share / packets / <packet_name> no sistema externo.



Total



Assim, criamos um ambiente isolado para nossa embalagem.



A célula externa fará o ping para o endereço especificado e, portanto, todos os serviços de rede gerados nela também estarão disponíveis. E como os dados do usuário são armazenados em uma pasta externa no sistema de produção, é fácil armazenar e fazer backup.



Um sistema semelhante funcionará em novas versões do IKS , o que tornará seu uso ainda mais fácil e agradável.



É tudo por hoje, obrigado pela atenção!



All Articles