X11找不到DISPLAY排查之ss -lntp | grep 6000可能没有打开tcp监听

这是一个非常典型的现象。你的 `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`,就是防火墙拦截。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值