web-dev-qa-db-fra.com

Linux minimal avec noyau et Bushbox: / etc / inittab est ignoré uniquement / init est exécuté

J'ai réussi à créer un CD LIVE Linux entièrement fonctionnel et entièrement fonctionnel qui ne contient que le noyau (compilé avec des options par défaut) et Busybox (compilé avec des options par défaut + statique, tous les applets présents, y compris /sbin/init). Je n'avais aucun problème à créer initrd et peupler /dev, /proc et /sys Et aussi je n'avais aucun problème avec mon /init Script shell.

Récemment, j'ai lu que Busybox prend en charge /etc/inittab Configurations (au moins à un certain niveau) et je voudrais beaucoup faire l'une des opérations suivantes:

  • Oublier mon /init Script shell et repose entièrement sur /etc/inittab configuration.
  • Utilise les deux /init Script shell et /etc/inittab configuration.

Maintenant le problème réel - il semble que /etc/inittab est complètement ignoré lorsque ma distribution démarre. Les symptômes sont:

  • Quand je supprimai /init et ne laissez que /etc/inittab Je finis avec le noyau panique. Mon hypothèse est que le noyau n'exécute pas /sbin/init du tout, ou que /sbin/init ne trouve pas (ou lu) /etc/inittab.
  • J'ai lu que Busybox devrait fonctionner bien même sans /etc/inittab. Donc, j'ai enlevé les deux /init et /etc/inittab et devinez quoi - le noyau panique à nouveau.
  • J'ai essayé d'exécuter /sbin/init de ma coquille et après plusieurs suppositions qui comprenaient exec /sbin/init, setsid /sbin/init et exec setsid /sbin/init J'ai fini par la panique du noyau. À la fois avec et sans/etc/inittab étant présent sur le système de fichiers.

Voici le contenu de mon /init Script shell:

#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh

À ce stade, je me fiche de ce que le contenu de l'/etc/inittab serait, tant que j'ai un moyen de savoir que la configuration fonctionne réellement. J'ai essayé plusieurs /etc/inittab Configurations, toutes basées sur les informations que j'ai trouvées ici .

Comme un minimum minimum mon/etc/inittab contenait juste cette ligne:

::sysinit:/bin/sh

Encore une fois - j'ai fini avec le noyau panique et il semble que /etc/inittab a été ignoré.

Toute suggestion comment forcer ma petite distribution en direct à travailler bien avec Busybox's /etc/inittab sont très appréciés!

Mise à jour:

  • Juste pour le faire clairement - je ne le faites pas avoir des problèmes de panique de noyau avec mon /init Script shell avec et sans /etc/inittab. Tout fonctionne bien, mon /bin/ash Console fonctionne bien et je ne fais pas de troubles inattendus. Le seul problème est que /etc/inittab est complètement ignoré, comme je l'ai décrit ci-dessus.
  • J'ai examiné 3 distributions Linux différents: SLAX, FINNIX ET SYSRESCD. Tous ont /init Et aucun d'entre eux n'a /etc/inittab. En outre cet article Wiki conclut ma suspicion que /sbin/init n'est pas invoqué du tout.
12
Ivan Davidov

Ok, j'ai fait beaucoup de recherches approfondies et j'ai découvert ce qui n'allait pas. Commençons un par un:

  • Lorsque nous utilisons initramfs schéma de démarrage, le premier processus que le noyau invoque est le /init script. Le noyau n'essaiera jamais d'exécuter /sbin/init directement.
  • /init est attribué l'identifiant de processus 1. C'est très important!
  • Le problème est que /sbin/init ne peut être démarré que PID 1 Mais nous courons déjà /init comme pid 1.
  • La solution consiste à exécuter la ligne de commande exec /sbin/init pendant que nous sommes toujours à l'intérieur /init. De cette manière, le nouveau processus (qui est /sbin/init) héritera du PID de son parent (/init avec PID 1) et c'est tout ce que nous devons faire.

Le problème que j'ai connu avec ma configuration initiale (voir la question) était due au fait que la dernière chose que mon /init script est de reproduire de nouveau /bin/sh processus qui est attribué à une nouvelle nouvelle PID. De ce point, il est impossible de courir /sbin/init directement à partir de la console interactive car même lorsque nous exécutons la ligne de commande exec /sbin/init, le meilleur que nous réalisons est d'attribuer le même PID qui a déjà été attribué à la coquille et ce PID n'est définitivement pas pid 1.

Longue histoire courte - exécuter la ligne de commande exec /sbin/init directement de /init et c'est tout.

11
Ivan Davidov