我有一个Ubuntu服务器VM( myapp01
),并在那里部署了一个Java应用程序。 该应用程序已经行动不起来,我想与JVisualVMconfiguration文件。 要做到这一点,我需要在我的Windows 7主机上安装X-Windows,然后让Ubuntu虚拟机将其X11连接导出到我的主机,当我告诉它在VM上运行JVisualVM时。
所以我开始在这里下载XMing:
http://sourceforge.net/projects/xming/files/Xming/6.9.0.31/Xming-6-9-0-31-setup.exe/download
我使用了所有默认/推荐的安装选项,包括使用普通的PuTTy会话,并允许公共和专用networking访问。 安装XMing之后,我启动了它并validation它在我的Windows主机上运行。 然后,我打开Cygwin和SSH到Ubuntu服务器:
$ ssh myuser@myapp01 myuser@myapp01's password: Welcome to Ubuntu 12.04.4 LTS (GNU/Linux 3.5.0-23-generic x86_64) * Documentation: https://help.ubuntu.com/ System information as of Tue Jun 10 21:26:15 EDT 2014 System load: 0.0 Processes: 82 Usage of /: 22.5% of 11.81GB Users logged in: 0 Memory usage: 30% IP address for eth0: 10.10.41.108 Swap usage: 0% Graph this data and manage this system at: https://landscape.canonical.com/ 38 packages can be updated. 30 updates are security updates. Last login: Tue Jun 10 15:03:35 2014 from 10.10.101.96
然后我将显示导出到似乎是我主机的IP:
myuser@myapp01:~$ export DISPLAY=10.10.101.96
然后我尝试运行JVisualVM:
myuser@myapp01:~$ cd $JAVA_HOME myuser@myapp01:/usr/lib/jvm/java-7-oracle-amd64$ ls bin COPYRIGHT db include jre lib LICENSE man README.html release src.zip THIRDPARTYLICENSEREADME-JAVAFX.txt THIRDPARTYLICENSEREADME.txt myuser@myapp01:/usr/lib/jvm/java-7-oracle-amd64$ cd bin/ myuser@myapp01:/usr/lib/jvm/java-7-oracle-amd64/bin$ ./jvisualvm Error: Can't connect to X11 window server using '10.10.101.96' as the value of the DISPLAY variable. See the /home/myuser/.visualvm/7u14/var/log/messages.log for details. myuser@myapp01:/usr/lib/jvm/java-7-oracle-amd64/bin$ vim /home/myuser/.visualvm/7u14/var/log/messages.log
里面/home/myuser/.visualvm/7u14/var/log/messages.log
:
java.lang.InternalError: Can't connect to X11 window server using '10.10.101.96' as the value of the DISPLAY variable. at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method) at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65) at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:110) at java.security.AccessController.doPrivileged(Native Method) at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:74) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:190) at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:102) at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:81) at org.netbeans.core.startup.Main.start(Main.java:200) at org.netbeans.core.startup.TopThreadGroup.run(TopThreadGroup.java:84) at java.lang.Thread.run(Thread.java:745)
想法? 我被骗了,这可能会影响任何东西吗? 我有XMingconfiguration错误吗? 我的export DISPLAY
命令是否错误?
出于安全考虑,X服务器通常不会接受来自其他主机的直接TCP连接。 否则,人们可以将键盘记录程序连接到X服务器,并且您的击键将不加密地通过网络传递,从而允许人们通过位于同一LAN上来记录密码。
但SSH提供了一种安全的方式来通过SSH会话转发X11流量,使用-X
或-Y
选项。
在你的Windows电脑上,通过尝试从命令行打开一个xterm
,确保$DISPLAY
设置正确。 $DISPLAY
可能会被设置为:0
代表localhost:0
。 还有一些额外的令牌,用于验证存储在~/.Xauthority
中的X服务器的连接,您可以使用xauth list
查看该连接。
现在运行ssh -Y 10.10.101.96
。 如果X11 forwarding request failed on channel 0
收到X11 forwarding request failed on channel 0
的消息,则运行ssh -v -Y 10.10.101.96
来获取调试消息。 如果远程机器是服务器,原因可能是未安装xauth
。 在CentOS上,它在xorg-x11-xauth
RPM中。
在远程机器上,如果一切顺利,远程机器上的$DISPLAY
现在将被设置为由SSH设置的代理显示器:
$ echo $DISPLAY localhost:10.0
此时,您可以在远程计算机上运行像xterm
这样的命令,并在本地显示器上弹出窗口。
尽管在远程机器上没有运行X服务器,但您可能仍然需要安装一堆用于Java的X11库,以便能够与本地X服务器通信。
如果在Windows主机上安装了JDK,则不需要通过XWindow和ssh从Unix主机使用JVisualVM。 这是一个非常正确的解决方案,但是如果你不习惯使用ssh和XWindow DISPLAY,而不是使用cygwin或XMing安装,那么可能会非常棘手。
在这个用例中最简单的解决方案是:
(有关jvisualvm和jstatd的更多参考文档,请参阅文档)
我已经解决了类似的问题。 在我的情况下,在/etc/hosts
文件中为运行sshd的服务器的主机名指定了错误的IP地址。
幸运的是,Java应用程序给了我更详细的输出,而其他应用程序只是失败, Failed to open display
信息Failed to open display
。