콘솔 출력에 다음과 유사한 반복 오류가 표시되는 GUI 응용 프로그램과 관련된 몇 가지 미해결 문제가 있습니다.
(XXXX:YYYY): dconf-CRITICAL **: unable to create file '/run/user/NNNN/dconf/user': Permission denied. dconf will not work properly.
또는
(XXXX:YYYY): dconf-CRITICAL **: unable to create directory '/run/user/NNNN/dconf': Permission denied. dconf will not work properly.
여기서 XXX는 애플리케이션 이름, YYY는 숫자, NNN은 사용자 ID 번호(?)입니다.
- '/run/user/7093511/dconf' 디렉터리를 생성할 수 없습니다: 권한이 거부되었습니다. dconf가 제대로 작동하지 않습니다
- "'/run/user/1000/dconf/user' 파일을 생성할 수 없습니다: 권한이 거부되었습니다"라는 메시지를 받았습니다.(적절한 공개: 3년 전에 제가 했던 질문)
- Mate 데스크탑에는 사용자가 전환할 때 패널이 없고 수십 개의 caja 창이 표시됩니까?
- 대체 사용자로부터 X 응용 프로그램을 실행할 때 dconf가 실패합니다.
- vnc의 검은색 화면과 iLo의 회색 화면이 /run/user/1000/dconf/user에 문제가 될 수 있습니까?
이러한 질문은 종종 답이 없거나 문제를 해결하지 못하는 답변을 얻습니다(또는 응답하지 않는 포스터).
나는 이 문제에 대해 충분한 커뮤니티 관심을 가져서 문제의 가능한 원인에 대한 적절한 설명을 제공하고 문제를 해결하기 위해 취해야 할 몇 가지 조치를 나열하기를 바랍니다(예: 90%의 경우). ) 앞으로 사람들은 이러한 질문의 또 다른 변형을 이 질문의 중복으로 쉽게 표시할 수 있습니다.
답변1
가장 간단한 이유는 전체 /run/user/<UID>
디렉토리가 존재하지 않는다는 것입니다. 이는 systemd-logind에 의해 생성되지 않았습니다. 일반적으로 문제의 UID가 표준 "사용자 로그인" 프로세스를 거치지 않고 단지 su
'd'ed 또는 sudo
'' 되었기 때문입니다. pam_systemd를 호출하지 않고 들어갔습니다.
("권한 거부됨"은 dconf가 모든 상위 디렉토리를 mkdir하려고 시도할 때 발생하지만 /run 및 /run/user 자체는 루트에서만 쓸 수 있기 때문에 그렇게 할 수 없습니다.)
이 디렉터리는 해당 UID에 대한 세션이 하나 이상 생성될 때 생성됩니다. 마찬가지로 systemd-logind에서 사용자의 세션 수가 0으로 떨어지는 것을 확인하면 삭제됩니다. 예를 들어 게시물 중 하나에서 su -l
대신 을 사용하면 su
su가 다른 PAM 구성을 사용하게 되므로 문제가 해결됩니다. 여기서 pam_systemd예활성화되었습니다.
따라서 VNC를 통해 데스크톱을 사용할 때 자신의 UID로 오류 메시지를 표시하기 시작하면 전체 VNC 프로세스 트리가 systemd-logind "세션" 외부에 존재한다는 의미일 수 있습니다(즉, VNC 서버를 시작할 때 PAM이 사용되지 않았습니다). , 따라서 systemd-logind가 /run/user/<UID>
로그아웃 시 디렉터리를 삭제하는 것을 방지하는 참조 카운트의 일부가 아닙니다 .
(예를 들어 원격 호스트에 SSH로 연결하면 사용자 런타임 디렉터리가 생성됩니다. 그런 다음 "vncserver.service"와 같은 것을 시작하면 모든 것이 괜찮아 보입니다. 그러나 일단 SSH 연결을 끊으면 런타임 디렉터리가 다시 삭제됩니다. 그게 마지막 세션이었어).
(아마도 간접적으로 볼 수 있습니다 journalctl
. - "UID <UID>에 대한 사용자 관리자"라는 이름의 "systemd --user" 인스턴스가 시작/중지되면 런타임 디렉터리가 동시에 생성/삭제됩니다.)
이러한 경우 런타임 디렉터리를 "영구"로 만드는 한 가지 방법은 systemd-logind를 설정하는 것입니다.질질 끌게 하다를 사용하여 이 사용자에 대한 플래그입니다 loginctl enable-linger <USERNAME>
. 그러면 해당 사용자의 런타임 디렉터리(및 해당 systemd --user
인스턴스)가 시작 시 시작되고 종료될 때까지 유지됩니다.
또는 VNC가 systemd를 통해 시작되면 PAMName=
.service 매개변수를 사용하여 전체 PAM 세션을 생성해야 합니다. 이 매개변수는 systemd-logind에 등록하고 VNC .service가 실행될 때 런타임 디렉터리를 생성합니다.
두 번째 관련 이유는 dconf가 다음을 사용하라는 지시를 받았기 때문입니다.다른 사용자의런타임 디렉터리. "/run/user/<UID>" 패턴은 dconf에 의해 직접 결정되지 않습니다. 대신 전체 경로는 XDG_RUNTIME_DIR
PAM에 의해 설정된 환경 변수에서 가져옵니다.
다른 사용자로 그래픽 프로그램을 실행하는 것과 같은 기능을 사용하면 sudo -E
모든 환경을 상속하게 됩니다. $HOME이 누구나 읽을 수 있으면 작업할 수 있지만 $XDG_RUNTIME_DIR을 그대로 사용할 수는 없습니다. (설계상) 귀하만 접근할 수 있습니다.
해결책은 "하지 마십시오"입니다. 즉, 다른 UID에서 실행되는 프로그램이 $XDG_RUNTIME_DIR 및 관련 환경을 상속하지 못하게 하는 것입니다. 특히 dconf의 경우 필요한 경우 사용자의 ~/.cache/dconf로 대체됩니다(물론 잘못된 $HOME도 상속하지 않는다고 가정하지만).
답변2
su -l 사용자 이름 -c "(내보내기 DISPLAY=:5; dbus-launch --exit-with-session; vncserver -geometry 1792x899 -깊이 24 :5)"
"dbus-launch --exit-with-session" 명령은 vncserver를 실행하는 사용자와 관련된 dbus 변수를 설정합니다. 그렇지 않으면 다른 곳에서 해당 변수를 가져오거나 전혀 설정하지 않을 수 있습니다. 올바르게 설정해야 합니다. 그렇지 않으면 검은 화면이 나타나거나 권한이 거부됩니다. 예를 들어
DBUS_SESSION_BUS_ADDRESS=유닉스:경로=/run/user/1003/버스
답변3
데비안 스트레치
12시간 세션 동안 내 xsession-errors 파일은 때때로 500,000개가 넘는 제목 줄로 가득 차곤 했습니다( tail -f -n +1 .~/xsession-errors | nl
제가 사용할 수 있는 임시 완화 방법은 터미널 창에서 대학살이 일어나는 것을 보기 위해 실행하는 것이었지만 chown -R 1000:1000 /run/user/1000/*
여전히 그렇습니다). ..). 이러한 상황이 발생하지 않도록 제가 취하는 조치를 요약하면 다음과 같습니다.
su
먼저 모든 개인 스크립트, 데스크탑 파일 및 키보드 단축키 조각을 정리하여 and 명령이 나오는 곳을 찾아 and 명령 gksu
으로 대체했습니다 . 또한 나는su -l
gksu -l
Xfce좀 남았어/usr/공유/응용 프로그램/이렇게 변경해야 할 데스크톱 파일(주로 내가 생성/수정하는 파일)입니다.
그런 다음 사용자 데스크톱 파일에 하나 이상의 호출이 있으므로루트에 su실행 파일(Debian에 있음)메뉴패키지), 복사했습니다/usr/bin/su를 루트로도착하다/usr/로컬/빈/그리고 이름을 "su-root-gksu-l”. 그런 다음 해당 파일에서 다음 줄을 교체했습니다.
gksu) gksu -u "$PRIV" "$COMMAND";;
그리고
gksu) gksu -l -u "$PRIV" "$COMMAND";;
다음으로 위의 내용을 사용하기 위해 모든 개인 스크립트, 데스크톱 파일 및 키보드 단축키 조각을 정리했습니다.루트에 su실행 파일을 만들고 동일한 콘텐츠에 대한 참조를 다음으로 변경합니다.su-root-gksu-l. 나했다데스크탑 파일을 찾았습니다/usr/공유/응용 프로그램/사용된루트에 su스크립트를 작성했지만 필요하지 않다고 생각하여 변경하지 않았습니다. 나도 다 지웠어.투나드사용자 정의 작업.
마지막으로 시스템 전체 별칭을 만들었습니다(등/bash.bashrc문서):function su() { if [[ $1 == "--" ]]; then command su "$@"; else command su -l "$@"; fi; }
참고로 이 쉘 기능에 대한 추가 논의가 있습니다.여기.