제 경우에는 Java 애플리케이션이 JDownloader입니다. chroot 환경은 다음과 같이 준비했습니다.
http://www.0x61.com/forum/post5240333.html#p5240333(깨진 링크)- Linux의 chroot에서 java를 실행하는 중에 오류가 발생했습니다., 그리고
- 루트 디렉토리(estel.org에서)
그래서 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 tcp
X 서버의 유사한 설정을 통해 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
마지막으로 를 복사하려면 .Xauthority
X11 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 -
파일을 저장하는 위치가 .Xauthority
chroot 사용자의 홈 디렉터리가 아닌 경우 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
. 예를 들어 이것은 테스트할 수 있는 빠르고 간단한 애플리케이션입니다. xterm
X 서버에 연결할 수 없으면 오류 메시지가 표시됩니다.
내 chroot에 전체 X11 패키지가 설치되어 있지만 chroot된 응용 프로그램이 chroot의 X 서버 또는 호스트 X 서버에서 실행되고 있는지 알 수 있을 만큼 X에 대해 충분히 알지 못합니다.