Travailler avec des packages dans un environnement isolé. Utilisation des ensembles de données et des prisons zfs

Dans l'article précédent, nous avons décrit le fonctionnement du système de distribution de plug-ins dans la nouvelle version d'ICS. Aujourd'hui, nous allons parler de la façon de déployer un seul plugin dans le système.

Il est préférable d'exécuter chaque plugin dans un bac à sable spécialement adapté aux exigences du plugin. De plus, dans un environnement qui permettra au système d'interagir avec le plugin et les plugins les uns avec les autres. Dans ce qui suit, pour comprendre que cela s'applique à la manutention de colis standard, nous utiliserons le terme «colis».



Que choisir?



Qu'est-ce qui est utilisé pour cela dans la plupart des cas? Docker, bien sûr!



pkg install docker



pkg: Aucun paquet disponible pour installer le 'docker' correspondant n'a été trouvé dans les référentiels







Docker n'a pas de support officiel de FreeBSD, et bien sûr il n'y a pas de tel paquet dans le référentiel. Dans la version précédente d'IKS, nous utilisions un portage non officiel auto-écrit de docker, mais sa prise en charge est assez laborieuse, et de plus, de nombreux pièges surgissent lors de son utilisation.







Mais FreeBSD a son propre support natif pour les environnements isolés. Cela s'appelle la prison et n'est pas pire pour nos besoins que docker. Il est à noter qu'il est apparu beaucoup plus tôt que les conteneurs sous Linux. Voyons comment un conteneur typique est configuré (une cellule dans la terminologie bsd).



Préparation du jeu de données et installation du package



Tout d'abord, vous devez créer un ensemble de données sur lequel la cellule de package sera configurée. Notre système utilise le système de fichiers ZFS, qui nous permet de créer n'importe quel nombre d'ensembles de données hérités.



Par défaut, le système a un jeu de données avec le monde de base FreeBSD, à partir duquel nous créons un instantané (instantané):



zfs snapshot zp000111 / freebsd @ snap



zp000111 est le nom de notre pool de système de fichiers racine. Nous pouvons le voir via la commande zfs mount . zp000111 / freebsd est le nom de l'ensemble de données qui stocke le monde. Le nom de l'instantané est indiqué par le symbole @ . Nous créons cet instantané une fois et à l'avenir, tous les ensembles de données pour les packages en seront hérités.



À partir de cet instantané, nous créons un clone dans lequel notre paquet vivra:



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



Tout d'abord, nous allons monter l'ensemble de données sur le système actuel:



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



Et maintenant nous pouvons y installer le package requis:



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



commutateur -r assure l'installation dans le répertoire spécifié.



Si nécessaire, nous pouvons installer d'autres packages nécessaires, par exemple mc pour un travail pratique à l'intérieur du package.



Nous effectuons le démontage. Ce n'est pas nécessaire, mais utile pour aller jusqu'au bout pour démarrer la cellule à l'avenir:



umount / mnt / paquets / <nom_packet>



Préparation cellulaire



Tout d'abord, vous devez décider du stockage des données du package dans le système de production. Soit / usr / local / share / paquets.



Ajoutez-y le répertoire <packet_name>



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



Maintenant, créez un fichier avec le point de montage <packet_name> .fstab. Il contient des informations pour la prison sur le répertoire de l'ensemble de données monté synchronisé:



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



Ceci est comment nous informons que le répertoire / usr / local / share / data sera connecté au répertoire dans notre système de travail dans notre emballage monté. Il s'agit d'une prison (système de fichiers nullfs), la lecture et l'écriture sont autorisées pour échanger des données avec un système externe (rw), enregistrer des informations sur le système de fichiers et vérifier son intégrité n'est pas nécessaire (0 et 0).



Nous sauvegardons le fichier dans un endroit pratique, par exemple, dans /usr/local/etc/packets/<packet_name>/<packet_name>.fstab



Nous devons maintenant configurer le fichier de configuration pour la prison de notre paquet.



Une configuration typique avec des paramètres minimaux ressemble à ceci
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;



Nous spécifions l'une des cartes réseau du système comme interface. Nous lui attribuons une adresse IP, qui sera disponible de l'extérieur. De plus, pour que les fonctions réseau fonctionnent, telles que ping ou traceroute, nous activons l'option allow.raw_sockets.



La section de commande exec spécifie les commandes à exécuter pour démarrer et arrêter le système à l'intérieur de la prison. Puisqu'il s'agit du monde standard de FreeBSD, nous spécifions les chemins de base pour allumer et éteindre le système.



Avec les trois dernières options, nous autorisons le montage de systèmes externes, la connexion de périphériques physiques et le montage de notre dossier de données à l'intérieur de la prison dans un dossier externe en fonction du fichier fstab créé.



Nous sauvegardons notre fichier dans un endroit pratique, par exemple, dans le même répertoire /usr/local/etc/packets/<packet_name>/<packet_name>.jail.conf





Nous sommes tous prêts à lancer le paquet dans la cage. Commençons par monter l'ensemble de données du package:



mount -t zfs zp000111 / packets / <nom_packet> / mnt / paquets / <nom_packet>



Maintenant, nous pouvons exécuter la



prison : jail -f / usr / local / etc / paquets / <nom_packet> / <nom_packet> .jail.conf -c <nom_packet>



Avec l'option -r, nous spécifions le chemin vers le fichier de configuration, et -c qu'il est nécessaire de créer une nouvelle prison avec le nom spécifié.



Notre cellule a démarré, nous pouvons la vérifier:



jls -j <nom_packet>



Une ligne avec le nom de la cellule et son identifiant dans le système de prison sera affichée.



Maintenant, si nous devons entrer dans le système de travail du package, exécutez la commande:



jexec <jail_id>/ bin / tcsh



Pour arrêter la



prison



et démonter le paquet, exécutez les commandes inverses: jail -f /usr/local/etc/packets/<nom_packet>/<nom_packet>.jail.conf -r <nom_packet> umount / mnt / paquets / <nom_packet >



De plus, toutes les données sauvegardées par le paquet dans le dossier / usr / local / share / data de son système de fichiers seront disponibles sous le chemin / usr / local / share / packets / <packet_name> sur le système externe.



Le total



Ainsi, nous avons créé un environnement isolé pour notre package.



La cellule extérieure envoie un ping à l'adresse spécifiée et, en conséquence, tous les services réseau qu'elle contient seront également disponibles. Et comme les données utilisateur sont stockées dans un dossier externe sur le système de production, elles sont faciles à stocker et à sauvegarder.



Un système similaire fonctionnera dans les nouvelles versions d' IKS , ce qui rendra son utilisation encore plus facile et plus agréable.



C'est tout pour aujourd'hui, merci pour votre attention!



All Articles