这是一个非常典型的现象。你的 `xauth list` 显示两边的 Cookie **已经完全一致**(都是 `53f9...bcf0`),这意味着**身份验证(Authentication)已经通过了**。
既然身份验证没问题,报错 `Error: Can't open display: master:0` 就只剩下**网络连接(Connectivity)**的问题。
最核心的原因通常是:**Master 节点的 X Server 默认没有开启 TCP 监听,或者防火墙挡住了端口 6000。**
请按照以下步骤排查和解决:
### 1. 根本原因排查:Master 是否在监听?
现代 Linux 发行版出于安全考虑,默认启动 X Server 时会带上 `-nolisten tcp` 参数,这意味着它只接受本机内部通信,**完全拒绝**来自网络的 TCP 连接(哪怕是来自 compute1)。
**验证方法:**
在 **Master** 节点上执行:
```bash
netstat -nolp | grep 6000
```
或者
```bash
ss -ltnp | grep 6000
```
* **如果什么都没输出**:说明 Master 压根没开门。Compute1 喊破喉咙也没用。这是最可能的原因。
* **如果输出含有 `127.0.0.1:6000`**:说明只听本地的,也不行。
* **只有输出 `0.0.0.0:6000` 或 `:::6000`**:才说明允许远程连接。
### 解决方法 A:开启 Master 的 TCP 监听(需要 root 权限,较麻烦但彻底)
如果你是管理员,你需要修改 GDM 或 LightDM 的配置。以 GDM(CentOS 7/8/RHEL 默认)为例:
1. 编辑 `/etc/gdm/custom.conf`。
2. 在 `[security]` 下添加 `DisallowTCP=false`。
3. 在 `[xdmcp]` 下添加 `Enable=true`(可选)。
4. 重启图形界面:`sudo systemctl restart gdm`。
5. 再次执行 `netstat -nolp | grep 6000` 确认端口开了。
### 解决方法 B:使用 SSH 反向隧道(最推荐,不需要 root 权限)
既然直接连 `master:0` 连不上,我们可以利用 SSH 建立一个“管道”。这个方法不需要 Master 开启 6000 端口,只需要 SSH 能通。
修改你的 `bsub` 指令,利用 SSH 进行 X11 转发。
**尝试这个指令:**
```bash
bsub -Is -XF /bin/bash
```
进入后直接运行 `xclock`。如果 LSF 配置得当,这是最简单的。
**如果 `-XF` 不可用,用手动隧道:**
这是一个比较 Hack 的技巧,原理是:让 Compute1 通过 SSH 回连 Master,把 Compute1 的显示数据塞进 SSH 隧道传回 Master。
1. **在 Master 上**,确认你能 SSH 到 compute1 且不需要密码(或者能输入密码)。
2. **提交任务**:
```bash
# 这一步不是为了运行程序,而是为了建立隧道
bsub -Is /bin/bash
```
3. **在 Compute1 的 shell 中**(任务启动后):
运行这个命令回连 Master 并在 Master 上开个“反向代理”:
```bash
# 假设 Master IP 是 192.168.1.10
# 注意:-R 6010:localhost:6000 意思是把 Compute1 的 6010 端口流量转发给 Master 的 6000
# 但是,我们是在 Master 上直接显示,所以通常应该反过来,或者直接利用 SSH 的 -X
# 最简单的方法:在 Compute1 上 SSH 回 Master 并带上 -X,实际上是在 Master 上运行显示,
# 但你的程序必须在 Compute1 上跑。
```
**修正的思路(在 Compute1 上跑程序,显示回 Master):**
不需要那么复杂,既然你这一步卡住了,建议直接检查防火墙。
### 解决方法 C:防火墙检查(如果不允许重启 X Server)
如果刚才 `netstat` 显示 Master 确实监听了 6000 端口,那么就是防火墙的问题。
在 **Master** 上:
```bash
sudo firewall-cmd --add-port=6000/tcp --temporary
```
也就是允许 6000 端口入站。
### 总结建议
既然 `xauth list` 里的 key 是一样的,你现在的状态是:**钥匙(Key)是对的,但是门(Port 6000)是焊死的。**
1. 先运行 `netstat -nolp | grep 6000` (在 Master 上)。
2. 如果没结果,说明是 X Server 配置问题(通常默认关闭)。
* **能改配置吗?** 能 -> 改 `/etc/gdm/custom.conf`开启 TCP。
* **不能改吗?** 不能 -> 放弃 `export DISPLAY=master:0` 这种直连方式,改用 **SSH X11 Forwarding**。
**终极测试指令(测试网络连通性):**
在 Master 上提交这个作业,看看 Compute1 能不能摸到 Master 的端口:
```bash
bsub -Is "timeout 5 nc -v -z master 6000; bash"
```
如果输出 `Connection refused`,就是没开监听;如果 `Connection timed out`,就是防火墙拦截。
5万+

被折叠的 条评论
为什么被折叠?



