Le noyau Linux a-t-il besoin d'un système de fichiers pour fonctionner?

19

Mon avis est oui, il le fait, car toute exposition utile au monde extérieur (mode processeur non privilégié) nécessiterait d'abord un processus en cours d'exécution dans le monde extérieur. Cela nécessiterait un système de fichiers, même un système de fichiers temporaire en RAM.

Un autre ingénieur n'est pas d'accord avec moi, mais je n'arrive pas à le prouver au-delà de tous les cas (inconnus de moi).

La réponse à cette question dépend-elle de la définition de «courir»?

Peter L.
la source
4
je pense qu'un noyau en cours d'exécution ne "nécessite" pasuseful exposure to the outside world
jsotola
19
Rappelle le vieux pare-feu Linux arrêté (vers 2002)
Jeff Schaller
1
Si vous ajoutez du nouveau code au noyau, vous pouvez faire n'importe quoi. Si vous ne le pouvez pas, il s’initialisera correctement jusqu’au moment où il essaiera de s’exécuterinit (le premier processus de l'espace utilisateur), et cela échouera.
user253751
1
Définir "courir" ...
Thorbjørn Ravn Andersen

Réponses:

27

C'est une question plutôt étrange car vous n'exécutez pas le noyau comme vous exécutez un programme. Le noyau est une plate-forme sur laquelle exécuter des programmes. Bien sûr, il existe du code de configuration et d'arrêt, mais il n'est pas possible d'exécuter le noyau seul. Il doit toujours y avoir un processus "init" principal. Et le noyau paniquera s'il n'est pas là. Si init tente de quitter le noyau, il paniquera également.

Ces jours-ci, le processus init est quelque chose comme systemd. Sauf indication contraire, le noyau essaiera d'exécuter un programme à partir d'une liste d'emplacements commençant par /sbin/init. Voir le paramètre init ici http://man7.org/linux/man-pages/man7/bootparam.7.html en cas d'urgence avec lequel vous pouvez démarrer Linux init=/bin/bash. Mais remarquez comment vous spécifiez toujours un fichier sur le système de fichiers à exécuter.

Ainsi, le noyau paniquera s'il démarre et n'a pas de système de fichiers car sans celui-ci, il n'y a aucun moyen de charger init.

Une certaine confusion peut survenir à cause d'une situation de poule et d'oeuf où le noyau doit charger des pilotes pour accéder à son système de fichiers. Pour contourner cela, un disque virtuel initial est chargé à partir d'une image sur le disque contenant des pilotes vitaux et des scripts de configuration. Ils sont exécutés avant le chargement du système de fichiers. Mais ne vous y trompez pas, le disque virtuel initial est lui-même un système de fichiers. Avec un ramdisk initial /initest appelé (qui est stocké sur le ramdisk initial). Dans de nombreuses distributions, c'est finalement ce qui appelle /sbin/init. Encore une fois sans système de fichiers, cela est impossible.

Philip Couling
la source
N'y a-t-il pas une condition où le noyau renonce à essayer d'initialiser le matériel et de charger un système de fichiers connu (pas initrd passé dans le noyau via les paramètres init), puis tombe dans un shell très limité (sans init = / bin / bash)? De plus, puisque vous lancez / bin / bash, le noyau aurait-il toujours ce système de fichiers minimal disponible, même s'il était construit avec d'autres options .config qui pourraient potentiellement éliminer cela?
Peter L.
1
@PeterL. ce shell limite est un shell de l'initrd / initramfs / quel que soit le noyau démarré, IIRC.
muru
3
Notez que vous pouvez créer les initramfs (une archive CPIO qui est extraite dans un système de fichiers ramfs ou tmpfs) dans le noyau. C'est à vous de décider si le noyau «a besoin d'un système de fichiers», car cela signifie que vous pouvez démarrer le noyau et rien d'autre que le noyau et avoir un système fonctionnel (bien qu'un peu limité). Notez également que, même si vous corrigez le noyau pour qu'il ne nécessite plus d'init, il créera toujours des systèmes de fichiers virtuels internes qui ne seront jamais exposés.
forêt
@forest Le système n'a pas besoin d'être "limité" - vous pouvez emballer systemd et gnome dans votre initrd (avec des trucs qui sont réellement utiles ;-)). Une limitation de initramfs était (est encore?) Qu'il ne soutenait pas les attributs étendus - je l'ai fait le travail autour d' elle sur android en incluant une image ext4 dans l'archive initrd cpio qui a ensuite été monté comme un dispositif de boucle du init.$DEV.rcscript.
Oncle Billy
1
@IsmaelMiguel, non, un initramfs en tant que tel est une archive cpio. Squashfs est un bon choix pour les systèmes de fichiers intégrés, et on pourrait faire un initrd (vs un initramfs) qui l'utilise (les termes sont souvent utilisés de manière interchangeable mais ce n'est pas tout à fait la même chose), mais ce n'est pas le format que Linux décompresse dans son initramfs. (En effet, une image squashfs n'a pas besoin d'être décompressée avant de pouvoir être utilisée; elle est correctement indexée).
Charles Duffy
16

