web-dev-qa-db-fra.com

Script Upstart: Détecter la touche Maj vers le bas au démarrage

Je veux créer un potentiel de démarrage qui permet à différentes configurations de démarrage/niveau d'exécution de se charger en fonction de touches spécifiques au démarrage (ou de combos). Comment détecter un événement de fermeture de clé avec un script de démarrage?

Je suis le 10.04 si cela aide.

Des méthodes alternatives pour obtenir le même résultat sont acceptables, c'est-à-dire, comment puis-je utiliser grub pour ce faire?

Pour aider à fournir plus de clarté, je crée une instruction étape par étape basée sur les deux réponses données par Tuminoid et Lumbric. (S'il vous plaît aidez-moi à améliorer cela, mon interprétation de la réponse de Tuminoid ne fonctionne pas.)

Remarque: Tout le monde doit avoir une raison pour le faire. Pour donner un sens aux deux solutions étape par étape suivantes, je décrirai mon objectif de vouloir que les scripts parvenus soient décidés au démarrage.

Je crée un DVD Live pour surfer sur Internet appelé Surfer. Pour des raisons de sécurité, je souhaite désactiver le compte administrateur et laisser un compte non privilégié pour surfer sur le Web. Je veux également me donner, ainsi qu'aux utilisateurs, la possibilité de remasteriser Surfer afin qu'ils puissent ajouter plus d'applications en ligne et personnaliser leur compte Surfer, puis graver leur propre iso Surfer personnalisé en direct. J'aurai donc besoin de deux profils de démarrage: Surfer et Remaster. L'un pour la navigation sécurisée en ligne, l'autre pour la remasterisation et le développement.

La solution de Lumbric

Créer un fichier grub personnalisé

1. Pour ajouter des entrées personnalisées à grub, ouvrez ce fichier avec gedit pour modification:

gksudo gedit /etc/grub.d/40_custom

Vous aurez le bon fichier si vous y voyez ce texte:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

2. Dans un autre onglet gedit, ouvrez:

/boot/grub/grub.cfg

. Dans grub.cfg, recherchez les sections qui commencent par:

entrée de menu

Choisissez l'entrée par défaut que vous utilisez pour le démarrage. Si vous ne connaissez pas l'entrée par défaut en consultant ce fichier, redémarrez et notez celui que vous avez choisi au démarrage. N'enregistrez aucune modification si vous devez redémarrer pour trouver votre entrée par défaut. Lorsque vous êtes certain de votre entrée par défaut, notez qu'il s'agit de l'entrée à utiliser pour vos profils personnalisés.

Chaque entrée de menu aura un ensemble de crochets correspondant:

menuentry ...text left out... {
  ...text left out...

}

qui encapsulent quelques lignes de texte. Copiez la section d'entrée par défaut. Copiez depuis l'entrée de menu Word vers le crochet de fermeture. J'aurai besoin de deux entrées, donc je collerai mon entrée par défaut deux fois.

Il devrait ressembler à ce qui suit pour deux entrées de profil de démarrage personnalisé. (Gardez à l'esprit que j'ai retiré du texte pour faciliter la lecture):

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

menuentry ...text left out... {
    ...text left out...

}

menuentry ...text left out... {
    ...text left out...

}

4. Trouvez votre ligne de démarrage en appuyant sur ctrl + f. Tapez dans le champ de recherche:

linux/boot

Chaque ligne de démarrage doit être mise en évidence.

5. Coupez et collez ce texte à la fin de la ligne de démarrage en surbrillance, mais modifiez le numéro de chaque entrée.

profil de démarrage = 1

Après le collage, l'entrée de menu devrait ressembler à ceci:

menuentry ...text left out... {
    ...text left out...
    linux /boot/vmlinuz-2.6.35-22-generic root=UUID=66cdrfwec91-0070-32f-b666-c9f2232j23232j ro quiet splash boot-profile=1
}

menuentry ...text left out... {
    ...text left out...
    linux /boot/vmlinuz-2.6.35-22-generic root=UUID=66cdrfwec91-0070-32f-b666-c9f2232j23232j ro quiet splash boot-profile=2
}

6. Maintenant, nous allons modifier la ligne que nous voyons au démarrage. Pour l'entrée de menu identifiée ci-dessus, modifiez le texte qui se trouve entre l'entrée de menu Word et la première parenthèse. Remplacez par le texte Surfeur :

menuentry "Surfer" {
    ...text left out...
    linux /boot/vmlinuz-2.6.35-22-generic root=UUID=66cdrfwec91-0070-32f-b666-c9f2232j23232j ro quiet splash boot-profile=1
}

Faites de même pour l'entrée Remaster:

menuentry "Remaster" {
    ...text left out...
    linux /boot/vmlinuz-2.6.35-22-generic root=UUID=66cdrfwec91-0070-32f-b666-c9f2232j23232j ro quiet splash boot-profile=2
}

7. Enregistrez le fichier 40_custom.

8. Maintenant, mettez à jour grub avec cette commande:

Sudo update-grub

Remarque: Si vous effectuez une mise à niveau ou une installation de programmes qui modifient votre noyau, soyez conscient de l'argument de lumbric indiqué dans son lien. Comment savoir si notre noyau va être mis à jour? Aidez-moi à clarifier comment nous pouvons empêcher la mise à niveau de notre noyau sans le savoir.

9. Redémarrer. Lorsque dans le menu de démarrage, recherchez vos nouvelles entrées. Si vous les voyez, les choses vont bien jusqu'à présent. Choisissez l'une de vos entrées personnalisées et appuyez sur Entrée.

10. Une fois connecté, ouvrez Terminal. Entrez cette commande.

chat/proc/cmdline

Grub écrit la ligne de démarrage dans ce fichier. La ligne de démarrage est l'endroit où vous avez ajouté boot-profile = 1 à la fin. Donc, si vous avez choisi surfeur, il devrait lire boot-profile = 1 à la fin ou boot-profile = 2 si vous avez choisi Remaster. Sinon, relisez à partir de la première étape et corrigez les erreurs logiques.

11. Maintenant, le script doit être écrit qui gérera l'entrée de démarrage choisie dans le menu grub. Je choisis d'utiliser un script upstart, parce que je sais comment le faire. L'upstart commencera dès que possible , vérifiez le contenu de/proc/cmdline et utilisez-le pour déterminer notre choix dans le menu de démarrage. Voici le script de démarrage parvenu:

/etc/bootChoice.conf

12. Après le texte suivant:

task
start on startup or bootChoice

script

profile=$(cat /proc/cmdline |sed 's/.*boot-profile=\([0-9]\).*/\1/g')

case $profile in
   1)
      # Run script for Surfer Profile
      initctl emit surferboot
      ;;
   2)
      # Run script for Remaster Profile
      initctl emit remasterboot
      ;;

   *)
      echo Error
      echo "Error" > /error
      ;;
