chroot 환경에서 GUI Java 애플리케이션을 실행하는 방법은 무엇입니까?

chroot 환경에서 GUI Java 애플리케이션을 실행하는 방법은 무엇입니까?

제 경우에는 Java 애플리케이션이 JDownloader입니다. chroot 환경은 다음과 같이 준비했습니다.

그래서 Java를 설치하고 그룹과 사용자를 추가하고 JDownload 파일을 복사했지만 실행하려고 할 때 (chroot에서 일반 사용자로 chroot를 루트로 실행하지만 일단 chroot에서 chroot 일반 사용자로 전환합니다) :

java -Xmx512m -jar JDownloader.jar

JDownloader를 통해 스킨을 로드하는 것과 같은 긍정적인 소식을 받고 있습니다.

10 4/6/11 2:15:17 PM - FINER [jd.JDClassLoader(<init>)] -> Look and Feel JAR loaded: /mnt/jd/libs/laf/syntheticaSilverMoon.jar

하지만 그게 이야기의 끝입니다. 앱이 나타나지 않았습니다. chroot를 사용하여 chroot 환경을 실행하든 openroot를 실행하든 결과는 동일합니다.

JDownload를 chroot-root로 실행하면 더 많은 출력을 얻지만 결국 예외가 발생합니다.

10 4/6/11 2:39:23 PM - FINER [jd.config.DatabaseConnector(<init>)] -> Loading database
10 4/6/11 2:39:23 PM - FINER [jd.config.DatabaseConnector(checkDatabaseHeader)] -> Checking database

10 4/6/11 2:39:23 PM - INFO [jd.Main(main)] -> init Splash

------------------------  Thread: 11  -----------------------

11 4/6/11 2:39:25 PM - INFO [jd.gui.swing.laf.LookAndFeelController(setUIManager)] -> Use Look & Feel: de.javasoft.plaf.synthetica.SyntheticaSimple2DLookAndFeel

11 4/6/11 2:39:25 PM - SEVERE [jd.controlling.JDLogger(exception)] -> SEVERE Exception occurred java.lang.reflect.InvocationTargetException

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

나는 chroot와 일반 시스템 모두에 동일한 Java를 설치했으며 여기서는 문제 없이 동일한 JDownloader를 실행할 수 있습니다.

내가 여기서 무엇을 놓치고 있는 걸까요? GUI Java 애플리케이션을 실행하는 방법은 무엇입니까?

답변1

루트가 변경된 응용 프로그램을 X11에 표시하려면 몇 가지 사항을 올바르게 설정해야 합니다. 첫 번째는 유효한 DISPLAY환경 변수이고, 두 번째는 올바른 Xauthority 파일이며, 세 번째이자 가장 중요한 것은 X11/Xorg에서 사용하는 소켓에 대한 액세스입니다. X11은 TCP 네트워크 소켓이나 Unix 도메인 소켓을 사용할 수 있습니다. chroot에서 TCP 소켓을 사용하는 것이 더 쉽지만 대부분의 최신 데스크탑에서는 -nolisten tcpX 서버의 유사한 설정을 통해 TCP가 꺼졌습니다. TCP 소켓은 TCP 포트 6000:0에서 시작하여 6063으로 끝나는 것으로 표시됩니다. TCP 소켓이 수신 대기하는 동안에는 소켓에서 다른 작업을 수행할 필요가 없습니다. 여전히 DISPLAY와 Xauthority에 대해 걱정해야 합니다. Unix 도메인 소켓은 적어도 Linux에서는 더 많은 작업이 필요합니다. /tmp/.X11-unix/X?소켓은 어디에 있습니까? 0부터 63까지의 숫자입니다. chroot가 동일한 파일 시스템에 있으면 /tmp적어도 Linux에서는 하드 링크를 사용할 수 있습니다. 심볼릭 링크는 chroot를 남기지 않습니다. 바꾸다? 올바른 디스플레이 번호 사용:

mkdir /path/to/chroot/tmp
chmod 1777 /path/to/chroot/tmp
mkdir /path/to/chroot/tmp/.X11-unix
chmod 1777 /path/to/chroot/tmp/.X11-unix
ln -f /tmp/.X11-unix/X? /path/to/chroot/tmp/.X11-unix/X?

mkdir이 작업은 chmod한 번만 수행하면 되지만 ln소켓 파일은 각 X 세션에서 다시 생성되어야 합니다. 동일한 파일 시스템이 아닌 경우 생활은 더 어렵고 chroot 아래의 해당 디렉토리에 대한 심볼릭 링크를 /tmp만드는 것과 같은 일종의 해킹 기술이 필요합니다 . 다음으로 환경 변수가 설정되어 있고 터미널 및 기타 X11 응용 프로그램에서 사용되는 변수와 일치하는지 /tmp/.X11-unix확인하세요 . DISPLAY마지막으로 를 복사하려면 .XauthorityX11 xauth세션에 일치하는 쿠키를 찾아야 하며 해당 쿠키는 세션마다 다릅니다. xauth list $DISPLAY쿠키를 인쇄하는 데 사용됩니다 DISPLAY. 이름은 다음과 같습니다 host:?. host/unix:?여기서 호스트는 컴퓨터의 호스트 이름이고 ?는 디스플레이 번호입니다. 디스플레이 번호는 다음 명령을 사용하여 검색할 수 있습니다 echo $DISPLAY. 이는 콜론(:) 뒤와 마침표(.) 앞의 숫자입니다. Xauthority를 ​​복사하려면 다음과 같이 사용하세요:

xauth extract /path/to/chroot/.Xauthority host/unix:1
xauth -f /path/to/chroot/.Xauthority list

두 번째 명령은 단순히 복사된 항목을 나열합니다. sudo 또는 다른 명령을 사용하여 사용자를 변경할 때 복사해야 하는 경우 다음을 시도하십시오.

xauth extract - host/unix:1 | sudo xauth -f /path/to/chroot/.Xauthority merge -

파일을 저장하는 위치가 .Xauthoritychroot 사용자의 홈 디렉터리가 아닌 경우 XAUTHORITY환경 변수를 설정해야 합니다.

export XAUTHORITY=/path/to/chroot/.Xauthority

아시다시피 chroot에서 GUI 응용 프로그램을 실행하는 것은 흔하지 않습니다.

답변2

환경 변수가 XAUTHORITY설정되어 있는지 확인하십시오(일반적으로 ~/.Xauthority). 그런 다음주인:

$ xauth list
latitude/unix:0  MIT-MAGIC-COOKIE-1  d4474d13c

지금chroot 환경:

# chroot some-debian
# xauth add latitude/unix:0 MIT-MAGIC-COOKIE-1 d4474d13c
# xcalc

답변3

Java 애플리케이션에 대해 특별히 수행할 작업은 없지만 일반적으로 GUI 애플리케이션에 대해서는 수행해야 할 작업이 있다고 생각합니다.

집에 있는 컴퓨터로 해봤는데 지금은 집에 없으니까 조금만 참아주세요. /dev/proc와 같은 모든 것을 내 chroot에 설치하는 스크립트가 있지만 ~/.X*. 내 기억이 맞다면 홈 폴더에 로 시작하는 파일이 있고 .Xauth이 파일을 chroot 환경의 홈 폴더에 복사하세요. 내 경험상 X를 다시 시작할 때마다 이러한 파일을 복사해야 합니다.

이 방법을 테스트하려면 간단한 X 애플리케이션을 실행하기만 하면 됩니다 xterm. 예를 들어 이것은 테스트할 수 있는 빠르고 간단한 애플리케이션입니다. xtermX 서버에 연결할 수 없으면 오류 메시지가 표시됩니다.

내 chroot에 전체 X11 패키지가 설치되어 있지만 chroot된 응용 프로그램이 chroot의 X 서버 또는 호스트 X 서버에서 실행되고 있는지 알 수 있을 만큼 X에 대해 충분히 알지 못합니다.

관련 정보