La réponse dépendra de savoir si vous entendez littéralement sans système de fichiers ou si la question est destinée à être interprétée un peu différemment de la façon dont elle est effectivement formulée. Les réponses pour de légères variations dans l'interprétation de la question sont:

  • Exécuter Linux sans aucun périphérique bloc est entièrement réalisable et utile pour certains cas d'utilisation spécialisés.
  • Exécuter Linux sans aucun système de fichiers va nécessiter la réécriture de certaines parties du code du noyau et il est peu probable que ce soit un effort utile.
  • L'exécution de Linux sans utiliser aucun descripteur de fichier exigera beaucoup d'efforts. Je suis sûr que cela ne vaudra pas l'effort.

Les raisons pour lesquelles vous auriez à réécrire des parties du code du noyau pour créer un système fonctionnel sans système de fichiers sont les suivantes:

  • Chaque thread a un répertoire racine et un répertoire de travail actuel qui doit pointer vers un système de fichiers.
  • Les programmes sont lancés par le execve appel système qui a besoin d'un exécutable à partir d'un système de fichiers.
  • Le noyau crée un système de fichiers basé sur la mémoire pendant le processus de démarrage.

Après le démarrage d'un programme à l'aide de execve il est possible pour lui de démapper l'exécutable à partir duquel il a été démarré, mais pour le faire sans le bloquer immédiatement, il faut d'abord créer un mappage de mémoire exécutable qui ne soit pas soutenu par un fichier, et il doit l'initialiser avec du code utile avant de sauter dessus et de démapper l'exécutable.

Ainsi, un programme en mode utilisateur en cours d'exécution peut exister dans un état où il n'a aucun mappage de mémoire sauvegardé par des fichiers et il peut fermer tous les descripteurs de fichiers sauvegardés par des fichiers. Il ne peut pas arrêter d'avoir un répertoire racine et un répertoire de travail actuel, mais il peut s'abstenir de ceux-ci.

Donc, bien que dans cet état, vous puissiez implémenter du code du noyau pour extraire le système de fichiers du programme et le faire continuer, cela ne semble pas utile. Et entrer dans cet état final sans passer par un état intermédiaire d'utilisation d'un système de fichiers va être encore plus de travail sans aucun avantage utile.

Une configuration utile pour certains cas d'utilisation spécialisés

Il peut être utile d'éviter l'utilisation de périphériques bloc. Pendant le démarrage, le noyau crée un système de fichiers mémoire et peut également remplir ce système de fichiers avec le contenu d'une cpioarchive avant de l'exécuterinit . De cette façon, vous pouvez exécuter un système entièrement à partir d'un système de fichiers basé sur la mémoire sans aucun périphérique de bloc pour le sauvegarder.

Cela peut être utile pour les systèmes où vous ne souhaitez conserver aucun état et souhaitez que le système démarre à partir d'une table rase lors du redémarrage.

Bien sûr, le noyau et l'archive cpio doivent en quelque sorte exister en mémoire avant que le noyau ne reçoive le contrôle. Comment ils y sont arrivés est un travail pour le chargeur de démarrage. Le chargeur de démarrage aurait pu charger ceux-ci à partir d'un périphérique bloc même si le système en cours d'exécution n'utilise pas de périphériques bloc. Mais il est également possible pour le chargeur de démarrage d'acquérir le noyau et l'archive cpio sans utiliser un périphérique bloc, par exemple en démarrant sur le réseau.

