Forum Linux.livecd Ejection du CD avant que le PC ne s'éteigne

Posté par  .
Étiquettes : aucune
0
30
nov.
2005
Salut, j'ai un nouveau problème :

Voila donc je suis en train de créer un live CD qui inclut VMware Free Player, à l'aide du programme Bootcdwrite + un script pour la détection de la carte graphique (pour plus de détails il y a déjà un post la dessus).

Tout marche parfaitement; enfin presque !

Mon problème, est que lorsque j'éteint mon PC en quittant linux qui est chargé depuis mon cd live donc, l'ordinateur s'éteint mais le CD reste dans le lecteur :( .
Je cherche donc un script ou une autre solution qui permettrai l'éjection de mon CD avant l'extinction finale de ma machine, comme sur Knoppix ou Kaella..., j'ai essayé de chercher le script ou programme qui fait ça, dans une Kaella mais je ne le trouve pas.

Si quelqu'un pouvait avoir la solution à mon problème, et nous la faire partager, cela serait plutôt pas mal.

Merci
  • # Je crois que j'ai trouvé mais c'est du chinois pour moi là

    Posté par  . Évalué à 1.

    Sous Kaella et Knoppix aussi je pense

    vi /etc/rc0.d/S90knoppix-halt

    A partir de la ligne 180, le script s'attaque à l'éjection du cd-rom, mais bon avant il y a toute une séquence de démontage tout bien triée.


    En attendant une réponse je vais tester :

    A - Copier ces fameuses lignes d'éjection du CD-ROM dans le fichier "halt" de mon live cd.

    B - Copier tout le script et remplacer celui de mon live-cd par celui-la.

    Je sais c'est un peu des methodes de goret là, mais je c'est pas trop comment faire.

    Merci.
  • # meuh

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

    ton média est busy il faut forcer l'unlock du chariot et ejecter (utilisé chez mdk) :

    fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
    if (fd > 0) {
    ioctl(fd, CDROM_LOCKDOOR, 0);
    close(fd);
    }
    fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
    if (fd > 0) {
    ioctl(fd, CDROMEJECT, 0);
    close(fd);
    }

    http://cvs.mandriva.com/cgi-bin/cvsweb.cgi/~checkout~/gi/mdk(...)
    • [^] # Merci, mais je que doit-je faire

      Posté par  . Évalué à 1.

      Est-ce que je prend ca et le colle à la fin du script Halt
      ou il faut faire autre chose ?

      Merci

      PS: je débute sous Linux :)
      • [^] # Re: Merci, mais je que doit-je faire

        Posté par  . Évalué à 1.

        Non, ce que le Monsieur t'a posté, c'est du C, donc a priori il faut le mettre dans un programme force_eject.c . Le code complet doit être qqch comme :
        #include <sys/ioctl.h>
        
        int main(void){
           fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
           if (fd > 0) {
              ioctl(fd, CDROM_LOCKDOOR, 0);
              close(fd);
           }
           fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
           if (fd > 0) {
              ioctl(fd, CDROMEJECT, 0);
              close(fd);
           }
        } 
        
        et compiler avec :
        cc force_eject.c -o force_eject
        
        tu pourras alors appeler force_eject depuis ton script...
        • [^] # Re: Merci, mais je que doit-je faire

          Posté par  . Évalué à 1.

          Oups, il manque un

          int fd = -1;

          juste après le main.
          • [^] # Oulala les gars moi je sais pas programmer

            Posté par  . Évalué à 1.

            Bon, je veux bien essayer, mais je ne sait pas programmer, alors je vous fait confiance pour le bout de code, mais très franchement je n'y crois pas trop, je ne remet pas le code en question mais plutot mes capacités a compiler un truc en C.

            Si quelqu'un a une autre solution, elle est la bienvenue !!!

            PS: Dans le pire des cas si je n'arrive pas a "créer" ce petit programme, serait-il possible de me l'envoyer par mail ?

            Merci
            • [^] # Comme prevu, je ne sais pas compiler

              Posté par  . Évalué à 1.

              Voila ce que j'ai fait en gros :

              vi /home/debuser/force_eject.cc

              j'ai collé ca dedans :

              #include <sys/ioctl.h>

              int main(void){
              int fd = -1;
              fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
              if (fd > 0) {
              ioctl(fd, CDROM_LOCKDOOR, 0);
              close(fd);
              }
              fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
              if (fd > 0) {
              ioctl(fd, CDROMEJECT, 0);
              close(fd);
              }
              }

              Je quitte et je sauve
              :wq

              Et je lance la compilation :

              cc /home/debuser/force_eject.cc -o /home/debuser/force_eject

              Et la mon PC me rote au visage :

              /home/debuser/force_eject.cc: Dans function « int main() »:
              /home/debuser/force_eject.cc:5: error: `O_RDONLY' undeclared (first use this
              function)
              /home/debuser/force_eject.cc:5: error: (Each undeclared identifier is reported
              only once for each function it appears in.)
              /home/debuser/force_eject.cc:5: error: `O_NONBLOCK' undeclared (first use this
              function)
              /home/debuser/force_eject.cc:5: error: `open' undeclared (first use this
              function)
              /home/debuser/force_eject.cc:7: error: `CDROM_LOCKDOOR' undeclared (first use
              this function)
              /home/debuser/force_eject.cc:8: error: `close' undeclared (first use this
              function)
              /home/debuser/force_eject.cc:12: error: `CDROMEJECT' undeclared (first use this
              function)

              Si vous pouviez me détailler en détails ce que je dois faire. svp

              Merci encore
              • [^] # Re: Comme prevu, je ne sais pas compiler

                Posté par  . Évalué à 1.

                C'est juste des constantes qui ne sont pas définies dans ton programme ...

                Ajoute


                #include <linux/cdrom.h>

                #include <sys/types.h>
                #include <sys/stat.h>
                #include <fcntl.h>


                Bonne chance.
                • [^] # Fantastique, sa marche !!!!

                  Posté par  . Évalué à 1.

                  Alors là, moi je dis BRAVO, merci, merci, merci 1000X

                  Oh cas ou ca intéresse quelqu'un, voici la démarche exact :

                  vi /home/force_eject.c
                  collez ca dans vi :

                  #include <sys/ioctl.h>
                  #include <linux/cdrom.h>
                  #include <sys/types.h>
                  #include <sys/stat.h>
                  #include <fcntl.h>

                  int main(void){
                  int fd = -1;
                  fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
                  if (fd > 0) {
                  ioctl(fd, CDROM_LOCKDOOR, 0);
                  close(fd);
                  }
                  fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
                  if (fd > 0) {
                  ioctl(fd, CDROMEJECT, 0);
                  close(fd);
                  }
                  }

                  Sauvez et quittez; ("echap", ":", "wq")

                  Entrez la commande suivante dans votre console :

                  cc /home/force_eject.c -o /home/force_eject

                  Allez dans le repertoire home et lancez force_eject, votre lecteur cd devrait réagir !!!

                  Encore bien merci


                  Par contre j'aimerai que ce programme s'éxecute à la fermeture de linux juste avant le shutdown final. Que le cd s'éjecte et que l'ordinateur me demande d'appuyer sur une touche avant de s'éteindre.
                  Je penssais rajouter quelques lignes dans le fichier "halt"
                  vers la fin (en ayant bien sure copier le fichier force_eject dans le repertoire /usr/bin), du genre :

                  /usr/bin/force_eject
                  echo "APPUYER SUR ENTREE POUR CONTINUER"
                  read off

                  Bah, en fait je vais tester et je verrais bien !

                  Sinon apres sa serait bien que le lecteur se referme une fois que j'ai appuyer sur entrée, faudrait faire un autre petit prog comme ca, je suppose qu'il n'y a pas grand chose à modifier dedans, si vous pouviez me donner le bout de code à taper sa serait fort sympathique de votre part. :)

                  Encore merci à vous !!!
                  • [^] # Et je continue :) (une fois que j'aurais fini mon cd je ferai un tuto)

                    Posté par  . Évalué à 1.

                    Alors, voila j'ai ajouté mes 3 lignes, et pour l'instant sa marche

                    vi /etc/rc0.d/S90halt
                    après la ligne :
                    PATH=/sbin:/bin:/usr/sbin:/usr/bin

                    j'insère
                    /usr/bin/force_eject
                    echo "APPUYER SUR ENTREE POUR CONTINUER"
                    read off

                    je sauve et je quitte :)

                    mais je suis sur le disque dur. Je vais recréer mon cd live avec ces nouvelles modifications et on va bien voire ce que sa dit.

                    PS: j'ai essayer de faire le bourrins en créant un "force_close" pour refermmer le lecteur, evidemment, sa ne marche pas.

                    Sur les 2 lignes fd = eject, j'ai remplacé par close

                    fd = close("/dev/cdrom", O_RDONLY|O_NONBLOCK, 0);
                    • [^] # Je pense avoir trouver !!!

                      Posté par  . Évalué à 1.

                      Tout simplement, j'ajoute

                      /usr/bin/force_eject
                      echo "APPUYER SUR ENTREE POUR CONTINUER"
                      read off

                      mount /dev/cdrom

                      Bon, je refait encore une nouvelle iso avec les nouvelles modification pour tester.
                      • [^] # Arf sa ne marche pas !!! :(

                        Posté par  . Évalué à 1.

                        Lorsque je suis sur le disque dur sa fonctionne, mais lorsque je suis sur le live cd sa ne marche pas, je pense avoir compris l'utilité de faire un programme et non un script.

                        Le programme parle directement aux périphériques de la machine, il se fiche que le système d'exploitation voit le lecteur cd comme un disque dur, il éjecte le cd-rom (enfin je pense).

                        Alors que le script lui passe par l'os, et du coup celui-ci me dit qu'il ne s'agit pas de /dev/cdrom mais de /ram1/dev/hdc, ce qui risque certainement de changer d'une configuration à l'autre.

                        Il me faut absolument un bout de programme pour refermmer ce #*@|#& de lecteur cd !!!

                        Sinon tout le reste fonctionne à merveille ! ;)
                        • [^] # Snifff :( sa ne marche pas en live cd

                          Posté par  . Évalué à 0.

                          Donc le cd s'éjecte mais il ne se referme pas.

                          Alors, j'ai eu une nouvelle idée !!!
                          j'ai re-modifié le script /etc/rc0.d/S90halt
                          j'ai enlevé la commande qui était censé refermer le lecteur
                          enfin voila ce que sa donne :


                          /usr/bin/force_eject
                          clear
                          echo -e '\E[31m'"REFERMEZ LE LECTEUR CD"
                          echo -e '\E[32m'"APPUYEZ SUR ENTREE POUR CONTINUER"
                          read off
                          ...
                          ...
                          ..
                          .
                          (suite du script d'origine)

                          Alors là, pour peu que l'on ait un doigt pour appuyer sur le boutton du lecteur cd et un oeil pour lire à l'écran, sa marche du tonnerre !!!
                          Y'a des fois où sa sert à rien de se casser la tête; bon ok sa fait moins pro mais sa marche ! :)

Suivre le flux des commentaires

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