Je suivais un tutoriel sur la configuration d'un initramfs personnalisé où il est indiqué:
La seule chose qui manque est / init, l'exécutable à la racine des initramfs qui est exécuté par le noyau une fois qu'il est chargé. Parce que sys-apps / busybox inclut un shell entièrement fonctionnel, cela signifie que vous pouvez écrire votre binaire / init comme un script shell simple (au lieu d'en faire une application compliquée écrite en Assembleur ou en C que vous devez compiler).
et donne un exemple d'init comme script shell qui commence par #!/bin/busybox sh
Jusqu'à présent, j'avais l'impression que init est le processus principal qui est lancé et que tous les autres processus de l'espace utilisateur sont finalement des enfants d'init. Cependant, dans l'exemple donné, le premier processus est en fait à bin/busybox/ sh
partir duquel init est généré plus tard.
Est-ce une interpertation correcte? Si je disposais, par exemple, d'un interprète disponible à ce stade, je pourrais écrire init en tant que script Python, etc.?
la source
/
ne disparaît pas dans l'air - il est monté dessus (bien que généralement son contenu soit supprimé avant qu'il ne soit pour économiser de la mémoire) . Elle est toujours là .switch_root
fait le syscallswitchroot
- qui est ce que les développeurs du noyau ont fourni lorsqu'ils ont changé le processus de démarrage dans le noyau 2.6.quelque chose pour exiger initramfs. C'est le noyau qui fait la magie.switchroot
syscall serait en effet une nouvelle pour moi. Avez-vous une source pour cela? Si vous regardez le code source switch_root.c, il semble être un processus assez manuel, et le même que celui décrit dans Documentation / filesystems / ramfs-rootfs-initramfs.txt. De plus, si vous supprimez tout et que vous le montez, c'est presque disparu à ce stade, vous ne pensez pas?pivot_root
, d'autre part, est un appel système. Il n'est cependant pas utilisé pourswitch_root
et ne peut pas être utilisé sans sauter à travers certains cerceaux, et de toute façon cela n'a aucune importance pour cette réponse, donc je viens de le supprimer complètement. Dommage, je pensais que la magie et s'évanouir dans l'air mince fonctionnait vraiment bien ... :-Pswitch_root
- pour laquelle je suis désolé, et je vous remercie de m'avoir montré - mais cela ne disparaît de toute façon pas. initramfs persiste racines et est toujours là pour tout le monde - il est racine.find -xdev / -exec rm '{}' ';'
), surmontez rootfs avec le nouveau root (cd /newmount; mount --move . /; chroot .
), attachez stdin / stdout / stderr au nouveau / dev / console et exécutez le nouveau init.L'appel système du noyau Linux comprend nativement les shebangs
Lorsque le fichier exécuté commence par les octets magiques
#!
, ils indiquent au noyau d'utiliser#!/bin/sh
comme:exec
appel système/bin/sh
C'est exactement la même chose qui se produit lorsque vous exécutez un script shell utilisateur normal avec:
Si le fichier avait commencé avec les octets magiques
.ELF
au lieu de#!
, le noyau choisirait le chargeur ELF à la place pour l'exécuter.Plus de détails sur: Pourquoi les gens écrivent le shebang python #! / Usr / bin / env sur la première ligne d'un script Python? | Débordement de pile
Une fois que vous avez cela à l'esprit, il devient facile d'accepter que cela
/init
puisse être tout ce que le noyau peut exécuter, y compris un script shell, et aussi pourquoi ce/bin/sh
sera le premier exécutable dans ce cas.Voici un exemple exécutable minimal pour ceux qui veulent l'essayer: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/cbea7cc02c868711109ae1a261d01fd0473eea0b#custom-init
la source