
Instalei o servidor Ubuntu 16.04 (na verdade é 3.4.113-sun8i
) com Openbox. e coloque este comando startx
dentro /etc/rc.local
para ter gráficos após a inicialização. mas o problema é que ele faz login automaticamente como usuário root e, por causa disso, meu programa C++ não funciona corretamente (como perguntei antes, dizem que é porque o usuário root não consegue iniciar algumas bibliotecas como pulseaudio ou gtk automaticamente) . E acho certo porque devo iniciá-los manualmente.
A propósito, estou procurando uma maneira de alterar o login automático de usuário root para usuário não root. como eu posso fazer isso?
EDIT: meu objetivo é construir um gadget, os usuários só podem ligá-lo/desligá-lo por meio de um botão físico (quero dizer, sem menu, opção, etc.). O gadget deve executar meu código C++ após a inicialização, e o código usa as bibliotecas gtk e pulseaudio.
Responder1
Você me contou emoutro comentárioque seu sistema mostre isso:
$ systemctl get-default
graphical.target
Então, mude para multi-user.target
:
$ sudo systemctl set-default multi-user.target
E multi-user.target começará em tty1 (Ctrl+Alt+F1):
$ systemctl list-dependencies multi-user.target | grep getty
● ├─getty.target
● │ ├─getty-static.service
● │ └─[email protected]
Então, substituímos o arquivo tty1:
$ sudo systemctl edit getty@tty1
Com este conteúdo (que m
é o seu nome de usuário):
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin m %I $TERM
/sbin/agetty
acima pode ser diferente em seu sistema, certifique-se de verificar o caminho correto com:
$ type -a agetty
agetty is /sbin/agetty
agetty is /sbin/agetty
Pressione Esc, então shift+ z+ zpara salvar e sair (estas teclas são para o vim, você pode executar ps a
em outra aba do terminal enquanto edita para saber que seu comando é , no qual está o link simbólico no meu sistema, seu sistema pode 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
Em seguida, cat getty@tty1
e navegue até o final, você saberá que basta anexar estas linhas para fazer o efeito de substituição:
$ sudo systemctl cat getty@tty1
...
# /etc/systemd/system/[email protected]/override.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin xiaobai %I $TERM
Login automático feito --autologin
acima, caso contrário você precisará digitar manualmente o nome de usuário e a senha para fazer login em tty1 após a inicialização.
Depois de fazer login em tty1 com nome de usuário m
, ele executará /home/m/.profile, então adicione esta linha no final do seu /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
acima é apenas para fins de depuração, para saber se ele funciona conforme desejado. por exemplo, se /tmp/hole3
não foi criado, mas /tmp/hole2
foi criado, isso significa que você precisa cat /tmp/hole2
verificar o valor de "$XDG_VTNR" .
startx
irá então executar /home/m/.xinitrc
, edite-o:
$ cat /home/m/.xinitrc
#!/usr/bin/env bash
echo 55 > /tmp/test1
exec openbox-session
echo 55 > /tmp/test2
openbox-session
irá então executar /home/m/.config/openbox/autostart
, edite-o como de costume:
$ cat /home/m/.config/openbox/autostart
echo 7 > /tmp/yy
/home/m/img &
echo 8 > /tmp/yy2
Afinal, reiniciar, irá levá-lo para mostrar sua imagem diretamente, a instrução acima pode ser resumida como:
multiusuário.target -> tty1 -> executar[e-mail protegido]-> Login automático do ExecStart com o nome de usuário desejado -> o login será executado ~/.profile ->
exec startx
-> startx será executado~/.xinitrc
-> exec openbox-session -> openbox será executado~/.config/openbox/autostart
->/home/m/img &
irá aparecer.
[ATUALIZAR]
Eu converso com OP emsala de bate-papo(transcrição) e resolveu seu problema.
rc.local capaz de iniciarx por causa de rc.local executar startx como root, mas ~/.profile não é executado startx como root. Fazemos isso startx > /tmp/my.log 2>&1
para garantir que o startx seja executado corretamente, então /tmp/my.log mostrará que precisamos verificar /home/m/.local/share/xorg/Xorg.0.log
e, eventualmente, notei que o primeiro (EE)
é (EE) open /dev/fb8: Permission denied
.
O OP precisa adicionar o usuário m
ao grupo de vídeo para obter permissão quando startx acessar o FRAMEBUFFER /dev/fb8 desejado.
sudo usermod -a -G audio m
sudo usermod -a -G video m
p/s: Gostaria de saber se é necessário adicionar ao grupo de áudio acima.referência
Responder2
/etc/rc.local
é executado como usuário root
. Você deve, portanto, usar su -l jdoe -c startx
in rc.local
, assumindo jdoe
que é o usuário que deseja iniciar o Xorg.
Duvido que você tenha o systemd, porque o systemd, por padrão, ignora, rc.local
a menos que você tenha atualizado de uma versão anterior que não tinha o systemd e, mesmo assim, não tenho certeza... Eu não executo o systemd.
Se você possui o systemd, precisará criar um arquivo de unidade para isso. Existem muitos recursos online para isso.
Pesquisei no Google por "arquivo de unidade systemd" e encontrei o seguinte: Coloque o seguinte no arquivo: /etc/systemd/system/autologin.service
(assumindo que é onde o systemd reside no seu sistema)
[Unit]
Description=Autologin service
[Service]
Type=fork
user=jdoe
group=users
ExecStart=/path/to/your/startx
TimeoutSec=0
[Install]
WantedBy=multi-user.target
Você terá que adaptar um pouco a unidade.... você provavelmente não deseja iniciar o X como jdoe
outro usuário. Além disso, users
pode não ser um grupo do qual o usuário é membro, por último, mas não menos importante, /path/to/your/startx
não é o caminho para o seu startx
... execute which startx
para descobrir o caminho.
Em seguida, você executa sudo systemctl daemon-reload
para recarregar a configuração e reinicializar.
EDIT (após comentários da operação):
Você quer isso:
[Unit]
Description=Autologin service
[Service]
Type=fork
user=m
group=m
ExecStart=/usr/bin/startx
TimeoutSec=0
[Install]
WantedBy=multi-user.target
Supondo que você startx
esteja em /usr/bin/startx
, isso "deveria" funcionar.
Responder3
Comece removendo startx
from /etc/rc.local
e descubra qual gerenciador de exibição você possui (provavelmente lightdm, já que você está no Ubuntu).
Em seguida, leia sobre os serviços do systemd e a configuração do gerenciador de exibição, configure o login automático no gerenciador de exibição e habilite seu serviço.