Trabajar con paquetes en un entorno aislado. Usar conjuntos de datos y cárceles de zfs

En el artículo anterior, describimos cómo funciona el sistema de distribución de complementos en la nueva versión de ICS. Hoy hablaremos sobre cómo implementar un solo complemento en el sistema.

Es mejor ejecutar cada complemento en una caja de arena que se adapte específicamente a los requisitos del complemento. Además, en un entorno que permitirá que el sistema interactúe con el complemento y los complementos entre sí. A continuación, para comprender que esto se aplica al manejo estándar de paquetes, usaremos el término "paquete".



¿Qué elegir?



¿Qué se usa para esto en la mayoría de los casos? Docker, ¡por supuesto!



pkg install docker



pkg: No se han encontrado paquetes disponibles para instalar 'docker' coincidentes en los repositorios.







Docker no tiene soporte oficial para FreeBSD y, por supuesto, no existe tal paquete en el repositorio. En la versión anterior de IKS, usamos un puerto de docker no oficial escrito por nosotros mismos, pero su soporte es bastante laborioso y, además, surgen muchas trampas al usarlo.







Pero FreeBSD tiene su propio soporte nativo para entornos aislados. Se llama cárcel y no es peor para nuestros propósitos que Docker. Vale la pena señalar que apareció mucho antes que los contenedores en Linux. Veamos cómo se configura un contenedor típico (una celda en terminología bsd).



Preparar el conjunto de datos e instalar el paquete



En primer lugar, debe crear un conjunto de datos en el que se configurará la celda del paquete. Nuestro sistema utiliza el sistema de archivos ZFS, que nos permite crear cualquier número de conjuntos de datos heredados.



De forma predeterminada, el sistema tiene un conjunto de datos con el mundo base de FreeBSD, a partir del cual creamos una instantánea (instantánea):



instantánea zfs zp000111 / freebsd @ snap



zp000111 es el nombre de nuestro grupo de sistema de archivos raíz. Podemos verlo a través del comando zfs mount . zp000111 / freebsd es el nombre del conjunto de datos que almacena el mundo. El nombre de la instantánea se indica mediante el símbolo @ . Creamos esta instantánea una vez y, en el futuro, todos los conjuntos de datos de los paquetes se heredarán de ella.



A partir de esta instantánea, creamos un clon en el que vivirá nuestro paquete:



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



Primero, montaremos el conjunto de datos en el sistema actual:



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



Y ahora podemos instalar el paquete requerido en él:



pkg -r / mnt / packets / <packet_name> install -y <packet_name> El modificador



-r asegura la instalación dentro del directorio especificado.



Si es necesario, podemos instalar otros paquetes necesarios, por ejemplo mc para un trabajo conveniente dentro del paquete.



Realizamos desmontaje. Esto no es necesario, pero es útil para poder iniciar la celda en el futuro:



umount / mnt / packets / <packet_name>



Preparación celular



Primero, debe decidir sobre el almacenamiento de los datos del paquete en el sistema de producción. Sea / usr / local / share / packets.



Agregue el directorio <packet_name>



mkdir / usr / local / share / packets / <packet_name>



ahora cree un archivo con el punto de montaje <packet_name> .fstab. Contiene información para la cárcel sobre qué directorio en el conjunto de datos montado está sincronizado:



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



Esto es cómo informamos que el directorio / usr / local / share / data se conectará al directorio en nuestro sistema de trabajo en nuestro paquete montado. Esta es una jail (sistema de archivos nullfs), tanto la lectura como la escritura están permitidas para intercambiar datos con un sistema externo (rw), no se requiere guardar información sobre el sistema de archivos y verificar su integridad (0 y 0).



Guardamos el archivo en un lugar conveniente, por ejemplo, en /usr/local/etc/packets/<packet_name>/<packet_name>.fstab



Ahora necesitamos configurar el archivo de configuración para la cárcel de nuestro paquete.



Una configuración típica con configuraciones mínimas se ve así
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 una de las tarjetas de red del sistema como interfaz. Le asignamos una dirección IP, que estará disponible desde el exterior. Además, para que funcionen las funciones de red, como ping o traceroute, habilitamos la opción allow.raw_sockets.



La sección de comando exec especifica qué comandos ejecutar para iniciar y apagar el sistema dentro de la cárcel. Dado que este es el mundo estándar de FreeBSD, especificamos las rutas base para encender y apagar el sistema.



Con las últimas tres opciones, permitimos montar sistemas externos, conectar dispositivos físicos y montar nuestra carpeta de datos dentro de la cárcel en una carpeta externa de acuerdo con el archivo fstab creado.



Guardamos nuestro archivo en un lugar conveniente, por ejemplo, en el mismo directorio /usr/local/etc/packets/<packet_name>/<packet_name>.jail.conf





Todos estamos listos para lanzar el paquete en la jaula. Comencemos montando el conjunto de datos del paquete:



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



Ahora podemos ejecutar la



cárcel : jail -f / usr / local / etc / packets / <packet_name> / <nombre_paquete> .jail.conf -c <nombre_paquete>



Con la opción -r, especificamos la ruta al archivo de configuración, y -c que es necesario crear una nueva cárcel con el nombre especificado.



Nuestra celda ha comenzado, podemos verificarlo:



jls -j <packet_name>



Se mostrará una línea con el nombre de la celda y su id en el sistema de la cárcel.



Ahora, si necesitamos ingresar al sistema operativo del paquete, ejecutamos el comando:



jexec <jail_id>/ bin / tcsh



Para detener la



cárcel



y desmontar el paquete, ejecute los comandos inversos: jail -f /usr/local/etc/packets/<packet_name>/<packet_name>.jail.conf -r <packet_name> umount / mnt / packets / <packet_name >



Además, todos los datos que fueron guardados por el paquete en la carpeta / usr / local / share / data de su sistema de archivos estarán disponibles en la ruta / usr / local / share / packets / <packet_name> en el sistema externo.



Total



Por lo tanto, hemos creado un entorno aislado para nuestro paquete.



La celda exterior hará ping a la dirección especificada y, en consecuencia, todos los servicios de red generados en ella también estarán disponibles en ella. Y dado que los datos del usuario se almacenan en una carpeta externa en el sistema de producción, es fácil de almacenar y realizar copias de seguridad.



Un sistema similar funcionará en las nuevas versiones de IKS , lo que hará que su uso sea aún más fácil y agradable.



Eso es todo por hoy, ¡gracias por su atención!



All Articles