Qu'est-ce que le sticky bit faisait à l'origine lorsqu'il était appliqué aux fichiers?

65

Dans divers endroits , on peut voir le « peu collante » accusé d'être aujourd'hui un abus de langage complet, que sa fonctionnalité de nos jours est d'affecter les droits d'écriture sur les répertoires et agir en tant que suppression restreint drapeau.

Dans une réponse à AskUbuntu, le répondeur a écrit qu ' "un bit collant s'applique généralement aux répertoires" . J’ai observé que les systèmes modernes semblaient en pratique ne jamais l’appliquer à des fichiers, mais qu’il y a longtemps, il était d’ habitude de l’appliquer à des fichiers (programmes exécutables) plutôt qu’à des répertoires. (En ce qui concerne la rareté de l’utilisation moderne des fichiers, il existe une question connexe à la question suivante : le bit persistant n’est-il pas utilisé dans les systèmes de fichiers actuels ?)

Cela a suscité la question:

Qu'est - ce qu'un bit collant appliqué à un exécutable a fait? Était-ce alors comme setuid?

Notez le passé. Ce n'est pas Comment fonctionne le bit collant? maintenant. C'est comme ça que ça fonctionnait alors.

JdeBP
la source
3
Je voudrais souligner que "j’ai observé qu’en fait, les systèmes modernes semblaient en pratique ne jamais l’appliquer à des fichiers" n’est vrai que pour certains systèmes. La page de Wikipedia sur les notes autocollantes : "Actuellement, ce comportement n’est opérationnel que dans HP-UX et UnixWare." Il contient un tableau illustrant diverses implémentations: le dénominateur commun est que les systèmes d’exploitation l’ignorent ou le traitent pour identifier comment la mémoire / swap / etc. devrait être manipulé. Les détails de son utilisation varient selon les systèmes d'exploitation. Par exemple, aucun système Linux n'a jamais utilisé le même problème comme la réponse de JdeBP.
TOOGAM

Réponses:

91

Non, le bit collant ne ressemblait pas aux indicateurs set-UID ou set-GID. Cela n'a eu aucune incidence sur le traitement des informations d'identification.

Le problème était de rendre le texte du programme "collant". Ce n'était pas un abus de langage, à l'origine.

arrière-plan: sections d'image de programme et texte partagé

Essentiellement, sans entrer trop dans les détails des formats de fichiers exécutables (qui peuvent et ont des livres pleins): les parties des fichiers d’image de programme qui sont directement chargées en mémoire pour exécuter des programmes comprennent le code valeurs de variables (non initialisées à zéro) et (sous une forme ou une autre) des espaces pour les variables initialisées à zéro et non initialisées.

Celles-ci sont regroupées dans des collections appelées "sections" et portent des noms conventionnels. Le code machine et (parfois) les constantes forment ce qu'on appelle souvent la section "texte" d'une image de programme. Les variables non initialisées à zéro sont, de même, la section "data"; et les variables initialisées à zéro et non initialisées sont "bss" (un nom qui a lui-même toute une histoire folklorique).

Lorsqu'un processus contient un fichier image exécutable du programme, les différentes parties - texte, données et bss - sont initialisées à partir du contenu du fichier image.

La particularité de la section "texte" est que le code machine (et les constantes) n'est presque toujours pas écrit. Il a le potentiel d'être partagé sur les images de mémoire virtuelle de tous les processus en cours d'exécution contenant ce fichier image exécutable. Le scénario exact dans lequel le texte du programme peut être partagé est hors de portée pour cette réponse et implique des éléments tels que l'idempotence de la correction du chargeur et l'identité de la présentation de l'espace d'adressage. Les gens peuvent et ont écrit des livres sur ce sujet aussi. ☺

Le texte partagé est une optimisation employée par le noyau. Il supprime la nécessité pour chaque instance d'une image de programme en cours d'exécution d'avoir sa propre image de mémoire, consommant ainsi une mémoire physique précieuse avec plusieurs copies du même code machine (et des mêmes constantes).

texte collant

Mais on peut faire mieux encore que le texte partagé. Évidemment, si au moins un processus en cours d'exécution utilise une image de programme de texte partagé particulière, le noyau doit simplement attacher l'espace de mémoire virtuelle des nouveaux processus au segment de texte partagé existant lorsqu'une nouvelle instance du programme est exécutée. Il y a presque toujours une instance de (disons) /bin/loginou /bin/shfonctionnant quelque part sur un système de taille moyenne, de sorte que les nouvelles instances du programme de connexion ou le shell par défaut peuvent simplement se connecter aux copies chargées de leurs segments de texte que le noyau a déjà chargées en mémoire.

