Upstart-Skript: Erkennen Sie beim Booten die Umschalttaste nach unten

7

Ich möchte ein Boot-Up-Potenzial erstellen, das das Laden verschiedener Upstart- / Runlevel-Konfigurationen basierend auf bestimmten Key-Downs beim Booten (oder Combos) ermöglicht. Wie erkenne ich ein Key-Down-Ereignis mit einem Upstart-Skript?

Ich bin am 10.04, wenn das hilft.

Alternative Methoden, um das gleiche Ergebnis zu erzielen, sind akzeptabel, dh wie kann ich grub verwenden, um dies zu tun?

Um mehr Klarheit zu schaffen, erstelle ich eine schrittweise Anleitung, die auf beiden Antworten von Tuminoid und Lumbric basiert. (Bitte helfen Sie mir, dies zu verbessern. Meine Interpretation der Antwort von Tuminoid funktioniert nicht.)

Hinweis: Jeder muss einen Grund dafür haben. Um den folgenden beiden Schritt-für-Schritt-Lösungen einen Sinn zu geben, beschreibe ich meinen Zweck, wenn beim Start entschieden werden soll, ob Upstart-Skripte erstellt werden sollen.

Ich erstelle eine Live-DVD zum Surfen im Internet namens Surfer. Aus Sicherheitsgründen möchte ich das Administratorkonto deaktivieren und ein nicht privilegiertes Konto zum Surfen im Internet hinterlassen. Ich möchte mir und den Benutzern auch die Möglichkeit geben, Surfer zu remastern, damit sie weitere Online-Apps hinzufügen und ihr Surfer-Konto anpassen und dann ihre eigene Surfer-Live-ISO brennen können. Ich brauche also zwei Boot-Profile: Surfer und Remaster. Eine für sicheres Online-Surfen, die andere für Remastering und Entwicklung.

Lumbrics Lösung

Erstellen Sie eine benutzerdefinierte Grub-Datei

1. Um benutzerdefinierte Einträge zu grub hinzuzufügen, öffnen Sie diese Datei mit gedit zur Bearbeitung:

gksudo gedit /etc/grub.d/40_custom

Sie haben die richtige Datei, wenn Sie diesen Text darin sehen:

#!/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. Öffnen Sie auf einer anderen Registerkarte gedit:

/boot/grub/grub.cfg

3. Suchen Sie in grub.cfg nach Abschnitten, die beginnen mit:

Menüeintrag

Wählen Sie den Standardeintrag, den Sie zum Booten verwenden. Wenn Sie den Standardeintrag anhand dieser Datei nicht kennen, starten Sie ihn neu und notieren Sie sich den Eintrag, den Sie beim Booten ausgewählt haben. Speichern Sie keine Änderungen, wenn Sie neu starten müssen, um Ihren Standardeintrag zu finden. Wenn Sie von Ihrem Standardeintrag überzeugt sind, beachten Sie, dass dies der Eintrag ist, der für Ihre benutzerdefinierten Profile verwendet werden soll.

Jeder Menüeintragsabschnitt enthält entsprechende Klammern:

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

}

das kapselt ein paar Textzeilen. Kopieren Sie den Standardeintragsabschnitt. Kopieren Sie vom Wort Menüeintrag in die schließende Klammer. Ich benötige zwei Einträge, daher füge ich meinen Standardeintrag zweimal ein.

Für zwei benutzerdefinierte Startprofileinträge sollte es ungefähr so ​​aussehen. (Denken Sie daran, dass ich Text herausgenommen habe, um das Lesen zu erleichtern.):

#!/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. Suchen Sie Ihre Startzeile, indem Sie Strg + F drücken. Geben Sie das Suchfeld ein:

Linux / Boot

Jede Startzeile sollte hervorgehoben werden.

5. Schneiden Sie diesen Text am Ende der markierten Startzeile aus und fügen Sie ihn ein. Ändern Sie jedoch die Nummer für jeden Eintrag.

Boot-Profil = 1

Nach dem Einfügen sollte der Menüeintrag folgendermaßen aussehen:

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. Nun bearbeiten wir die Zeile, die wir beim Booten sehen. Bearbeiten Sie für den oben angegebenen Menüeintrag den Text zwischen dem Wort Menüeintrag und der ersten Klammer. Ersetzen Sie durch den Text Surfer :

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
}

Machen Sie dasselbe für den Remaster-Eintrag:

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. Speichern Sie die Datei 40_custom.

8. Aktualisieren Sie nun grub mit diesem Befehl:

sudo update-grub

Hinweis: Wenn Sie Programme aktualisieren oder installieren, die Ihren Kernel ändern, beachten Sie den in seinem Link angegebenen Punkt von lumbric. Wie können wir wissen, ob unser Kernel aktualisiert wird? Helfen Sie mir zu klären, wie wir verhindern können, dass unser Kernel aktualisiert wird, ohne es zu wissen.

9. Starten Sie neu. Suchen Sie im Startmenü nach Ihren neuen Einträgen. Wenn Sie sie sehen, laufen die Dinge bisher großartig. Wählen Sie einen Ihrer benutzerdefinierten Einträge und drücken Sie die Eingabetaste.

