Forum Linux.embarqué créer une image avec 2 options d’amorçage

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
9
nov.
2016

Bonjour,

voila j'ai créer un fichier image que j'ai partitionné (1 partition). Puis j'ai installé un noyau (dans boot/), un fichier init tres simple qui dit "hello world" (dans sbin/). J'ai ensuite configuré mon fichier lilo.conf (dans etc/) et lancer la commance lilo. Quand j'émule mon image (qemu), j'ai bien au démarrage deux options de noyau. Mais quand j'en choisie un, je vois bien le noyau se lancer, puis s'arreter d'un coup, sans lancer init et je ne comprend pas pourquoi :(

je vous donne un extrait de mon fichier lilo.conf :

image=boot/noyau
label="noyau-application"
initrd=sbin/init

image=boot/noyau
label="noyau-maintenance"
initrd=sbin/init

je veux lancer le meme noyau mais un noyau va lancer un jeu, et l'autre va lancer une console(pour la maintenance). Ici je veux pour l'instant lancer uniquement mon fichier init peu importe le noyau choisi.

je ne comprend pas trop la commande initrd, je ne sais pas pour ce que je veux faire si elle ne peut pas etre remplacé.

je vous remercie d'avance pour vos conseils et votre aide.

  • # initrd = une abrorescence complete avec plein de chose dedans

    Posté par  . Évalué à 2.

    l'initrd c'est un fichier compressé contenant plein de chose dedans, comme les pilotes et programmes pour gerer le LVM par exemple.

    dans ton cas tu veux juste l'option (en grub)

    append="init=/sbin/init"

    des exemples dans la documentation de lilo

  • # reponse

    Posté par  . Évalué à 1.

    merci de m'avoir répondu.

    j'ai essayé la ligne
    append="init=/sbin/init"

    mais aussi
    append="init=sbin/init"

    et
    append="sbin/init"

    mais non mon noyau ne lance rien :(

    c'est tres bizarre car à la fin de son exécution, le noyau est sensé lancer automatiquement le programme init qui se trouve dans /sbin. Or quand je met juste dans mon fichier lilo.conf :

    image=boot/noyau
    label="noyau-application"
    image=boot/noyau
    label="noyau-maintenance"
    ca devrait me lancer automatiquement le programme init, peu importe quel label je choisis à l’amorçage. Or non, quelqu'un à une idée?

    • [^] # Re: reponse

      Posté par  . Évalué à 2.

      Et init=/sbin/init dans ta conf LILO ?

      Une raison d’utiliser LILO plutôt que GRUB ?

      • [^] # Re: reponse

        Posté par  . Évalué à 1.

        j'ai essayé, lilo ne reconnait pas le paramètre init.

        sur ce que j'ai vu sur internet, et qu'il faut passer le paramètre append dans le fichier lilo.conf, ce qui permet de transmettre des parametres au noyau et donc d'indiquer l'emplacement de mon fichier init. Mais ca ne marche toujours pas…

        je continue de chercher…

        J'ai pris lilo car mon prof me l'a imposé, c'est plus simple à mettre en oeuvre apparemment ;)

        • [^] # Re: reponse

          Posté par  (site web personnel) . Évalué à 2.

          cat /proc/cmdline

          pour voir les options passées au noyau

          Système - Réseau - Sécurité Open Source - Ouvert à de nouvelles opportunités

          • [^] # Re: reponse

            Posté par  . Évalué à 1.

            alors j'ai crée une image de base, donc dans mon image je n'ai qu'un repertoire boot, un etc et sbin, je ne peux donc pas faire ta commande :(

    • [^] # Re: reponse

      Posté par  . Évalué à 2.

      et si tu definis le append="init=/bin/bash" ou append="init=/bin/sh"
      tu obtiens bien un shell ?

      c'est quoi le partitionnement et le type de partition de ton OS ?
      si ca se trouve le noyau se lance, mais n'arrive pas à monter le filesystem pour ensuite trouve /sbin/init ou /bin/sh, etc

      • [^] # Re: reponse

        Posté par  . Évalué à 1.

        append="init=/bin/bash" ou append="init=/bin/sh" me retourne bien un shell, et comme tu l'avais pensé, le shell me retourne :
        "Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(8,0)"

        le noyau est incapable de monter le systeme de ficher racine ce qui explique pourquoi il ne trouve pas init, mais je ne comprend pas pourquoi.

        alors j'ai choisi une partition en ext2 ce qui devrais marcher normalement. Et mon image n'a qu'une seul partition.

        • [^] # Re: reponse

          Posté par  . Évalué à 3.

          le noyau est incapable de monter le systeme de ficher racine

          ton noyau ne va pas le trouver tout seul par magie,
          il doit falloir lui preciser ou il se trouve

          ca doit etre l'option lilo root=/dev/sdXY
          ou root=UUID=lesuperuuiddelapartitionquicontientlaracinedetonsysteme
          à ajouter dans le APPEND

          donc
          append="root=/dev/sdaXY init=/bin/bash"

          • [^] # Re: reponse

            Posté par  . Évalué à 1.

            j'avais déja placé cette commande, je te montre mon fichier lilo.conf ca sera peut etre plus simple:
            ```
            boot=/dev/loop0
            disk=/dev/loop0
            bios=0x80
            sectors=63
            heads=255
            cylinders=1024

            root=/dev/sda
            install=menu
            prompt
            timeout=100
            map=boot/map
            read-only

            image=boot/noyau
            label="jeux"
            append="init=/sbin/init"

            image=boot/noyau
            label="maintenance"
            append="init=/sbin/init"
            ```
            j'ai quand meme mi :
            append="root=/dev/sda init=/sbin/init" ou append="root=/dev/sda init=/bin/bash"

            mais ca me met toujours la ligne kernel panic impossible de monter le systeme de fichier racine

            • [^] # Re: reponse

              Posté par  . Évalué à 3.

              mais ca me met toujours la ligne kernel panic impossible de monter le systeme de fichier racine

              ton /boot ou ton / est avec quel systeme de fichier ?
              ton noyau a-t-il le support pour ce systeme de fichier compilé EN DUR

              • [^] # Re: reponse

                Posté par  (site web personnel) . Évalué à 2. Dernière modification le 11 novembre 2016 à 13:25.

                ou initrd root=/dev/sda1

                plutot , non ?

                Système - Réseau - Sécurité Open Source - Ouvert à de nouvelles opportunités

              • [^] # Re: reponse

                Posté par  . Évalué à 1.

                je t'explique :

                j'ai déja créer un systeme embarqué avec les commandes :

                pour créer une image de 8Mo:
                dd if=/dev/zero of=image.img bs=1M count=8
                ensuite je créer un systeme de fichier:
                /sbin/mkfs.ext2 image.img
                je monte le fichier image avec la commande mount, puis je place un répertoire boot ou je met mon noyau, je crée un repertoire sbin ou je place mon fichier init, et un repertoire etc avec mon fichier lilo.conf
                j'exécute la commande lilo, j'émule avec qemu et ca marche parfaitement, je recois bien "coucou ca va" de mon init. Donc mon noyau a bien créer un systeme de fichier et ensuite lancer mon init.

                mon probleme se localise quand je veux partionner l'image. Des que je partitionne avec /sbin/fdisk image.img , je crée une seul partition et ca ne marche plus, bien que je refais la meme démarche :
                je créer un systeme de fichier sur ma partition :
                /sbin/mkfs.ext2 /dev/mapper/loop0p1 ou /dev/mapper/loop0p1 designe ma partition 1.

                ensuite je monte ma partition 1, installe le noyau, le fichier init…
                et quand j'émule, ca me met kernel panic impossible de créer le systeme de fichier racine, alors que la demarche est normalement pareil.
                as tu une idée du probleme ?

                • [^] # Re: reponse

                  Posté par  (site web personnel) . Évalué à 2. Dernière modification le 11 novembre 2016 à 13:46.

                  perso je passerais par le loopback pour le partitionnement

                  ps: perif dans /dev ou udev ?

                  Système - Réseau - Sécurité Open Source - Ouvert à de nouvelles opportunités

                • [^] # Re: reponse

                  Posté par  . Évalué à 2.

                  pour créer une image de 8Mo:
                  dd if=/dev/zero of=image.img bs=1M count=8

                  ensuite je créer un systeme de fichier:
                  /sbin/mkfs.ext2 image.img

                  et si tu faisais une partition plutot que de formater l'image.

                  fdisk image.img

                  et ensuite seulement, faire le mkfs sur /dev/loop0p1
                  ce qui devrait correspondre à /dev/sda1 dans la machine virtuelle qemu

                  • [^] # Re: reponse

                    Posté par  . Évalué à 1.

                    ca marche !!
                    je ne comprend pas trop comment tu as trouvé la solution, en faite le /dev/loop0p1 désigne bien un périphérique virtuel, et ce périphérique virtuel est lié à la partition sda1?

                    • [^] # Re: reponse

                      Posté par  . Évalué à 2.

                      je ne comprend pas trop comment tu as trouvé la solution

                      quand tu crees l'image, tu crees le disque dur qui servira dans la VM
                      tu ne peux pas (enfin ce n'est pas recommandé) installer l'OS sur le disque,
                      il faut l'installer sur une partition.

                      donc il faut partitionner le disque virtuel
                      => il faut partitionner le fichier image
                      et seulement ensuite formater la partition.

                      • [^] # Re: reponse

                        Posté par  . Évalué à 1.

                        ok, mais pourquoi mettre root=/dev/sda1 ? car la partition de mon fichier image.img est sur le périphérique loop0p1 ?

                        • [^] # Re: reponse

                          Posté par  . Évalué à 4.

                          tout simplement parce que

                          image.img = le fichier qui contient ton disque dur virtuel

                          • quand tu veux tripoter dedans tu montes cette image en loop et tu y acces depuis ton serveur, via loop
                          • quand tu le lances en machine virtuelle, tu n'utilises pas le loop, tu utilises le fichier img, et là ta machine virtuelle elle voit un disque dur, c'est le premier de la liste donc /dev/sda, et elle trouve une partition, donc /dev/sda1
                          • [^] # Re: reponse

                            Posté par  . Évalué à 1.

                            ok j'ai compris ;)

                            en tout cas merci beaucoup NeoX pour ton aide et ton temps, c'est vraiment sympa de partager ton savoir !

                            • [^] # Re: reponse

                              Posté par  . Évalué à 2.

                              c'est vraiment sympa de partager ton savoir !

                              j'ai appris des anciens,
                              je suis maintenant parmi les anciens
                              et je transmet mon savoir

                              et je ne fais donc que boucler la boucle ;)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.