O que fazer para executar o aplicativo GUI Java no ambiente chrooted?

6

No meu caso, o aplicativo Java é o JDownloader. Eu preparei o ambiente chroot como explicado aqui:

link

e aqui:

link

e aqui:

link

Então, eu tenho java instalado, adicionado grupo e usuário, JDownload arquivos copiados, mas quando tento executá-lo (como usuário regular no chroot; Eu corro chroot como root, mas uma vez eu estou no chroot, eu mudo para chroot usuário regular):

java -Xmx512m -jar JDownloader.jar

Tenho algumas mensagens positivas, como o carregamento de skins pelo JDownloader

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

mas esse é o fim da história - o aplicativo não aparece. Não importa se eu uso o chroot para executar o ambiente chroot ou openroot, o resultado é o mesmo.

Quando executo o JDownload como root do chroot, recebo um pouco mais de saída, mas no final ocorre uma exceção:

10 4/6/11 2:39:23 PM - FINER [jd.config.DatabaseConnector()] -> 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)

Eu tenho o mesmo Jave instalado no sistema chroot e normal, eu posso rodar o mesmo JDownloader no sistema normal, sem problemas aqui.

PERGUNTA - o que estou perdendo aqui? Como executar o aplicativo GUI Java?

Obrigado antecipadamente.

    
por greenoldman 06.04.2011 / 14:43

3 respostas

9

Se você está tentando fazer com que qualquer aplicativo chrooted apareça no X11, você precisará de algumas coisas configuradas corretamente. Uma é uma variável de ambiente DISPLAY válida, a segunda é um arquivo Xauthority apropriado e o terceiro e mais importante acesso ao soquete usado pelo X11 / Xorg. O X11 pode usar um soquete de rede TCP ou um soquete do Domínio Unix. Um soquete TCP será mais fácil de usar a partir de um chroot, mas a maioria dos desktops modernos tem o TCP desativado com -nolisten tcp ou algo semelhante definido no servidor X. Os soquetes TCP iniciam na porta TCP 6000 para exibição: de 0 a 6063 para a última exibição. Enquanto os soquetes TCP estiverem ouvindo, você não precisará fazer mais nada com soquetes. Você ainda precisa se preocupar com DISPLAY e Xauthority. Sockets de domínio Unix requerem um pouco mais de trabalho e, pelo menos no Linux, residem em /tmp/.X11-unix/X? where? é um número de 0 a 63. Se o seu chroot residia no mesmo sistema de arquivos como /tmp , então você pode usar hard links, pelo menos no Linux. Links simbólicos não deixam um chroot. Substituir? com o número de exibição correto:

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 e chmod só precisam ser feitos uma vez, mas o arquivo de soquete precisará ser recriado com ln em cada sessão X. Se /tmp não estiver no mesmo sistema de arquivos, a vida é mais difícil e você precisará de algum tipo de hackery, como tornar /tmp/.X11-unix um link simbólico para o diretório correspondente sob o chroot. Em seguida, verifique se a variável de ambiente DISPLAY está configurada e corresponde ao que é usado pelo terminal e por outros aplicativos X11. Por fim, para copiar o .Xauthority , use xauth . Você precisa encontrar o cookie correspondente para sua sessão X11 e esse cookie será diferente para cada sessão. Use xauth list $DISPLAY para imprimir cookies para seu DISPLAY . O nome será parecido com host:? ou host/unix:? , em que host é o nome do host do computador e? é o número de exibição. O número de exibição pode ser recuperado com echo $DISPLAY e será o número após os dois pontos (:) e antes de qualquer ponto (.) Para copiar sobre o Xauthority, use algo assim:

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

O segundo comando lista simples as entradas copiadas. Se você precisar copiar usando sudo ou outro comando para alterar usuários, tente algo assim:

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

Se o local em que você colocar o arquivo .Xauthority não for o diretório inicial do usuário do chrooted, será necessário definir a variável de ambiente XAUTHORITY :

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

Como você provavelmente pode dizer, não é típico executar um aplicativo GUI em um chroot.

    
por 06.04.2011 / 19:05
3

Isso funcionou para mim em um ArchLinux chrooting em um Debian. No host:

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

Agora no ambiente chroot:

# xauth add latitude/unix:0 MIT-MAGIC-COOKIE-1 d4474d13c
# xcalc # works!
    
por 08.09.2012 / 21:53
1

Eu não acho que há algo que você precise fazer especificamente para aplicativos Java, mas você precisa fazer algo para aplicativos GUI em geral.

Eu fiz isso no meu computador em casa, mas não estou em casa agora, então fique comigo. Eu tenho um script que monta tudo no meu chroot como /dev e /proc , mas também copia ~/.X* também. Se bem me lembro, na sua pasta pessoal existem arquivos que começam com .Xauth e você copia esses arquivos para a pasta inicial do seu ambiente chroot. Na minha experiência, esses arquivos precisam ser copiados toda vez que o X for reiniciado.

O que eu faria para testar esse método seria simplesmente executar um aplicativo X simples como xterm . Foi apenas um aplicativo rápido e simples que eu poderia testar. xterm deve fornecer uma mensagem de erro se não puder se conectar ao servidor X.

Por acaso tenho o pacote X11 completo instalado no meu chroot, mas não sei o suficiente sobre o X para saber se os aplicativos de chroot são executados em um servidor X chroot ou no servidor X host.

    
por 06.04.2011 / 17:11