안정적인 비디오 출력 이름을 얻는 방법은 무엇입니까?

안정적인 비디오 출력 이름을 얻는 방법은 무엇입니까?
  • 시스템: 델 래티튜드 5591
  • CPU i7-8850H
  • GPU: 통합 Intel HD630(전용 GPU 없음)
  • USB-C 도킹 스테이션: WD15
  • 화면: 2x Acer G226HQL(HDMI를 통한 직접 연결 및 DVI를 통한 miniDP 어댑터 도킹)

  • 운영 체제: KDE 네온 18.4

  • 커널: 5.3.0-45-일반

도크를 다시 연결할 때마다 화면이 검은색으로 유지됩니다. 3화면 레이아웃을 다시 활성화하려면 xrandr(arandr, KDE 디스플레이 구성 등)을 열어야 했습니다. 나는 이것이 불안정한 포트 이름 때문이라고 생각합니다.

모든 구성:

grep . /sys/class/drm/*/status
/sys/class/drm/card0-DP-1/status:disconnected
/sys/class/drm/card0-DP-2/status:disconnected
/sys/class/drm/card0-DP-5/status:connected        # <---- 5
/sys/class/drm/card0-DP-7/status:connected        # <---- 7
/sys/class/drm/card0-DP-8/status:disconnected
/sys/class/drm/card0-eDP-1/status:connected
/sys/class/drm/card0-HDMI-A-1/status:disconnected
/sys/class/drm/card0-HDMI-A-2/status:disconnected
/sys/class/drm/card0-HDMI-A-3/status:disconnected

이제 도크를 분리했다가 다시 연결하면 다음과 같습니다.

/sys/class/drm/card0-DP-1/status:disconnected
/sys/class/drm/card0-DP-2/status:disconnected
/sys/class/drm/card0-DP-6/status:connected        # <---- 6
/sys/class/drm/card0-DP-8/status:connected        # <---- 8
/sys/class/drm/card0-DP-9/status:disconnected
/sys/class/drm/card0-eDP-1/status:connected
/sys/class/drm/card0-HDMI-A-1/status:disconnected
/sys/class/drm/card0-HDMI-A-2/status:disconnected
/sys/class/drm/card0-HDMI-A-3/status:disconnected

DP-5은( DP-7는) 이제 DP-6및 로 호출됩니다 DP-8. 숫자는 매번 바뀌는데요.

이런 일이 발생하는 것을 방지하는 방법은 무엇입니까?

편집 1:관련성이 있을 수 있는 행동을 알아보세요. PCH 온도를 모니터링하는 온도 위젯이 있습니다. 또한 재부팅할 때마다 이름이 변경됩니다. acpi/Thermal_Zone/1-pch_cannonlake/Temperature입력한 숫자는 재부팅할 때마다 거의 변경됩니다. 모니터는 자주 재구성되어야 합니다.

편집 2:을 찾다아치 포럼의 게시물이것은 매우 유사한 문제를 설명합니다. 그들의 해결책은 커널 4.18로 다운그레이드하는 것이었습니다. 나는 현재 이것을 실행 중이며 4.18.0-25-generic트릭을 수행하는 것 같습니다.

편집 2a:이제 4.18.0-25-generic나는 차이점을 발견했습니다. 출력은 grep . /sys/class/drm/*/status동일하게 유지되며 다시 연결할 때마다 숫자가 계속 변경됩니다.

