2인용 컴퓨터를 설치했습니다. 컴퓨터의 온보드 그래픽 카드(intel)를 사용하여 하나의 X11 서버를 시작하고 전용 그래픽 카드(nvidia)를 사용하여 다른 X11 서버를 시작했습니다. OpenGL을 제외한 모든 것이 잘 작동합니다. 현재 nvidia 및 intel OpenGL 패키지에 대한 /lib의 파일 충돌로 인해 nvidia-seat에만 OpenGL이 있습니다.
한 사용자가 다른 경로의 라이브러리를 사용하도록 강제하는 방법이 있습니까?
내가 찾은 모든 일반/lib는 전체 시스템(ldconfig)에 영향을 미칩니다. FUSE도 고려해봤지만 일반적인 보안 및 성능 문제가 걱정됩니다. chroot는 모든 파일을 두 배로 늘려 유지 관리할 필요가 없는 경우에만 작동합니다. Unionfs가 사용자 종속 재정의를 허용한다면 올바른 것처럼 보이지만 나는 Unionfs를 망친 적이 없으며 그것이 가능하다고 제안하는 것을 아무것도 찾지 못했습니다.
답변1
프로그램이 동적으로 링크되어 있다면 각 세션에 대해 LD_LIBRARY_PATH를 정의하여 Intel 및 Nvidia 공유 라이브러리가 있는 다른 디렉터리를 가리키도록 정의하고 시스템 기본 라이브러리만 /lib에 저장하면 됩니다.
답변2
다음 시도는 동일한 Xorg 파일 트리를 포함하는 두 개의 별도 chroot 파일 트리를 사용하여 두 개의 서로 다른 Xorg 서버를 실행하고 사용자 공간에서 LD_LIBRARY_PATH를 계속 사용하는 것이었습니다.
Xorg를 실행하려면 모든 Xorg 관련 라이브러리와 프로그램을 chroot에 넣어야 합니다. 이는 debian chroot와 같은 자동화된 도구를 사용하거나 수동으로 수행할 수 있습니다. 다음은 이 작업을 수동으로 수행하는 방법에 대한 간단한 입문서입니다(실제로 얼마 전 musl 시스템에서는 꽤 잘 작동했습니다).
- /X11/nvidia(및 /X11/intel)와 같은 별도의 chroot 디렉토리를 만듭니다.
- 이전 시스템의 레이아웃을 반영하여 X11 바이너리와 라이브러리를 여기에 넣습니다(예: Xorg를 /X11/nvidia/usr/bin에 넣고 libX*.so*를 /X11/nvidia/usr/lib에 넣고 Core 라이브러리를 /lib를 /X11/nvidia/lib로 - 일반적으로 버전 번호가 앞에 붙으므로 어떤 버전인지 쉽게 찾을 수 있습니다.
- X 서버가 의존하는 디렉토리인 /usr/lib/X11 또는 /usr/lib/xorg를 잊지 마십시오. 여기에는 다양한 장치를 위한 모듈과 드라이버가 포함되어 있으며 물론 nvidia/intel 드라이버 섹션도 포함되어 있습니다.
- /X11/nvidia/bin/sh 및 /X11/nvidia/sbin/modprobe와 같은 항목이 필요할 수 있습니다. 필요한 디렉토리를 생성하고 호스트 시스템의 바이너리를 여기에 배치합니다.
- /X11/nvidia/tmp, /X11/nvidia/var/lib/xkb 및 /X11/nvidia/var/log도 필요합니다.
- 이 시점에서 /X11/nvidia를 /X11/intel로 복사할 수 있습니다.
- 적절한 위치에서 libglx.so 파일과 기타 드라이버 부분을 찾아 복사하십시오.
- /X11/nvidia/dev 및 /X11/intel/dev(이전에 생성된 디렉터리) 각각에 /dev 마운트를 바인딩하거나 나중에 strace 도구를 사용하여 각 장치가 장치 노드를 복사하려고 시도하는 데 필요한 것이 정확히 무엇인지 모니터링할 수 있습니다.
- 또한 바인드 마운트는 /proc 및 /sys입니다.
- /etc/X11에 X11 구성이 있는 경우 각 장치의 각 구성을 각 chroot /etc 디렉토리에 복사합니다.
이 시점에서 chroot된 X11 서버가 준비되어야 합니다. 그러나 많은 배포판 관련 항목은 다른 최신 종속성을 부과하기 때문에 이를 깨뜨릴 수 있습니다(다른 데몬을 chroot에 복사하고 시작해야 할 수도 있음).
클라이언트 구성: 클라이언트가 다른 드라이버 라이브러리를 가리키도록 하려면 LD_LIBRARY_PATH를 사용하세요. 클라이언트를 chroot에 넣을 수도 있지만(파일 트리 레이아웃을 많이 변경할 필요도 없음) 결국 시스템을 두 번 미러링하게 될 수도 있습니다.
X11 소켓이 손실되더라도 클라이언트는 정상적으로 연결되어야 합니다. 이는 strace 출력에서 볼 수 있는 기존 소켓을 요구하지 않고 connect()를 호출할 때 X 서버에 의해 등록된 추상 이름을 사용하기 때문입니다. 그러나 시스템에 기존 소켓이 필요한 경우에는 mount /tmp를 바인딩해야 합니다.
대안으로 Xorg 서버를 추적하고 로드할 잘못된 라이브러리를 찾고 LD_PRELOAD 및 LD_LIBRARY_PATH를 사용하여 올바른 위치를 가리키도록 열심히 노력해야 합니다. 스트레스일해야 해루트로(sudo -i를 수행했거나 루트로 로그인한 경우) 그렇지 않은 경우 이는 확실히 버그입니다.