10. Wenn Sie angemeldet sind, öffnen Sie das Terminal. Geben Sie diesen Befehl ein.

cat / proc / cmdline

Grub schreibt die Bootzeile in diese Datei. In der Boot-Zeile haben Sie am Ende Boot-Profil = 1 hinzugefügt. Wenn Sie also Surfer gewählt haben, sollte am Ende boot-profile = 1 oder boot-profile = 2 lauten, wenn Sie Remaster gewählt haben. Wenn nicht, lesen Sie den ersten Schritt erneut und korrigieren Sie alle logischen Fehler.

11. Nun muss das Skript geschrieben werden, das den aus dem Grub-Menü ausgewählten Starteintrag verarbeitet. Ich entscheide mich für ein Startskript, weil ich weiß, wie das geht. Der Start startet so schnell wie möglich. Überprüfen Sie den Inhalt von / proc / cmdline und bestimmen Sie anhand dessen den Start im Startmenü. Hier ist das Startskript für den Start:

/etc/bootChoice.conf

12. Nach dem folgenden Text in:

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. Nun wird basierend auf unserer Wahl ein Signal ausgegeben. Um jedes Signal verarbeiten zu können, müssen zwei Dateien erstellt werden. Einer heißt: surfer.conf und ein anderer heißt remaster.conf. Platziere sie in / etc / init /. Ihr Inhalt wird ähnlich sein:

# surfer user boot

task
start on surferboot

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

Wir können sehen, dass, wenn das Surferboot-Signal ausgegeben wird, das obige Skript gestartet wird, bestimmt durch diese Zeile: start on surferbootPlatzieren Sie den gesamten benutzerdefinierten Boot-Skript-Code zwischen scriptund end script. Das Gleiche wird für Remaster gemacht.

Ich habe es versucht, es funktioniert. Danke Lumbric.

Tuminoids Lösung

Zuerst müssen wir grub wissen lassen, dass wir ein Skript aufrufen möchten. Wir werden den Pfad des Skripts in / etc / default / grub platzieren.

1. Öffnen Sie die Datei: / etc / default / grub.

gksudo gedit / etc / default / grub

2. Fügen Sie diese Zeile am Ende der Datei hinzu:

init = / sbin / preinit

3. Speichern und beenden. Führen Sie dann diesen Befehl aus:

Update-Grub

Jetzt erstellen wir die Datei, auf die wir grub aufmerksam gemacht haben.

4. Erstellen Sie die Datei mit gedit:

gksudo gedit / sbin / preinit

5. Fügen Sie den folgenden Text ein:

#!/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. Machen Sie das Skript ausführbar:

chmod + x / sbin / preinit

WIP HINWEIS: Ich habe dies bis zu diesem Punkt versucht und es funktioniert nicht. Bitte helfen Sie, diese Interpretation der Antwort zu verbessern, indem Sie darauf hinweisen, wo ich falsch liege.

Letzter Abschnitt: Dieser Abschnitt ist noch nicht fertig. Warten auf Klarheit bei den ersten Schritten zum Abschluss.

Die obigen Ereignisse sind Startsignale. Wenn Sie keine Startsignale verwendet haben, rufen diese ein Skript im Verzeichnis / etc / init auf. Also werde ich zwei Dateien in / etc / init erstellen, die aufgerufen werden:

/etc/init/surfer.conf

/etc/init/remaster.conf

In diesen Dateien werde ich Bash-Skripte verwenden, um jeden Start zu konfigurieren.

Ich werde unter upstart /etc/gdm/custom.conf erstellen, um eine automatische Anmeldung zu erzwingen, wenn Surfer ausgewählt ist. Ich werde auch / etc / shadow öffnen und das Remasters-Passwort deaktivieren.

Alternativ erstelle ich /etc/gdm/custom.conf für eine erzwungene automatische Anmeldung beim Benutzer-Remaster zum Remastering und zur Entwicklung.

Bambuntu
quelle
Wie @Tuminoid betonte, /etc/initklingt das Kopieren von Dingen schmutzig. Vielleicht könnten Sie etwas detaillierter beschreiben, was in den Konfigurationen anders sein sollte?
Lumbric
Wenn Sie das System nur anders konfigurieren möchten (und Ihre Abhängigkeiten kennen, z. B. Bereitstellungen), können Sie dies alles im /sbin/preinitSkript tun . Denken Sie daran, wo Sie sich befinden - vor dem "echten" Benutzerbereich, sodass Mounts nur vorhanden sind, wenn Sie sie mounten usw. Wenn Sie sich Ihre lange Antwort ansehen, möchten Sie im Grunde nur gdm custom conf ändern, sodass ich keinen Grund sehe, warum Sie Ich muss mich überhaupt mit / etc / init anlegen: mache einfach alles im preinitSkript und am Ende führe einfach init aus exec /sbin/initund es bootet normal.
Tuminoid
Das Problem, das ich bei @Tuminoid habe, ist, dass das Skript mich beim Start nicht dazu auffordert, eine Auswahl zu treffen. Ich habe sechs Schritte geklärt. Habe ich irgendwo einen Schritt verpasst?
Bambuntu

