3.4.113-sun8i
Openbox와 함께 Ubuntu 서버 16.04(실제로는)를 설치했습니다 . 시작 후 그래프를 표시하려면 이 명령을 startx
그 안에 입력하세요. /etc/rc.local
그러나 문제는 자동으로 루트 사용자로 로그인하므로 내 C++ 프로그램이 제대로 작동하지 않는다는 것입니다. (전에 물어본 것처럼 루트 사용자는 pulseaudio 또는 gtk와 같은 일부 라이브러리를 자동으로 시작할 수 없기 때문이라고 말했습니다.) 수동으로 시작해야 하므로 이것이 맞는 것 같습니다.
그런데 자동 로그인을 루트에서 비루트로 변경하는 방법을 찾고 있습니다. 어떻게 해야 합니까?
편집: 내 목표는 사용자가 물리적 버튼을 통해서만 켜고 끌 수 있는 위젯을 만드는 것입니다(메뉴, 옵션 등이 없음을 의미합니다). 가젯은 시작 후 내 C++ 코드를 실행해야 하며 코드는 gtk 및 pulseaudio 라이브러리를 사용합니다.
답변1
당신은 나에게 말했다기타 의견시스템에 다음이 표시됩니다.
$ systemctl get-default
graphical.target
따라서 다음과 같이 변경하십시오 multi-user.target
.
$ sudo systemctl set-default multi-user.target
multi-user.target은 tty1에서 시작됩니다(Ctrl+Alt+F1):
$ systemctl list-dependencies multi-user.target | grep getty
● ├─getty.target
● │ ├─getty-static.service
● │ └─[email protected]
따라서 tty1 파일을 덮어씁니다.
$ sudo systemctl edit getty@tty1
다음을 포함하십시오( m
귀하의 사용자 이름):
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin m %I $TERM
/sbin/agetty
위의 내용은 시스템에 따라 다를 수 있습니다. 올바른 경로를 확인하세요.
$ type -a agetty
agetty is /sbin/agetty
agetty is /sbin/agetty
Esc그런 다음 shift+ z+를 눌러 z저장하고 종료합니다(이 키는 vim용입니다. ps a
편집하는 동안 다른 터미널 탭에서 실행하여 명령이 무엇인지, 내 시스템의 심볼릭 링크가 어디에 있는지, 사용자의 시스템과 다를 수 있습니다).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
그런 다음 cat을 getty@tty1
실행하고 맨 아래로 이동하면 오버레이 효과를 얻기 위해 다음 줄이 추가된다는 것을 알 수 있습니다.
$ sudo systemctl cat getty@tty1
...
# /etc/systemd/system/[email protected]/override.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin xiaobai %I $TERM
위 과정을 거쳐 자동 로그인이 --autologin
완료되며, 그렇지 않은 경우에는 부팅 후 tty1에 로그인하기 위해 사용자 이름과 비밀번호를 수동으로 입력해야 합니다.
username 을 사용하여 tty1에 로그인하면 m
/home/m/.profile이 실행되므로 다음 줄을 끝에 추가하세요 /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
위의 내용은 디버깅 목적으로만 원하는 대로 작동하는지 확인하기 위한 것입니다. 예를 들어 /tmp/hole3
생성되지는 않았지만 생성이 되었다면 "$XDG_VTNR" 값을 확인 /tmp/hole2
해야 한다는 뜻이다 .cat /tmp/hole2
startx
/home/m/.xinitrc
그런 다음 편집하기 위해 실행됩니다 .
$ cat /home/m/.xinitrc
#!/usr/bin/env bash
echo 55 > /tmp/test1
exec openbox-session
echo 55 > /tmp/test2
openbox-session
그런 다음 실행되며 /home/m/.config/openbox/autostart
평소대로 편집하십시오.
$ cat /home/m/.config/openbox/autostart
echo 7 > /tmp/yy
/home/m/img &
echo 8 > /tmp/yy2
완료되면 재부팅하면 이미지로 바로 이동합니다. 위 지침은 다음과 같이 요약될 수 있습니다.
다중 사용자.대상 -> tty1 -> 실행[이메일 보호됨]-> ExecStart가 원하는 사용자 이름으로 자동 로그인됩니다. -> 로그인 후 ~/.profile이 실행됩니다. ->
exec startx
-> startx가 실행됩니다.~/.xinitrc
-> exec openbox-session -> openbox가 실행됩니다 .~/.config/openbox/autostart
->/home/m/img &
팝업이 나타납니다.
[고쳐 쓰다]
나는 OP와 이야기를 나눴다.대화방(성적 증명서) 그의 문제를 해결했습니다.
rc.local은 startx를 루트로 실행하지만 ~/.profile은 startx를 루트로 실행하지 않기 때문에 x를 시작할 수 있습니다. 우리는 startx > /tmp/my.log 2>&1
startx가 올바르게 실행되고 있는지 확인한 다음 /tmp/my.log에 우리가 확인해야 할 내용이 표시되고 /home/m/.local/share/xorg/Xorg.0.log
결국 첫 번째 항목 (EE)
이 (EE) open /dev/fb8: Permission denied
.
OP는 m
x를 부팅할 때 필요한 FRAMEBUFFER /dev/fb8에 대한 액세스 권한을 얻으려면 비디오 그룹에 사용자를 추가해야 합니다.
sudo usermod -a -G audio m
sudo usermod -a -G video m
p/s: 위에 추가된 오디오 그룹이 꼭 필요한지 궁금합니다.인용하다
답변2
/etc/rc.local
사용자로 실행합니다 root
. 따라서 Xorg를 시작하려는 사용자라고 가정하고 su -l jdoe -c startx
in 을 사용해야 합니다 .rc.local
jdoe
나는 systemd가 없는 이전 버전에서 업그레이드하지 않는 한 기본적으로 systemd가 그것을 무시하기 때문에 systemd를 가지고 있다고 생각합니다 rc.local
. 그리고 나서도 확실하지 않습니다 ... 나는 systemd를 실행하지 않습니다.
systemd가 있는 경우 이를 위한 유닛 파일을 생성해야 합니다. 온라인에는 이 주제에 관한 많은 리소스가 있습니다.
나는 "systemd 단위 파일"을 검색하여 다음을 찾았습니다. 다음을 파일에 넣으십시오: ( /etc/systemd/system/autologin.service
이것이 시스템의 systemd 위치라고 가정)
[Unit]
Description=Autologin service
[Service]
Type=fork
user=jdoe
group=users
ExecStart=/path/to/your/startx
TimeoutSec=0
[Install]
WantedBy=multi-user.target
jdoe
장치를 어느 정도 조정해야 할 것입니다. 아마도 다른 사용자로 X를 시작하고 싶지 않을 것입니다 . 또한, users
아마도 사용자가 속한 그룹이 아닐 수도 있고, 마지막으로 중요한 것은 경로를 찾기 위해 실행하는 /path/to/your/startx
경로도 아닐 것입니다 .startx
which startx
다음으로 실행하여 sudo systemctl daemon-reload
구성을 다시 로드하고 재부팅합니다.
편집 (OP의 의견 아래):
당신은 이것을 원합니다 :
[Unit]
Description=Autologin service
[Service]
Type=fork
user=m
group=m
ExecStart=/usr/bin/startx
TimeoutSec=0
[Install]
WantedBy=multi-user.target
당신이 그렇다고 가정하면 startx
, /usr/bin/startx
그것은 "작동해야 한다".
답변3
먼저 startx
에서 제거한 /etc/rc.local
다음 어떤 디스플레이 관리자가 있는지 알아보세요(Ubuntu를 사용하고 있으므로 lightdm일 가능성이 높습니다).
그런 다음 시스템 서비스 및 디스플레이 관리자 구성을 읽고 디스플레이 관리자에서 자동 로그인을 구성하고 해당 서비스를 활성화합니다.