kasperd
la source
1
La question est de savoir si un noyau Linux dans n'importe quelle configuration construite (sans rien réécrire) peut «s'exécuter» sans aucun système de fichiers. Il n'a rien à faire d'utile ni à conserver un état. De toutes les réponses, je suis entendu que certains genre de système de fichiers est fourni et pris en charge dans le noyau lui - même, au moins jusqu'à l' arrêt. Même '/' est un système de fichiers. Donc, je pense que pour simplifier la réponse, c'est «oui».
Peter L.
2
@PeterL. Oui, si vous ne réécrivez rien, Linux nécessitera un système de fichiers. Lorsque les gens parlent d'utilisations pratiques de Linux sans système de fichiers, ils se réfèrent généralement à ceux qui sont soutenus par un périphérique bloc et vous pouvez exécuter Linux sans système de fichiers soutenu par un périphérique bloc. Vous auriez toujours une sorte de système de fichiers.
kasperd
3

Sous Linux, presque chaque périphérique est un fichier , vous devez donc avoir un système de fichiers pour l'exécuter.

K7AAY
la source
8
Mais bien sûr, les pilotes de périphériques existent à l'intérieur du noyau indépendamment du fait qu'un fichier de périphérique pointe vers eux.
Philip Couling
6
Tous les appareils ne sont pas un fichier. Les interfaces réseau ( eth0, wlan0etc.) ne le sont pas, par exemple.
Ruslan
1
Il s'agit d'une idée fausse courante. Alors qu'en théorie, tout est un fichier dans les systèmes UNIX et UNIX, il n'est vrai que pour les systèmes hautement spécialisés comme Plan 9 (bien qu'il soit beaucoup plus vrai que pour Windows). Pour Linux, pas mal de choses ne sont pas des fichiers. Cela devient de plus en plus vrai car de nombreux pilotes ont commencé à utiliser netlink plutôt que ioctls sur les périphériques de caractères (qui sont des fichiers).
forêt
@forest Plan 9 n'est pas un système "hautement spécialisé" - il était censé être un système à usage général comme Unix ou Windows (pourquoi il n'a pas réussi à remplacer Unix et est resté un système de recherche est une histoire complètement différente). Quoi qu'il en soit, tout comme Linux, plan9 expose des interfaces virtualisées à son matériel (et n'a pas d'ioctls - je ne vois pas comment l'utilisation de netlink vs ioctls dans tout cela), même s'il s'efforce d'être plus cohérent (par exemple les interfaces réseau sont accessibles via le système de fichiers). Avec l'introduction des espaces de noms, Linux ressemble déjà plus à plan9 qu'à unix classique.
Oncle Billy
1
Très bel argument: soit il y a devfs, qui est un système de fichiers par définition, soit il n'y a pas de devfs, auquel cas vous avez besoin d'un système de fichiers pour héberger les nœuds de périphériques ...
pmf
-1

Un noyau EST un programme, comme tout autre. Par défaut, le noyau Linux tente d'accéder au système de fichiers, mais ce comportement peut être trivialement éliminé par une modification du noyau (en fait juste un ajout d'une fonction "arch_call_rest_init ()"). Afin d'effectuer un "travail utile", nous nous attendons à ce que le développeur puisse inclure des threads du noyau (kthreads), perhapos dans un pilote personnalisé, pour effectuer l'initialisation et la charge de travail de type d'application souhaitées. Le noyau Linux contient déjà de nombreux kthreads, mais principalement pour effectuer des travaux annexes au noyau ou aux pilotes. Les API disponibles dans le contexte du noyau sont très différentes de celles disponibles dans l'espace utilisateur Linux. Une grande partie de la fonctionnalité d'appel système deviendrait inutile dans un scénario sans système de fichiers.

Oui, Linux attend l'accès aux systèmes de fichiers par défaut. Non, un noyau modifié pourrait certainement être fait pour effectuer un travail utile sans aucun système de fichiers. L'utilisation pratique de Linux sans système de fichiers est IMO assez limitée, mais pas nulle. FWIW, dans le passé, de nombreux noyaux en temps réel étaient intégrés dans le même espace de nom et binaire que les applications RT.

stevea
la source