
Ich habe Ubuntu Server 16.04 (eigentlich ist es 3.4.113-sun8i
) mit Openbox installiert und diesen Befehl eingegeben, startx
um /etc/rc.local
nach dem Booten Grafiken zu erhalten. Das Problem ist jedoch, dass ich mich automatisch als Root-Benutzer anmelde und deshalb mein C++-Programm nicht richtig funktioniert (wie ich bereits gefragt habe, heißt es, es liege daran, dass der Root-Benutzer einige Bibliotheken wie Pulseaudio oder GTK nicht automatisch starten kann). Und ich denke, das ist richtig, weil ich sie manuell starten sollte.
Übrigens suche ich nach einer Möglichkeit, die automatische Anmeldung vom Root- zum Nicht-Root-Benutzer zu ändern. Wie kann ich das machen?
BEARBEITEN: Mein Ziel ist es, ein Gadget zu bauen, das Benutzer nur mit einem physischen Knopf ein- und ausschalten können (also ohne Menü, Optionen usw.). Das Gadget muss nach dem Booten meinen C++-Code ausführen, und der Code verwendet die GTK- und Pulseaudio-Bibliotheken.
Antwort1
Du hast mir gesagt inanderer Kommentardass Ihr System Folgendes anzeigt:
$ systemctl get-default
graphical.target
Ändern Sie es also in multi-user.target
:
$ sudo systemctl set-default multi-user.target
Und multi-user.target wird bei tty1 gestartet (Strg+Alt+F1):
$ systemctl list-dependencies multi-user.target | grep getty
● ├─getty.target
● │ ├─getty-static.service
● │ └─[email protected]
Also überschreiben wir die tty1-Datei:
$ sudo systemctl edit getty@tty1
Mit diesem Inhalt (das m
ist Ihr Benutzername):
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin m %I $TERM
/sbin/agetty
Die oben genannten Pfade können in Ihrem System abweichen. Stellen Sie sicher, dass Sie den korrekten Pfad mit folgendem überprüfen:
$ type -a agetty
agetty is /sbin/agetty
agetty is /sbin/agetty
Drücken Sie Escund dann shift+ z+ zzum Speichern und Beenden (diese Tasten sind für vim, Sie können sie ps a
während der Bearbeitung in einer anderen Terminalregisterkarte ausführen, um zu erfahren , dass der Befehl lautet. In meinem System handelt es sich dabei um einen symbolischen Link zu , Ihr System kann anders sein).editor /etc/systemd/system/[email protected]/.#override.blahblah
editor
vim.gtk3
$ type -a editor
editor is /usr/bin/editor
editor is /usr/bin/editor
$ realpath /usr/bin/editor
/usr/bin/vim.gtk3
Navigieren Sie dann getty@tty1
nach unten und fügen Sie einfach diese Zeilen an, um den Override-Effekt zu erzielen:
$ sudo systemctl cat getty@tty1
...
# /etc/systemd/system/[email protected]/override.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin xiaobai %I $TERM
Die automatische Anmeldung erfolgt wie --autologin
oben beschrieben, andernfalls müssen Sie nach dem Booten Benutzernamen und Kennwort manuell eingeben, um sich bei tty1 anzumelden.
Nachdem Sie sich mit dem Benutzernamen bei tty1 angemeldet haben m
, wird /home/m/.profile ausgeführt. Fügen Sie daher am Ende dieser Zeile hinzu /home/m/.profile
:
echo "$DISPLAY" > /tmp/hole1
echo "$XDG_VTNR" > /tmp/hole2
if [ -z "$DISPLAY" ] && [ -n "$XDG_VTNR" ] && [ "$XDG_VTNR" -eq 1 ]; then
echo lolo > /tmp/hole3
exec startx -- -nocursor
fi
echo lili > /tmp/hole4
/tmp/holeN
Das Obige dient nur zu Debugzwecken, um sicherzustellen, dass es wie gewünscht ausgeführt wird. Wenn es beispielsweise /tmp/hole3
nicht erstellt, aber /tmp/hole2
erstellt wurde, bedeutet dies, dass Sie cat /tmp/hole2
den Wert von „$XDG_VTNR“ überprüfen müssen.
startx
wird dann ausgeführt /home/m/.xinitrc
, bearbeiten Sie es:
$ cat /home/m/.xinitrc
#!/usr/bin/env bash
echo 55 > /tmp/test1
exec openbox-session
echo 55 > /tmp/test2
openbox-session
wird dann ausgeführt /home/m/.config/openbox/autostart
, bearbeiten Sie es wie gewohnt:
$ cat /home/m/.config/openbox/autostart
echo 7 > /tmp/yy
/home/m/img &
echo 8 > /tmp/yy2
Schließlich wird durch den Neustart Ihr Bild direkt angezeigt. Die obige Anweisung kann wie folgt zusammengefasst werden:
multi-user.target -> tty1 -> ausführen[email geschützt]-> ExecStart-Automatikanmeldung mit gewünschtem Benutzernamen -> angemeldet wird ~/.profile ausgeführt ->
exec startx
-> startx wird ausgeführt~/.xinitrc
-> exec openbox-session -> openbox wird ausgeführt~/.config/openbox/autostart
->/home/m/img &
wird angezeigt.
[AKTUALISIEREN]
Ich chatte mit OP inChatraum(Transkript) und löste sein Problem.
rc.local kann startx ausführen, weil rc.local startx als Root ausführt, aber ~/.profile führt startx nicht als Root aus. Wir stellen startx > /tmp/my.log 2>&1
sicher, dass startx korrekt ausgeführt wird, dann zeigt /tmp/my.log an, dass wir prüfen müssen /home/m/.local/share/xorg/Xorg.0.log
, und schließlich ist mir aufgefallen, dass das erste (EE)
ist (EE) open /dev/fb8: Permission denied
.
OP muss einen Benutzer m
zur Videogruppe hinzufügen, um beim Start von x die Berechtigung für den Zugriff auf den gewünschten FRAMEBUFFER /dev/fb8 zu erhalten.
sudo usermod -a -G audio m
sudo usermod -a -G video m
P.S.: Ich frage mich, ob es notwendig ist, der Audiogruppe oben etwas hinzuzufügen.Referenz
Antwort2
/etc/rc.local
wird als Benutzer ausgeführt root
. Sie sollten daher su -l jdoe -c startx
in verwenden rc.local
, vorausgesetzt, jdoe
dass dies der Benutzer ist, mit dem Sie Xorg starten möchten.
Ich bezweifle, dass Sie systemd haben, da systemd es standardmäßig ignoriert, rc.local
es sei denn, Sie haben ein Upgrade von einer früheren Version durchgeführt, die systemd nicht hatte, und selbst dann bin ich mir nicht sicher ... Ich verwende systemd nicht.
Wenn Sie systemd haben, müssen Sie hierfür eine Unit-Datei erstellen. Hierzu gibt es online zahlreiche Ressourcen.
Ich habe bei Google nach „systemd-Unit-Datei“ gesucht und Folgendes gefunden: Fügen Sie Folgendes in die Datei ein: /etc/systemd/system/autologin.service
(vorausgesetzt, systemd befindet sich dort auf Ihrem System)
[Unit]
Description=Autologin service
[Service]
Type=fork
user=jdoe
group=users
ExecStart=/path/to/your/startx
TimeoutSec=0
[Install]
WantedBy=multi-user.target
Du wirst die Einheit etwas anpassen müssen .... wahrscheinlich willst du X nicht als, jdoe
sondern als ein anderer Benutzer starten. Außerdem users
ist der Benutzer möglicherweise nicht Mitglied einer Gruppe und nicht zuletzt /path/to/your/startx
ist es nicht der Pfad zu deinem startx
... führe einen Versuch aus which startx
, um den Pfad herauszufinden.
Als Nächstes führen Sie aus, sudo systemctl daemon-reload
um die Konfiguration neu zu laden und einen Neustart durchzuführen.
BEARBEITEN (folgen Sie den Kommentaren vom OP):
Du willst das:
[Unit]
Description=Autologin service
[Service]
Type=fork
user=m
group=m
ExecStart=/usr/bin/startx
TimeoutSec=0
[Install]
WantedBy=multi-user.target
Vorausgesetzt, Ihr startx
ist in /usr/bin/startx
, „sollte“ das funktionieren.
Antwort3
Entfernen Sie zunächst startx
von /etc/rc.local
und finden Sie dann heraus, welchen Display-Manager Sie haben (höchstwahrscheinlich lightdm, da Sie Ubuntu verwenden).
Informieren Sie sich dann über die Systemd-Dienste und die Konfiguration des Display-Managers, konfigurieren Sie die automatische Anmeldung beim Display-Manager und aktivieren Sie dessen Dienst.