É 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;
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!