루트에서 루트가 아닌 자동 로그인으로 자동 로그인을 변경하는 방법은 무엇입니까?

루트에서 루트가 아닌 자동 로그인으로 자동 로그인을 변경하는 방법은 무엇입니까?

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.blahblaheditorvim.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>&1startx가 올바르게 실행되고 있는지 확인한 다음 /tmp/my.log에 우리가 확인해야 할 내용이 표시되고 /home/m/.local/share/xorg/Xorg.0.log결국 첫 번째 항목 (EE)(EE) open /dev/fb8: Permission denied.

OP는 mx를 부팅할 때 필요한 FRAMEBUFFER /dev/fb8에 대한 액세스 권한을 얻으려면 비디오 그룹에 사용자를 추가해야 합니다.

sudo usermod -a -G audio m
sudo usermod -a -G video m

참고문헌 1,참고문헌 2

p/s: 위에 추가된 오디오 그룹이 꼭 필요한지 궁금합니다.인용하다

답변2

/etc/rc.local사용자로 실행합니다 root. 따라서 Xorg를 시작하려는 사용자라고 가정하고 su -l jdoe -c startxin 을 사용해야 합니다 .rc.localjdoe

나는 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경로도 아닐 것입니다 .startxwhich 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일 가능성이 높습니다).

그런 다음 시스템 서비스 및 디스플레이 관리자 구성을 읽고 디스플레이 관리자에서 자동 로그인을 구성하고 해당 서비스를 활성화합니다.

관련 정보