esac

end script

13. Maintenant, un signal sera émis en fonction de notre choix. Pour gérer chaque signal, deux fichiers doivent être créés. Un appelé: surfer.conf et un autre appelé remaster.conf. Placez-les dans/etc/init /. Leur contenu sera similaire à ceci:

# surfer user boot

task
start on surferboot

script
    echo "surfer test-data" > /home/surfer/surfer
end script

Nous pouvons voir que lorsque le signal de surferboot est émis, que le script ci-dessus est démarré déterminé par cette ligne: start on surferboot Placez tout le code de script de démarrage personnalisé entre script et end script. La même chose sera faite pour Remaster.

J'ai essayé ça, ça marche. Merci Lumbric.

Solution de tuminoïde

Tout d'abord, nous devons faire savoir à grub que nous voulons appeler un script. Nous placerons le chemin du script dans /etc/default/grub.

1. Ouvrez le fichier: /etc/default/grub.

gksudo gedit/etc/default/grub

2. Ajoutez cette ligne à la fin du fichier:

init =/sbin/preinit

. Enregistrez et quittez. Ensuite, exécutez cette commande:

update-grub

Nous allons maintenant créer le fichier dont nous avons informé grub.

4. Créez le fichier avec gedit:

gksudo gedit/sbin/preinit

5. Collez le texte suivant à l'intérieur:

#!/bin/sh 
EVENT="startup" 
while [ /bin/true ]; do   
  echo "Select boot:"   
  echo " 1) Surfer"   
  echo " 2) Remaster"   
  echo ""   
  read selection   
  case "$selection" in 
1)   
  EVENT="surfer"   
  ;; 
2)   
  EVENT="remaster"   
  ;;
*)   
  ;;   
  esac 
done

exec /sbin/init --startup-event=$EVENT

6. Rendez le script exécutable:

chmod + x/sbin/preinit

WIP REMARQUE: j'ai essayé jusqu'à présent et cela ne fonctionne pas. Veuillez aider à améliorer cette interprétation de la réponse en signalant où je me trompe.

Dernière section: Cette section est inachevée. En attente de clarté sur les premières étapes pour terminer.

Les événements ci-dessus sont des signaux arrivants. Si vous n'avez pas utilisé de signaux parvenus, ils appellent un script dans le répertoire:/etc/init. Donc, je vais créer deux fichiers dans/etc/init appelés:

/etc/init/surfer.conf

/etc/init/remaster.conf

Dans ces fichiers, j'utiliserai des scripts bash pour configurer chaque démarrage.

Je vais créer à upstart /etc/gdm/custom.conf pour forcer une connexion automatique si Surfer est choisi. J'ouvrirai également/etc/shadow et désactiverai le mot de passe des remasters.

Alternativement, je vais créer /etc/gdm/custom.conf pour une connexion automatique forcée à l'utilisateur remasteriser pour remasteriser et développer.

7
bambuntu

Attraper un événement Shift key down pendant le démarrage semble être une tâche intéressante, mais je n'ai aucune idée de comment y parvenir. Mais j'ai décrit dans n récent Q&A comment utiliser le menu GRUB afin d'exécuter différents scripts de démarrage après la connexion).

Le script de l'étape 3 est censé s'exécuter après la connexion, mais il peut également être placé dans /etc/rcXY.

1
lumbric

Vous ne pouvez pas faire cela pour un script Upstart. Ils sont par nature non interactifs.

Ce que vous pourriez faire, c'est créer une entrée de menu Grub qui pointe vers un script Shell en tant qu'init, vous demander le type de démarrage que vous souhaitez (ou interagir avec vous comme vous le souhaitez), puis à la fin exec /sbin/init --startup-event=<type of boot>. Cela fait que l'événement de démarrage d'Upstart soit autre chose que startup et vous pouvez construire votre démarrage à votre guise.

Par exemple, mettez quelque chose comme ça dans /sbin/preinit:

#!/bin/sh 
EVENT="startup" 
while [ /bin/true ]; do   
  echo "Select boot:"   
  echo " 1) Normal"   
  echo " 2) Minimal"  
  echo " 3) Foobar"  
  echo ""   
  read selection   
  case "$selection" in 
2)   
  EVENT="minimal-startup"   
  ;; 
3)   
  EVENT="foobar-startup"   
  ;;
*)   
  ;;   
  esac 
done

exec /sbin/init --startup-event=$EVENT

En utilisant cette solution, vous n'avez pas besoin de copier/etc/init, mais vous pouvez avoir un bel ensemble statique de tâches, qui s'exécutent simplement en fonction d'un signal de démarrage différent.

1
Tuminoid