
He instalado el servidor Ubuntu 16.04 (en realidad lo es 3.4.113-sun8i
) con Openbox. y coloque este comando startx
dentro /etc/rc.local
para tener gráficos después del arranque. pero el problema es que inicia sesión automáticamente como usuario root y, debido a esto, mi programa C++ no funciona correctamente (como pregunté antes, dicen que es porque el usuario root no puede iniciar algunas bibliotecas como pulseaudio o gtk automáticamente) . Y creo que es correcto porque debería iniciarlos manualmente.
Por cierto, estoy buscando una forma de cambiar el inicio de sesión automático de usuario root a usuario no root. ¿Cómo puedo hacerlo?
EDITAR: mi objetivo es crear un dispositivo, los usuarios solo pueden activarlo/desactivarlo mediante un botón físico (me refiero a ningún menú, opción, etc.). El dispositivo debe ejecutar mi código C++ después del arranque, y el código utiliza las bibliotecas gtk y pulseaudio.
Respuesta1
Me lo dijiste enOtro comentarioque tu sistema muestre esto:
$ systemctl get-default
graphical.target
Entonces, cámbialo a multi-user.target
:
$ sudo systemctl set-default multi-user.target
Y multi-user.target comenzará en tty1 (Ctrl+Alt+F1):
$ systemctl list-dependencies multi-user.target | grep getty
● ├─getty.target
● │ ├─getty-static.service
● │ └─[email protected]
Entonces, anulamos el archivo tty1:
$ sudo systemctl edit getty@tty1
Con este contenido (que m
es tu nombre de usuario):
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin m %I $TERM
/sbin/agetty
Lo anterior puede ser diferente en su sistema, asegúrese de verificar la ruta correcta con:
$ type -a agetty
agetty is /sbin/agetty
agetty is /sbin/agetty
Presione Esc, luego shift+ z+ zpara guardar y salir (esta clave es para vim, puede ejecutarla ps a
en otra pestaña de terminal mientras edita para saber que su comando es , en el cual hay un enlace simbólico en mi sistema, su sistema puede variar).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
Luego, seleccione getty@tty1
y navegue hasta el final, sabrá que simplemente agregue estas líneas para lograr el efecto de anulación:
$ sudo systemctl cat getty@tty1
...
# /etc/systemd/system/[email protected]/override.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin xiaobai %I $TERM
El inicio de sesión automático se realizó --autologin
anteriormente; de lo contrario, deberá escribir manualmente el nombre de usuario y la contraseña para iniciar sesión en tty1 después del inicio.
Después de iniciar sesión en tty1 con nombre de usuario m
, se ejecutará /home/m/.profile, así que agregue esta línea al final de su /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
Lo anterior es solo para fines de depuración, para saber que se ejecuta como se desea. Por ejemplo, si /tmp/hole3
no se creó pero /tmp/hole2
se creó, significa que debe cat /tmp/hole2
verificar el valor de "$XDG_VTNR".
startx
Luego se ejecutará /home/m/.xinitrc
, edítelo:
$ cat /home/m/.xinitrc
#!/usr/bin/env bash
echo 55 > /tmp/test1
exec openbox-session
echo 55 > /tmp/test2
openbox-session
Luego se ejecutará /home/m/.config/openbox/autostart
, edítelo como de costumbre:
$ cat /home/m/.config/openbox/autostart
echo 7 > /tmp/yy
/home/m/img &
echo 8 > /tmp/yy2
Después de todo, reinicie y le llevará a mostrar su imagen directamente. Las instrucciones anteriores se pueden resumir como:
multi-user.target -> tty1 -> ejecutar[correo electrónico protegido]-> Inicio de sesión automático de ExecStart con el nombre de usuario deseado -> iniciar sesión se ejecutará ~/.profile ->
exec startx
-> startx se ejecutará~/.xinitrc
-> exec openbox-session -> openbox se ejecutará~/.config/openbox/autostart
->/home/m/img &
aparecerá una ventana emergente.
[ACTUALIZAR]
Hablo con OP ensala de chat(transcripción) y resolvió su problema.
rc.local puede iniciar x debido a que rc.local ejecuta startx como root, pero ~/.profile no se ejecuta startx como root. Lo hacemos startx > /tmp/my.log 2>&1
para garantizar que startx se ejecute correctamente, luego /tmp/my.log mostrará que debemos verificar /home/m/.local/share/xorg/Xorg.0.log
y, finalmente, noté que el primero (EE)
es (EE) open /dev/fb8: Permission denied
.
OP necesita agregar un usuario m
al grupo de videos para obtener permiso cuando inicie x para acceder al FRAMEBUFFER /dev/fb8 deseado.
sudo usermod -a -G audio m
sudo usermod -a -G video m
p/s: Me pregunto si es necesario agregar al grupo de audio anterior.árbitro
Respuesta2
/etc/rc.local
se ejecuta como usuario root
. Por lo tanto, debería utilizar su -l jdoe -c startx
in rc.local
, asumiendo que jdoe
es el usuario con el que desea iniciar Xorg.
Dudo que tengas systemd, porque systemd, por defecto, ignora rc.local
a menos que hayas actualizado desde una versión anterior que no tenía systemd y aun así, no estoy seguro... No ejecuto systemd.
Si tiene systemd, necesita crear un archivo de unidad para esto. Hay muchos recursos en línea para esto.
Busqué en Google "archivo de unidad systemd" y encontré lo siguiente: Coloque lo siguiente en el archivo: /etc/systemd/system/autologin.service
(suponiendo que ahí es donde reside systemd en su sistema)
[Unit]
Description=Autologin service
[Service]
Type=fork
user=jdoe
group=users
ExecStart=/path/to/your/startx
TimeoutSec=0
[Install]
WantedBy=multi-user.target
Tendrás que adaptar un poco la unidad....probablemente no quieras iniciar X como jdoe
sino como otro usuario. Además, users
es posible que no sea un grupo del que el usuario sea miembro; por último, pero no menos importante, /path/to/your/startx
no es la ruta a su startx
... ejecute which startx
para encontrar la ruta.
A continuación, ejecuta sudo systemctl daemon-reload
para recargar la configuración y reinicia.
EDITAR (siguiendo los comentarios de op):
Tu quieres esto:
[Unit]
Description=Autologin service
[Service]
Type=fork
user=m
group=m
ExecStart=/usr/bin/startx
TimeoutSec=0
[Install]
WantedBy=multi-user.target
Suponiendo que startx
esté en /usr/bin/startx
, eso "debería" funcionar.
Respuesta3
Comience eliminando startx
de /etc/rc.local
, luego averigüe qué administrador de pantalla tiene (probablemente lightdm, ya que está en Ubuntu).
Luego lea sobre los servicios systemd y la configuración del administrador de pantalla, configure el inicio de sesión automático en el administrador de pantalla y habilite su servicio.