Antworten:

1

Es scheint eine interessante Aufgabe zu sein, ein Shift-Key-Down-Ereignis während des Startvorgangs zu erfassen, aber ich habe keine Ahnung, wie dies erreicht werden soll. In den letzten Fragen und Antworten habe ich jedoch beschrieben, wie Sie das GRUB-Menü verwenden, um nach der Anmeldung verschiedene Startskripte auszuführen.

Das Skript aus Schritt 3 soll nach der Anmeldung ausgeführt werden, kann aber auch in platziert werden /etc/rcXY.

lumbrisch
quelle
Hey, ich versuche deine Antwort besser zu verstehen. Könnten Sie mir bei Schritt 11 in meiner bearbeiteten Frage helfen?
Bambuntu
@bambuntu Nach meinem Vorschlag ist das Skript völlig unabhängig vom Grub-Menü. Es liest nur die Auswahl aus /proc/cmdline. Es hängt davon ab, was Sie tun möchten und wann es ausgeführt werden soll, wo Sie es platzieren sollten. Dies kann in /etc/rc.localeinem Skript auf Ausführungsebene oder sogar nach der Benutzeranmeldung erfolgen, um mehrere Anwendungen zu starten (wie in den verknüpften Fragen und Antworten). Ich kenne nicht genug Details zu den Upstart-Konfigurationsdateien in / etc / init, um Ihnen zu sagen, wie dies funktionieren könnte. Aber Tuminoids Lösung könnte in Ihrem Fall ein besserer Ansatz sein, da bin ich mir nicht sicher.
Lumbric
Also platziere ich das Skript einfach in / etc und es läuft einwandfrei, ohne dass weitere Änderungen erforderlich sind?
Bambuntu
@bambuntu Sorry, ich habe versehentlich ENTER gedrückt. Übrigens: Ihre schrittweise Erklärung ist großartig, aber wahrscheinlich ist es besser, unsere Antworten anstelle Ihrer Frage zu bearbeiten.
Lumbric
Es sollte so schnell wie möglich ausgeführt werden, da zwischen zwei Benutzern entschieden wird, bei denen die automatische Anmeldung erfolgen soll. Ich werde eine Datei in /etc/gdm/custom.conf ablegen, die sich automatisch bei diesem Benutzer anmeldet.
Bambuntu
1

Sie können dies nicht für ein Upstart-Skript tun. Sie sind von Natur aus nicht interaktiv.

Sie können einen Grub-Menüeintrag erstellen, der auf ein Shell-Skript als Init verweist, Sie zur Eingabe eines gewünschten Starttyps auffordern (oder mit Ihnen interagieren, wie Sie möchten) und am Ende tun exec /sbin/init --startup-event=<type of boot>. Dies führt dazu, dass das Startereignis von Upstart etwas anderes ist als startupund Sie können Ihr Boot-up nach Belieben erstellen.

Geben Sie zum Beispiel Folgendes ein /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

Mit dieser Lösung müssen Sie / etc / init nicht kopieren, sondern können über nette statische Jobs verfügen, die nur basierend auf einem anderen Startsignal ausgeführt werden.

Tuminoid
quelle
Ich bin etwas unklar. Möchten Sie das Initctl-Emit-Signal für die Auswahl einer Reihe von Startskripten verwenden ? Dass ich das obige Skript verwenden sollte, um eine Reihe von Signalen zu senden, basierend auf der Wahl des Benutzers hier? Wenn ja, so gut. Aber ich bin mit der Bedeutung dieses obigen Skripts nicht vertraut. Wird dies mein Madenmenü ersetzen? Könnten Sie klarstellen?
Bambuntu
Nein, Sie sollten die init=/sbin/preinitKernel-Befehlszeile auf Ihre Grub-Konfiguration setzen, die dann dieses Skript ausführt, mit dem Sie init (Upstart) mit anderen Startsignalen ausführen können. Normalerweise beginnt die Ausführung von Jobs mit dem startupEreignis. Wenn dieses Signal jedoch nicht die Standardeinstellung ist, führt Upstart nichts aus. Sie erstellen dann einen Job, der hat start on minimal-startup, was dann startet, was Sie wünschen.
Tuminoid
@bambuntu Ich habe in der Antwort, die ich in meiner Antwort verlinkt habe, ausführlich erklärt, wie man Optionen zum Grub-Menü hinzufügt.
Lumbric
@Tuminoid Konnte meine Frage wieder sehen. Ich habe es bearbeitet, um zu versuchen, eine Schrittlösung zu erstellen. Ich brauche deine Hilfe.
Bambuntu
Das EVENTbedeutet keinen Dateinamen in /etc/init. Die Datei kann beliebig benannt werden /etc/init/config-1.conf. Es MUSS nur start on <EVENT>drin sein, start on minimal-startupum es zum Starten auszulösen.
Tuminoid