J'ai découvert que si je choisis jffs
ou sd
comme système de fichiers (et non initramfs
), la taille du noyau sera très petite (1,4 Mo par rapport à 3,4 Mo initramfs
). Cela signifie que cela initramfs
prend beaucoup de place. Donc, si je le peux, je le supprimerais complètement et aurais donc un très petit noyau, ce que je veux.
La question fondamentale qui me vient à l'esprit est: pourquoi ai-je besoin initramfs
? Impossible de démarrer un noyau Linux sans avoir de système de fichiers initial?
Mon application finale ne fera que le calcul et la communication - pas de stockage du tout. Un système d'exploitation sans système de fichiers a donc un sens - du moins pour mon application.
/root
- c'est tout. La seule chose qu'il fait différemment estswitch_root
mais même cela, à condition que des précautions appropriées soient prises avec certains modules du noyau chargés, peut être fait à tout moment. Initramfs n'est rien d'autre qu'une image disque - débordante ou non, elle est là. Et vous n'en êtes jamais sans - c'est votre racine après tout. Cela ne devrait pas être un mystère, c'est ce que je pense, et je n'aime pas toute la confusion inutile qui l'entoure.Réponses:
L'augmentation de la taille d'avoir un initramfs n'est pas due au pilote ramfs (il n'est que de quelques ko, et de toute façon nécessaire pour d'autres choses) mais aux initramfs lui-même. Les initramfs contiennent des programmes qui sont nécessaires pour assembler et monter le vrai système de fichiers racine.
Initramfs facilite
/
le démarrage du système et, dans certains cas, il est possible (par exemple crypté ). Il est fortement recommandé de le conserver sur du matériel de style PC avec beaucoup de périphériques enfichables à chaud. D'un autre côté, il est très logique de démarrer un périphérique intégré sans initramfs, avec un noyau qui prend simplement en charge la configuration matérielle particulière pour laquelle il est conçu.Le noyau doit bien sûr démarrer sur un système de fichiers: il doit y avoir un moyen de charger n'importe quelle application que vous souhaitez exécuter. Si vous ne voulez rien faire, vous pouvez tout aussi bien garder la machine hors tension.
Si vous ne voulez pas utiliser d'initramfs, dites simplement à votre chargeur de démarrage de ne pas en passer un. N'en incluez pas non plus dans la sortie de la construction du noyau, bien sûr - comment cela se produit si tout dépend de l'architecture et du chargeur de démarrage: par exemple,
vmlinux
etbzImage
n'incluez pas les initramfs (ce sont respectivement le noyau brut et le noyau compressé ), maisuImage
(pour U-Boot) contient à la fois le noyau et les initramfs s'il y en a un.(Techniquement, comme le note mikeserv , il y a toujours un initramfs - mais par défaut, c'est une archive vide de 134 octets. Ce que vous voyez et que vous voulez vous débarrasser, c'est un "vrai" initramfs non vide créé par votre processus de construction et contenant des outils qui sont ensuite utilisés pour monter le système de fichiers racine.)
Attention, un initramfs peut être un moyen raisonnable de créer un système à application unique sans données persistantes: mettez toute votre application dans les initramfs, démarrez-la et conservez-la. Cela facilite l'organisation de votre stockage persistant ou de votre image de démarrage (tout ce dont vous avez besoin est le noyau et les initramfs, qui peuvent être regroupés). Il y a cependant des inconvénients à cette approche: toutes les données dans les initramfs seront stockées en RAM de façon permanente, et vous ne pouvez pas facilement modifier les fichiers dans l'image de démarrage, vous devez reconstruire l'archive.
la source
Depuis LFS :
...
...
Une autre source www.kernel.org
En plus de cela, il y a beaucoup de systèmes Linux qui aiment les routeurs qui n'utilisent pas initramfs.
la source
Vous avez besoin d'un initramfs pour les configurations plus complexes, telles que le démarrage réseau, ou lvm ou raid, car elles nécessitent certains utilitaires en mode utilisateur pour configurer l'accès aux root fs. Pour une partition simple et conventionnelle sur un disque, tant que les pilotes de disque sont intégrés dans le noyau et que vous spécifiez l'argument racine par chemin de périphérique plutôt que par UUID, vous pouvez vous passer d'un initramfs. Bien sûr, le chemin du périphérique est susceptible de changer, en fonction des périphériques plug-and-play (c'est-à-dire usb) que vous avez connectés, ou même simplement des variations de synchronisation aléatoires, c'est pourquoi presque tout le monde utilise des uuids et un initramfs pour plus de fiabilité.
la source
Ceci est une vieille question mais ne semble toujours pas avoir de réponse acceptée, donc je vais jeter cela là-bas (je ne suis pas un expert ici, j'essaie de comprendre cela par moi-même.)
De https://www.kernel.org/doc/Documentation/early-userspace/README (tout en bas qui indique qu'il n'a pas été mis à jour depuis 2004.)
Pour ce que ça vaut, je crois que les appareils / distributions tels que Raspberry Pi, etc. n'utilisent pas d'initramfs; dans certains cas, le noyau est sur la partition racine (monté par le chargeur de démarrage qui a les modules fs requis.) Dans d'autres cas où le noyau est par exemple sur une
/boot
partition, les initramfs sur la même partition sont accessibles directement avant de monter les rootfs comme d'autres ont déclaré.Dans certains cas, les initramfs peuvent être intégrés dans le même fichier que le noyau mais ce n'est pas toujours le cas. (a) semble indiquer assez clairement que dans certains cas, initramfs n'est pas nécessaire.
la source
Je trouve l' explication suivante plus claire,
la source
Peu importe ce que vous faites, vous l'avez
initramfs
. Il est impossible de s'en passer - c'est le seul système de fichiers qui vous est imposé. De kernel.org :Qu'est-ce que rootfs?
Rootfs
est un cas particulier deramfs
(outmpfs
, si cela est permis), qui est toujours présent dans les systèmes 2.6. Vous ne pouvez pas démonterrootfs
pour à peu près la même raison que vous ne pouvez pas tuer le processus d'initialisation; plutôt que d'avoir du code spécial pour rechercher et gérer une liste vide, il est plus petit et plus simple pour le noyau de s'assurer que certaines listes ne peuvent pas devenir vides.La plupart des systèmes montent simplement un autre système de fichiers
rootfs
et l'ignorent. La quantité d'espace qu'une instance vide de ramfs occupe est minuscule.Si * CONFIG_TMPFS * est activé,
rootfs
utilisera à latmpfs
place deramfs
par défaut. Pour forcerramfs
, ajoutez"rootfstype=ramfs"
à la ligne de commande du noyau.Qu'est-ce que initramfs?
Tous les noyaux Linux 2.6 contiennent une archive au
"cpio"
formatgzippé, qui est extraite aurootfs
démarrage du noyau. Après extraction, le noyau vérifie pour voir sirootfs
contient un fichier"init"
, et s'il l'exécute comme PID 1. Si trouvé, ceinit
processus est responsable de mettre le système le reste du chemin, y comprislocalisation etmontage du dispositif réel racine ( si seulement). Sirootfs
ne contient pas deinit
programme après que l'cpio
archiveintégrée yest extraite, le noyau passera à l'ancien code pour localiser et monter une partition racine, puis exécutera une variante/sbin/init
de celle-ci.Tout cela diffère de l'ancien initrd à plusieurs égards:
Comme il s'agit d'un processus remarquablement persévérant (et implique la suppression de commandes avant de pouvoir les exécuter), le package klibc a introduit un programme d'aide (utils / run_init.c) pour faire tout cela pour vous. La plupart des autres packages (tels que busybox) ont nommé cette commande "switch_root".
Remplissage des initramfs:
Le processus de construction du noyau 2.6 crée toujours une archive initramfs au format cpio compressé et la relie au binaire du noyau résultant. Par défaut, cette archive est vide (consommant 134 octets sur x86).
L'option de configuration CONFIG_INITRAMFS_SOURCE (dans General Setup dans menuconfig, et vivant dans usr / Kconfig) peut être utilisée pour spécifier une source pour l'archive initramfs, qui sera automatiquement incorporée dans le binaire résultant. Cette option peut pointer vers une archive cpio gzippée existante, un répertoire contenant des fichiers à archiver ou une spécification de fichier texte telle que l'exemple suivant:
Exécutez "usr / gen_init_cpio" (après la construction du noyau) pour obtenir un message d'utilisation documentant le format de fichier ci-dessus.
Un avantage du fichier de configuration est que l'accès root n'est pas requis pour définir les autorisations ou créer des nœuds de périphérique dans la nouvelle archive. (Notez que ces deux exemples d'entrées de "fichier" s'attendent à trouver des fichiers nommés "init.sh" et "busybox" dans un répertoire appelé "initramfs", sous le répertoire linux-2.6. *. Voir Documentation / early-userspace / README pour plus de détails.)
Le noyau ne dépend pas des outils cpio externes. Si vous spécifiez un répertoire au lieu d'un fichier de configuration, l'infrastructure de construction du noyau crée un fichier de configuration à partir de ce répertoire (usr / Makefile appelle scripts / gen_initramfs_list.sh) et procède à l'empaquetage de ce répertoire à l'aide du fichier de configuration (en le nourrissant dans usr / gen_init_cpio, qui est créé à partir de usr / gen_init_cpio.c). Le code de création de cpio au moment de la construction du noyau est entièrement autonome, et l'extracteur au démarrage du noyau est également (évidemment) autonome.
la source
do_mounts.c
- spécifiquementprepare_namespace
, dans laquellesaved_root_name
vient rempli l'root=
argument de ligne de commande.