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 surferboot
Platzieren Sie den gesamten benutzerdefinierten Boot-Skript-Code zwischen script
und 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.
quelle
/etc/init
klingt das Kopieren von Dingen schmutzig. Vielleicht könnten Sie etwas detaillierter beschreiben, was in den Konfigurationen anders sein sollte?/sbin/preinit
Skript 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 impreinit
Skript und am Ende führe einfach init ausexec /sbin/init
und es bootet normal.Antworten:
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
.quelle
/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.local
einem 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.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 alsstartup
und Sie können Ihr Boot-up nach Belieben erstellen.Geben Sie zum Beispiel Folgendes ein
/sbin/preinit
: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.
quelle
init=/sbin/preinit
Kernel-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 demstartup
Ereignis. Wenn dieses Signal jedoch nicht die Standardeinstellung ist, führt Upstart nichts aus. Sie erstellen dann einen Job, der hatstart on minimal-startup
, was dann startet, was Sie wünschen.EVENT
bedeutet keinen Dateinamen in/etc/init
. Die Datei kann beliebig benannt werden/etc/init/config-1.conf
. Es MUSS nurstart on <EVENT>
drin sein,start on minimal-startup
um es zum Starten auszulösen.