grep . /sys/class/drm/*/status
/sys/class/drm/card0-DP-1/status:disconnected
/sys/class/drm/card0-DP-2/status:disconnected
/sys/class/drm/card0-DP-5/status:connected        # <--- DP-5!
/sys/class/drm/card0-DP-6/status:connected        # <--- DP-6!
/sys/class/drm/card0-DP-7/status:disconnected
/sys/class/drm/card0-eDP-1/status:connected
/sys/class/drm/card0-HDMI-A-1/status:disconnected
/sys/class/drm/card0-HDMI-A-2/status:disconnected
/sys/class/drm/card0-HDMI-A-3/status:disconnected

그러나 어떻게 든 다음 과 xrandr같은 안정적인 숫자를 "보는" :DP-1-1DP-1-2

xrandr -q | grep connected
eDP-1 connected 1920x1080+3839+0 (normal left inverted right x axis y axis) 344mm x 194mm
HDMI-1 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-2 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
HDMI-3 disconnected (normal left inverted right x axis y axis)
DP-1-1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 509mm x 286mm
DP-1-2 connected primary 1920x1080+1919+0 (normal left inverted right x axis y axis) 509mm x 286mm
DP-1-3 disconnected (normal left inverted right x axis y axis)

최신 커널에서 xrandr은 drm 열거와 동일한 숫자를 봅니다.

답변1

비슷한 문제가 발생했고 X.org와 /sys/class/drm 간의 포트 ID 변경과 관련된 문제가 있는 사람이 있을 경우를 대비해 이 게시물에 몇 가지 정보를 추가하는 것이 유용할 것이라고 생각했습니다.

우수한https://bbs.archlinux.org/viewtopic.php?id=244118Arch Linux 스레드에서 핵심 사항을 확인하세요.

xrandr이 적고 amdgpu가 더 많습니다.

이를 추가로 수정하려면 xrandr이 아니며 xrandr은 /var/log/Xorg.0.log 예제에서 볼 수 있듯이 Xorg 포트 ID를 사용자에게 노출합니다.

게다가 이 동작을 피하기 위해 커널을 다운그레이드하는 당시의 "솔루션"(4.18)은 실제 의미의 솔루션이 아니었고 결코 아니었습니다.

다음은 참고할 몇 가지 사항입니다.

  • 각 Xorg 드라이버는 다르게 동작합니다. 예를 들어 이 문제가 발생했을 때 누군가 DP-1이 amdgpu에 의해 DisplayPort-0으로 변경된 관련 amdgpu 코드를 파헤쳤습니다. 포트 ID가 내부적으로 처리되는 방식과 관련하여 각 Xorg 드라이버의 동작을 결정하려면 내가 액세스할 수 있는 것보다 더 많은 데이터가 필요합니다.

  • /sys/class/drm 포트에는 커널 모드 설정 기능이 있고 모드 설정이 활성화된 드라이버가 필요하다고 생각합니다. drm/kms에 대한 꽤 좋은 요약은 다음과 같습니다.http://trac.gateworks.com/wiki/linux/display 인용하자면:

DRM [Direct Render Manager]는 Freescale I.MX6 프로세서와 같은 비디오 드라이버와 통신하는 커널의 드라이버 하위 시스템입니다. DRM이 이러한 요청을 관리하므로 ioctl() 호출을 통해 여러 사용자 공간 프로그램이 주어진 시간에 디스플레이에 그릴 수 있습니다. DRM은 또한 GPU(그래픽 처리 장치)와 인터페이스하여 이러한 요청을 하드웨어 가속할 수도 있습니다.

DRM 드라이버는 DMA, AGP 메모리 관리, 리소스 잠금 및 보안 하드웨어 액세스를 처리합니다. 여러 개의 동시 3D 애플리케이션을 지원하려면 3D 그래픽 하드웨어를 공유 리소스로 취급해야 합니다. 상호 배제를 제공하려면 잠금이 필요합니다. DMA 전송 및 AGP 인터페이스는 그래픽 명령 버퍼를 하드웨어로 보내는 데 사용됩니다. 마지막으로 클라이언트가 그래픽 하드웨어를 사용하여 권한을 상승시키는 것을 방지하는 보안이 있어야 합니다.

커널 모드 설정(KMS)은 사용자 공간이 아닌 커널 공간에서 디스플레이 해상도, 픽셀 심도, 화면 새로 고침을 설정하는 방법입니다. 과거에는 X-Server가 사용자 공간에서 이 작업을 수행했습니다. 최신 비디오 드라이버(예: IMX6 GPU용 etnaviv 드라이버)는 KMS를 지원합니다. Linux 커널의 KMS 구현은 프레임 버퍼의 기본 해상도를 지원하고 즉각적인 콘솔(tty) 전환을 허용합니다. KMS는 또한 아티팩트를 줄이고 3D 성능을 향상시키는 데 도움이 되는 DRI2와 같은 새로운 기술을 지원합니다.

이 수준의 그래픽 스택은 이해하기 어렵지만 제가 본 바로는 /sys/class/drm의 포트는 /dev/sdX의 장치와 비슷하므로 매번 섞일 수 있습니다. 시작은 장치의 실제 상태가 아닌 감지 순서에 따라 달라집니다.

지금까지 Xorg 포트 ID를 /sys/class/drm ID에 직접 연결하는 방법을 찾았으나 아직까지는 그런 방법을 찾지 못했습니다. Xorg 디스플레이 드라이버에는 "고정" 포트 ID를 생성하는 방법이 있는 것처럼 보이지만 불행히도 이러한 ID에 상당히 무작위 변환을 적용하므로 관련 drm 포트 ID에 직접 연결하는 것이 훨씬 더 어렵습니다. 더 어렵다.

예를 들어 하나의 카드에 drm ID eDP-1 및 Xorg ID eDP가 있거나 drm HDMI-A-1 및 Xorg HDMI-0이 있을 수 있습니다. 특정 디스플레이 드라이버에 따라 다를 수 있다고 생각합니다. Xorg가 내부적으로 어떻게 작동하는지 모릅니다.

Wayland(KMS 지원 드라이버 필요)는 항상 동일한 ID를 표시하는 것처럼 보이지만 Xwayland 및 xrandr을 사용하는 경우 xrandr는 XWAYLAND0... 유형 포트 ID를 표시합니다. 아마도 이러한 ID가 실제로 정확히 일치하기 때문일 것입니다. 하드웨어는 Xwayland에서 온 것 같아요.

이러한 변경 사항에 대한 명확하고 모호하지 않은 문서를 찾는 것은 어렵습니다. 특히 Xorg 드라이버를 유지 관리하는 각 그룹은 본질적으로 원하는 대로 ID를 자유롭게 변경할 수 있기 때문입니다. 이러한 변경 사항의 가능한 전체 범위를 실제로 확인하려면 다양한 드라이버, 커널 및 하드웨어 설정의 더 많은 샘플이 필요합니다. 예를 들어 VGA-1은 일반적으로 VGA-1로 유지되지만 VGA0일 수도 있는데 이는 매우 무작위입니다.

가장 좋은 해결책은 /sys에서 물리적 포트 ID, 즉 실제 경로를 결정한 다음 Xorg에서 물리적 포트 경로를 결정한 다음 Xorg 및 커널 생성 ID를 무시하는 방법을 갖는 것이지만 알 수는 없습니다. 아직은 나오지 않았습니다.

나는 이러한 견해/가정 중 일부에 동의하지 않을 수 있습니다. 만약 그렇다면 이것이 실제로 어떻게 작동하는지 이해하려고 노력하고 있으므로 수정 사항이 있으면 감사하겠습니다.

nvidia 비자유 드라이버에 시스템이 연결되고 활성화된 모니터가 비활성화되었다고 생각하게 만드는 몇 가지 오랜 버그가 있다는 사실로 인해 상황이 더욱 복잡해지며, 이로 인해 원하지 않는 작업이 중단될 수 있습니다. 전혀 나타나지 않는 다른 drm 데이터 관련 nvidia 드라이버 오류가 있습니다.

이러한 nvidia 비자유 드라이버 오류의 예: https://forums.developer.nvidia.com/t/no-sys-class-drm-card0-entries-on-kernel-4-15/57855 https://forums.developer.nvidia.com/t/sys-class-drm-enabled-reports-disabled-for-enabled-monitors/51187

모니터가 모두 다른 경우 Xorg의 EDID 공급업체, 제품 ID(prod id) 및 일련 번호를 기반으로 Xorg에 특정 ID가 있는 모니터를 추론할 수 있습니다(그러나 모든 모니터에 일련 번호 데이터가 있는 것은 아닙니다). 그러나 포트 ID 및 모니터 정보의 Xorg 데이터를 pci 버스 또는 /sys/class/drm 정보에 완전히 안정적이고 명확한 방식으로 연결하는 방법을 찾을 수 없습니다. 이 작업을 수행할 수 있는 방법을 찾으면(사소하지 않을 수 있음) 이 게시물을 업데이트하겠습니다.

[업데이트] mic_e의 의견 덕분에 2009년경부터(xrandr 1.2 이상, 2007년경에 출시되었지만 2009년경 고정 풀에 출시됨) xrandr --prop / --property가 CONNECTOR_ID가 출력에 추가된다는 것을 알 수 있습니다. 긍정적인 일치를 위해 /sys/class/drm/*/connector_id와 일치합니다. 이는 DRM 드라이버/하드웨어에서만 작동하지만 요즘 대부분의 그래픽에 해당됩니다.

--prop는 EDID 데이터도 표시합니다. /sys에서 직접 가져올 수 있으므로 실제로는 중요하지 않습니다. xrandr은 어쨌든 또 다른 종속성이지만 필요한 경우 drm 및 xorg와 일치해야 합니다. 포트 ID .

전체 적용 범위를 원하고 많은 출력을 읽는 데 따른 오버헤드를 신경 쓰지 않는다면 --verbose가 항상 적용되며 도입 시 --prop가 트리거됩니다.

관련 정보