Pourquoi marteler les ongles avec un microscope si vous avez Alpine Linux?

À l'appel de mon cœur et en tant qu'ingénieur système en conception numérique, je dois souvent faire face à des produits logiciels et à des conceptions architecturales sophistiqués. Cela provoque une envie de minimiser et de simplifier tout ce qui vient à portée de main, et conduit au plaisir des décisions humaines qui font juste leur travail , sans inscription et SMS .


J'ai donc rencontré Alpine Linux.


FenĂŞtre inattendue


Vous pouvez aimer cette distribution pour les raisons suivantes:


  • Si vous aimez le minimalisme et les outils orientĂ©s pour accomplir la tâche sans sifflets ni dĂ©corations inutiles;
  • Si vous remarquez que les distributions «mainstream» existantes sont un peu (?) GonflĂ©es et redondantes;
  • Si vous souhaitez rĂ©soudre un problème existant de manière simple.

Par «grand public», je veux dire le trio CentOS-Debian-Ubuntu (bien sûr, le monde ne s'arrête pas là), pardonnez-moi tous ceux qui croient en ces merveilleuses distributions. Lorsqu'ils sont utilisés, périodiquement, à la frontière de la perception, une idée précise se pose - "peut-être que cela peut être plus facile?".


En avons-nous vraiment besoin?


$ mode saint-guerre désactivé
Vraiment pour la solution de votre petite tâche tout cela est nécessaire:


  • Systemd merveilleux. Un système d'initialisation (pas tout Ă  fait du tout) qui pourrait donner l'impression d'un système de contrĂ´le de navette?

    Nenen!
    Personne ne dit que vous ne pouvez pas comprendre comment le gérer, mais sa croissance effrénée peut commencer à faire peur et le nombre de concepts dépasse clairement le minimum requis. Tout cela est-il vraiment nécessaire pour la mise en œuvre d'une tâche simple et d'un redémarrage très rare du serveur?

  • Sous-système de journalisation / audit construit sur un groupe comme journald -> rsyslogd + auditd?


    C'est sans aucun doute génial!

    On peut deviner pourquoi cela se fait de cette manière, mais une telle chaîne est-elle vraiment nécessaire pour ma tâche simple?


  • Duplication des fonctionnalitĂ©s d'exĂ©cution de tâches pĂ©riodiques dans systemd et crond?

    Oh ce Cron!
    Me manque-t-il vraiment son mécanisme classique? Peut-être que sa syntaxe n'est pas complètement évidente, mais les temporisateurs de sd sont-ils si évidents?

  • Coexistence de plusieurs sous-systèmes de gestion de rĂ©seau dans diffĂ©rentes combinaisons: mise en rĂ©seau classique / networkd / NetworkManager?

    Vous devez beaucoup gérer le réseau!
    Cette combinaison, oui, sur le système serveur, et avec plusieurs interfaces de gestion pour tous les goûts. Bien que non, ajoutons ici également netplan, qui «résout» le problème de configuration des sous-systèmes répertoriés. Voulez-vous démarrer votre service ou changer souvent d'orbite en raison de la reconfiguration des interfaces réseau?

  • Des services comme tuned et firewalld?

    Comment sans eux?
    Sont-ils nécessaires à votre tâche? En principe, il est agréable de considérer firewalld comme une tentative d'échapper à la syntaxe iptables, mais en conséquence, au lieu d'une syntaxe, vous comprendrez l'autre et serez perplexe devant la taille des commandes firewall-cmd. Et avez-vous vraiment besoin d'un interprète python et de ses processus dans le système de base? Non, j'aime le python, mais pas dans ce cas.

  • Service de courrier local. ĂŠtes-vous sĂ»r de l’utiliser?



Puisque nous nous sommes souvenus du minimalisme, nous pouvons comparer très grossièrement nos principales distributions dans leur installation minimale :


  • Ubuntu 18.04 est le leader de la redondance de l'espace disque et du nombre de packages ( 2,8 Go d' espace disque, 342 packages, 31 services systemd actifs, 15 processus Ă  l'entrĂ©e). La famille systemd ici est reprĂ©sentĂ©e au maximum - systemd, networkd, timesyncd, resolu, logind, il y a dbus.
  • CentOS 7.5.1804 perd par disque et nombre de paquets, mais le leader des services probablement redondants (1,1 Go d'espace disque, 299 paquets, 34 services systemd actifs, 19 processus Ă  l'entrĂ©e, y compris NetworkManager, firewalld, tuned, postfix, polkitd, auditd, journald + rsyslogd, dbus).
  • Debian 9.4.0 a fait de son mieux pour ne pas gonfler: 940 Mo, 334 paquets, 25 services systemd actifs, 14 processus Ă  la connexion. Bien sĂ»r, il y a aussi systemd ici (ainsi que journald, timesyncd et le dbus qui l'accompagne), mais sans beaucoup de fanatisme concernant la gestion du rĂ©seau.

Holywar: ne peut pas changer le mode pour «désactiver»: autorisation refusée


Je veux un étrange


Vous pouvez (essayer) de vous débarrasser d'une partie de ce qui précède manuellement, mais tout à coup, tout a déjà été inventé pour nous? Idéalement, je veux voir de la distribution d'un système d'exploitation de serveur à usage général:


  • Curieusement, le chargeur de dĂ©marrage, qui nous atteindra jusqu'au noyau;
  • Le noyau du système d'exploitation lui-mĂŞme (linux dans ce cas);
  • Le système d'initialisation que le noyau lancera lorsqu'il sera prĂŞt. Il est souhaitable, en toute simplicitĂ©, non loin de la hache;
  • Ensemble minimal de processus que le système d'initialisation va dĂ©marrer. Eh bien, par exemple:
    • Initialisation finale du pĂ©riphĂ©rique et dĂ©finition de paramètres de noyau supplĂ©mentaires;
    • Fournir des journaux (est-ce possible avec des magazines de texte? Eh bien, s'il vous plaĂ®t);
    • Configuration du rĂ©seau (ce serait bien, avec moins de couches de contrĂ´le);
    • Synchronisation horaire (ntpd / chronyd);
    • Plusieurs consoles locales;
    • Facultatif - exĂ©cution pĂ©riodique des tâches (crond);
    • Facultatif - accès Ă  distance au système (sshd);
    • Ce serait bien d'enregistrer et de restaurer la configuration du pare-feu.

Et c'est à peu près tout, le reste appartient au gestionnaire de paquets. Moins de code exécutable et de configuration - moins de bogues, moins de bogues - moins de bogues. Et le système est également en cours d'exécution et accessible sur le réseau. L'idée semble bonne, voyons maintenant à quel point la distribution Alpine Linux est proche d'elle.


Ă€ propos d'Alpine


Qu'est-ce qui peut charmer Alpine, surtout après CentOS? Un minimalisme désespéré!
Eh bien et, bien sûr, l'absence de besoin de certification " Linux Systemd Certified Voldemort ".


Ce que les auteurs ont fait:


  • RĂ©duction du nombre de composants de base utilisĂ©s;
  • Nous avons choisi des modules plus petits et plus transparents;
  • Simplification du processus de configuration du système.

Ă€ savoir:


  • Processus d'installation extrĂŞmement concis utilisant l'utilitaire de configuration setup-alpine;
  • Extlinux du projet syslinux a Ă©tĂ© utilisĂ© comme chargeur;
  • Un petit outil de construction mkinitfs pour crĂ©er un système de fichiers temporaire utilisĂ© au dĂ©marrage;
  • Système d'initialisation Openrc avec la dĂ©finition des dĂ©pendances entre les services, les niveaux d'exĂ©cution et une pincĂ©e de script;
  • Remplacement de la bibliothèque standard GNU libc par une bibliothèque musl plus lĂ©gère;
  • Au lieu du package GNU coreutils, la plupart des utilitaires système standard dans une version quelque peu tronquĂ©e font partie du package busybox, que vous connaissez peut-ĂŞtre dans les solutions intĂ©grĂ©es;
  • Par dĂ©faut, la coque en frĂŞne est utilisĂ©e dans le cadre de busybox. Bien sĂ»r, personne ne prend la peine de mettre bash si nĂ©cessaire , eh bien, et systemd ;
  • Gestionnaire de packages apk natif et infrastructure de distribution de packages propriĂ©taire.

En outre, les auteurs ont mis en œuvre un certain nombre de mesures visant à augmenter le niveau de sécurité du système de base:


  • Nous avons appliquĂ© les correctifs du noyau grsecurity / PaX (les opinions divergent quant Ă  leur efficacitĂ©, mais quand mĂŞme); Plus maintenant, merci au collègue des commentaires. Le 26 juin seulement, la version 3.8.0 est sortie .
  • Les packages ont Ă©tĂ© collectĂ©s Ă  l'aide de modes qui rĂ©duisent la probabilitĂ© d'exploiter un certain nombre de vulnĂ©rabilitĂ©s possibles.

En conséquence, nous obtenons un système équipé d'un certain nombre de mécanismes de protection supplémentaires, ce qui nous permet de résoudre le problème existant et occupe environ 130 Mo. Sur le système en cours d'exécution, 41 packages sont installés et 13 processus utilisateur sont en cours d'exécution, vous pouvez frapper sur ssh.


Et rien de plus. Il reste à ajouter ce dont vous avez besoin (et à mettre iptables avec la possibilité de restaurer la configuration au démarrage).


Ouvrez légèrement le couvercle


Veuillez noter - Alpine peut être utile comme terrain d'entraînement pour se familiariser avec Linux! Il est subjectivement plus facile de voir la logique des composants que d'essayer de couvrir CentOS ou Ubuntu:


  • Le bootloader de notre système installĂ© est simple, sa configuration se dĂ©compose en 12 lignes:

Configuration du chargeur de démarrage


  • Oui, et dans / boot n'est pas trop de monde:

sortie ls / boot


  • Et voici le bootloader lancĂ© sans fond d'Ă©cran fantaisie:

Lancer le chargeur de démarrage


  • Le noyau dĂ©marre, rĂ©cupère initramfs, accomplit ses propres Ă©tapes d'initialisation et appelle la commande init (qui, en fait, est Ă©galement fournie avec busybox). Init utilise le fichier / etc / inittab:

Contenu de / etc / inittab


  • Et ici, il est explicitement expliquĂ© ce qui doit ĂŞtre lancĂ© pour initialiser le système:
    • ExĂ©cutez 6 processus getty en attente sur 6 consoles virtuelles pour la connexion de l'utilisateur local.
    • DĂ©marrez le système d'initialisation openrc pour atteindre alternativement les niveaux d'initialisation requis (openrc n'utilise pas les niveaux d'initialisation classiques 0-6, mais ses propres niveaux / groupes sysinit - boot - par dĂ©faut).

De plus, l'état du système dépend de la configuration de openrc, à savoir:


  • Variables dĂ©finies dans les fichiers du rĂ©pertoire /etc/conf.d;
  • ExĂ©cutez les scripts situĂ©s dans le rĂ©pertoire /etc/init.d;
  • Liaison des scripts de dĂ©marrage aux «groupes d'initialisation»:

Démons et leur niveau de liaison


Reste à lire les scripts de démarrage et à les traiter en tenant compte des niveaux de lancement et des dépendances.
En utilisant l'exemple syslog (/etc/init.d/syslog), nous pouvons voir à quoi ressemble le script de démarrage openrc.


Comme vous pouvez le voir, ce ne sont pas toujours ceux de vos sacs à pieds mal aimés:


Exemple de fichier de configuration Openrc


Les variables utilisées lors de l'exécution du script sont définies dans le fichier correspondant /etc/conf.d/syslog. Dans notre cas, la variable SYSLOGD_OPTS = "- Z" est définie dans le fichier.
Veuillez noter que le script définit de manière déclarative les dépendances de ce service.


Openrc parcourt honnêtement les scripts de démarrage dans un ordre donné, atteint le niveau «par défaut» - et le voici, un système qui fonctionne!


Des démons sous le capot


Qu'est-ce qui est exactement caché sous les scripts de démarrage openrc? Curieusement - un ensemble de tâches et de démons énumérés ci-dessous.


  • Tout d'abord, au niveau sysinit:


    • dmesg - dĂ©finit le niveau de journalisation pour les messages du noyau;
    • devfs - monter et configurer / dev;
    • mdev - le gestionnaire de pĂ©riphĂ©riques dĂ©marre;
    • hwdrivers - les modules de pĂ©riphĂ©rique sont chargĂ©s en fonction des informations de / sys et / dev;

  • Vient ensuite le niveau de dĂ©marrage:


    • modules - les modules du noyau sont chargĂ©s, dont la liste est dĂ©finie dans / etc / modules;
    • hwclock - les horloges matĂ©rielles en temps rĂ©el sont configurĂ©es;
    • sysctl - dĂ©finit les paramètres du noyau que nous avons dĂ©finis dans /etc/sysctl.conf;
    • swap - la partition de swap est connectĂ©e;
    • bootmisc - les rĂ©pertoires temporaires sont effacĂ©s;
    • urandom - un gĂ©nĂ©rateur de nombres alĂ©atoires est configurĂ©;
    • keymaps - la disposition du clavier est initialisĂ©e;
    • nom d'hĂ´te - dĂ©finit le nom de la machine, qui est dĂ©fini dans / etc / hostname;
    • mise en rĂ©seau - recherche et initialisation des interfaces en utilisant les informations de / etc / network / interfaces;
    • syslog - dĂ©marre le dĂ©mon de journalisation Ă  partir de busybox;

  • Et enfin, le niveau par dĂ©faut:


    • chrony - le service NTP dĂ©marre;
    • crond - le service d'exĂ©cution de tâche planifiĂ©e est lancĂ©;
    • acpid - le service de suivi des Ă©vĂ©nements d'alimentation dĂ©marre;
    • sshd - le service d'accès Ă  distance dĂ©marre.


Hourra, après avoir terminé ces étapes, le système est prêt à fonctionner! N'oubliez pas les dépendances sur les services ci-dessus qui ont été spécifiées dans les fichiers init.d:


  • sysfs - mount / sys;
  • fsck - vĂ©rifier et rĂ©parer les systèmes de fichiers;
  • root - monter le système racine pour Ă©crire / lire;
  • localmount - monte tous les systèmes de fichiers rĂ©pertoriĂ©s dans / etc / fstab;
  • klogd - journalisation des Ă©vĂ©nements du noyau.

Nous ouvrons l'une des consoles locales où getty nous attend, saisissons la connexion, après quoi nous transmettons le mot de passe au processus de connexion et obtenons l'accès au shell ash en cours d'exécution (une fois lancé, le contenu des fichiers / etc / profile, /etc/profile.d/* et ~ /.profile pour préparer l'environnement utilisateur).


Hourra, aucune entité supplémentaire (sans doute utile dans certains cas, comme PAM) - et nous sommes dans le système!


Il reste à utiliser le gestionnaire de paquets apk et à rechercher les paquets dont nous avons besoin pour notre tâche. (Sont-ils là? Vous pouvez évaluer cela via le portail Web ).


Et aussi


  • Les auteurs de la distribution ont créé leur propre module complĂ©mentaire iptables appelĂ© «Alpine Wall». Et il ne se bloque pas constamment en tant que processus sĂ©parĂ© dans le système;
  • Pour ceux qui aiment gĂ©rer le serveur via l'interface Web, le package Alpine Configuration Framework a Ă©tĂ© prĂ©parĂ©. Sans PHP ou Perl, mais avec Lua;
  • Pour ceux qui veulent un bureau, il y a la possibilitĂ© d'installer un environnement graphique (bien que cela puisse s'avĂ©rer pĂ©nible au dĂ©but);
  • Pour les connaisseurs spĂ©ciaux il y a une "installation" d'Alpine en mĂ©moire avec la configuration stockĂ©e sur un stockage externe (voir la description de l'outil lbu ).

Résumé


La distribution Alpine n'est pas parfaite, mais son laconicisme m'a vraiment impressionné, notamment dans le rôle de container (seulement 6 process - init, 4 * getty, syslogd). Pour moi, il devrait ressembler au système d'exploitation minimal du serveur (pardonnez-moi, CentOS!).


De plus, il convient tout à fait au rôle de plate-forme de formation, ce qui vous permet de voir en quoi consiste un kit de distribution moderne, sans plonger immédiatement dans l'abîme des services D et reproduire à plusieurs reprises des fonctionnalités dans des outils configurables à plusieurs niveaux pour toutes les occasions.

Source: https://habr.com/ru/post/fr415279/


All Articles