Sticky text étend cette idée à la programmation d'images qu'aucun processus n'est en cours d'exécution . Si un fichier image exécutable est marqué comme texte collant, le noyau conserve son segment de texte après le dernier processus d'utilisation; en espérant qu'une autre instance du programme s'exécutera bientôt et pourra simplement se rattacher au segment.

Au début de Unices, les segments de texte collants chargés étaient échangés en stockage d'échange lorsqu'aucun processus n'y était associé. (Les Unices ultérieurs ont arrêté d'utiliser swap pour cela.) Vous avez peut-être aussi entendu parler de cela sous le nom texte enregistré .

Bien sûr, il est important de définir le bit de texte collant sur une image de programme avec précaution. Les programmes qui en bénéficient dépendent de l’utilisation généralement faite de la machine. Et les segments de texte actuellement non attachés utilisent les ressources du noyau, ce qui signifie qu'il y a une limite pratique au nombre de personnes pouvant en avoir dans n'importe quel système. C'est donc généralement une opération qui nécessite des privilèges de superutilisateur.

désuétude

Il y a toute une série d'hypothèses qui sous-tendent le fonctionnement du texte persistant, qui ne sont tout simplement plus vraies. La lecture d'un segment prédéfini à partir d'un stockage d'échange n'est pas nécessairement plus rapide qu'une simple pagination à la demande à partir du fichier image exécutable réel. Les formats de système de fichiers sont devenus meilleurs pour les modes de lecture aléatoires (par opposition aux modes de lecture séquentiels). L'avènement de la pagination à la demande elle-même change les choses, tout comme des tâches telles que les caches unifiés, les corrections externes non idempotentes résultant de différences dans la recherche de bibliothèque partagée et la randomisation de la disposition des espaces d'adressage.

L'époque des bits de texte collants pour les images de programmes exécutables est révolue. Un indicateur de marqueur de texte collant explicite pour des images de programme exécutables a été considéré comme obsolète par les auteurs de 4.3BSD au milieu des années 1980, par exemple.

Lectures complémentaires

  • Maurice J. Bach (1986). La conception du système d'exploitation UNIX . Prentice Hall. ISBN 9780132017992.
JdeBP
la source
1
Très belle réponse! Aujourd'hui j'ai appris quelque chose. :)
Andreas Wiese
Moi aussi :) Cela ressemble beaucoup à ce que je connaissais sous TSRle nom de DOS: "terminer et rester résident". Cependant, c'était généralement pour des choses comme les pilotes de périphériques que d'autres processus exécutés plus tard ont besoin d'appeler, et probablement obsolète lorsque le monde est passé à un système d'exploitation multi-thread / multi-processus.
Steve
1
C'est une réponse géniale. Où puis-je lire sur la genèse de bss?
Chat
1
Les TSR ne sont pas vraiment analogues. Pour les analogues dans le monde IBM + Microsoft, recherchez DOS + Windows 3.x en mode standard et 16 bits OS / 2 version 1.x. Les CODEsegments (et sur les segments OS / 2 en lecture seule DATA) des fichiers EXE et DLL sont (généralement) partagés par tous les programmes en cours d'exécution. Il n’existe pas d’équivalent réel de "rigidité", en partie parce que les modes 32 bits OS / 2 version 2.x et 386 en mode étendu remplaçaient la permutation de segments par la mémoire virtuelle paginée à la demande, comme l’avait déjà fait le monde Unix plusieurs années auparavant, dans les deux domaines du besoin de coller de segmentation de la même manière.
JdeBP
3
@JdeBP: La question "Est-ce que le bit collant était comme setuid?" est plutôt large et imprécis. Je dirais que la réponse est "Eh bien, un peu; c'est compliqué" parce que les neuf bits de poids faible étaient et sont similaires: ils déterminent si certains utilisateurs peuvent effectuer certaines opérations sur un fichier. Et les ensembles set-UID, set-GID et sticky étaient similaires en ce sens qu’ils n’indiquaient pas si une opération était autorisée, mais modéraient plutôt un aspect de la manière dont elle était exécutée (en particulier l’opération d’exécution).
G-Man dit 'Réintégrez Monica' le