文章摘要
加载中...|
此内容根据文章生成,并经过人工审核,仅用于文章内容的解释与总结

最近浏览L站的时候看到国家超算互联网有超算试用,搞到了国产超算平台(基于海光 DCU 显卡与 DTK 深度学习底座)200卡时试用。为了在超算里炼丹,我折腾了很久。由于超算系统比较古老,且在日常开发连接中遇到了不少痛点。

我打算将这次踩坑经历整理成《玩转超算系列》。

这是第一篇,主要解决“如何优雅地连接超算,并搭建一套顺手的文件与代码编辑器环境”。

试用试用


1. Windows SSH 私钥权限过大警告

超算的登录认证采用的是私钥证书认证。由于我是在 Windows 10 本地机器上操作,在终端运行 ssh -i your_key.pem ... 时直接爆出了如下安全警告[1],并直接拒绝了我的连接请求:

WARNING

Bad permissions. Try removing permissions for user: NT AUTHORITY\Authenticated Users on file your_key.pem. WARNING: UNPROTECTED PRIVATE KEY FILE! Permissions for 'your_key.pem' are too open.

1.1 原因分析

Windows 新建或移动文件时,默认会继承父级目录的所有用户组权限(包括所有认证用户、系统组等),导致该文件是“所有人可读”的。而在 SSH 协议安全规范中,私钥必须是严格私有的(等价于 Linux 下的 chmod 600 权限),如果被判定为不够安全,SSH 客户端就会拒绝读取。

1.2 解决方法

我们无需去图形界面里繁琐地修改安全选项,直接在 Windows PowerShell 中通过 icacls 命令禁用该文件的继承属性,并仅保留当前登录用户的独占读取权限:

powershell
# 1. 物理禁用 your_key.pem 文件的权限继承属性
icacls "E:\.ssh\your_key.pem" /inheritance:r

# 2. 仅授予当前系统登录用户名读取(R)权限
icacls "E:\.ssh\your_key.pem" /grant:r "$($env:USERNAME):R"

执行完毕后,再次连接,SSH 握手便能瞬间顺畅通过。


2. VS Code Remote-SSH 失败与 glibc 版本死锁

测试ssh连接没有问题后,我本来打算用 VS Code 的 Remote-SSH 插件把超算的工作区挂载到本地进行代码编写,却发现连接一直卡在 Waiting for server log... 随后报错闪退,抛出 exitCode == 32

2.1 冲突根本原因

经过排查,最终我认为这是由于我本地电脑的 VS Code 客户端版本太新导致的。在连接时, VS Code 客户端会自动将对应版本编译的 VS Code Server 传到超算里运行。

然而,新版 VS Code Server 要求系统的 C 运行库 GLIBC >= 2.28。而超算的老系统(老当益壮的 CentOS 7)底层配套的核心运行库仅为 GLIBC 2.17,导致新版服务端程序在超算上一运行就当场暴毙。

特别注意:仅仅在本地 VS Code 里将 Remote-SSH 插件降级是没有任何效果的。因为 VS Code 的版本没有改变,它依然会要求在超算端运行与之版本对应的 Server。

2.2 妥协解决方法:换用轻量管理面板

降级本地 VS Code 因小失大。最痛快的解决办法是彻底抛弃 VS Code 笨重且挑剔的服务端,在网页端直接使用 KodExplorer 或者 Filebrowser 进行编辑与管理


3. Web 端管理面板的选择与痛点避坑

为了在超算里直观地管理生成的图片(双击预览、打包下载、编辑提示词文件等操作),我最初打算部署可道云。然而,在无 Root 权限且网络受限的超算环境(老旧的 CentOS 7)下,这条部署之路却因为各种限制充满了坎坷,并最终促使我转向了 Filebrowser:

3.1 放弃 KodBox 的原因

在折腾可道云的过程中,虽然最终克服了各种环境难题,但还是留下了无法忽视的痛点:

  1. PHP 版本不兼容:最新版的 KodBox 无法在系统自带的 PHP 5.4.16 环境下运行虽然官网说最低支持php5.3,会抛出 Fatal error 报错;如要升级 PHP 版本可以使用 static-php-cli 这个仓库,用 github action 构建适合自己的版本。 kodboxkodbox
  2. Session 丢失与登录死循环:即便强行拉起了 KodBox 服务,但由于其对 Cookie/Session 校验十分严格,在超算复杂的环境的限制下,登录后会瞬间被踢回登录页面,陷入重定向死循环。
  3. 内置 PHP 单线程服务器并发死锁:若尝试仅使用 PHP 内置的单线程服务器(php -S)拉起服务,登录验证的 POST 请求在写入 Session 文件加锁时,前端瞬间并发发起的多个 GET 请求(加载系统组件和页面配置)会与该文件锁冲突。由于单线程服务器无法并发处理,导致后续请求被直接挂起引发死锁,网页表现为登录后无限转圈卡死。

3.2 隐藏的“跨平台换行符”地雷:CRLF 格式污染

无论是使用老旧的 KodExplorer 还是现代的 Filebrowser,只要你在 Windows 客户端的网页端编辑器中直接编辑、保存或粘贴 Shell 脚本,都会不可避免地踩进一个隐蔽的“跨平台格式地雷”——换行符格式污染

3.2.1 Bug 成因

  • Windows 系统默认使用 \r\n (CRLF) 作为行尾换行符。
  • Linux 系统(超算环境)则只识别 \n (LF) 作为换行符。
  • 当你通过这些网页版管理工具的内置文本编辑器直接修改、编辑甚至仅仅是“复制-粘贴”一段代码保存时,浏览器或面板往往会自作聪明地以 Windows 的 \r\n 格式将脚本落盘保存。

3.2.2 灾难表现

当你在 Linux 终端执行这些被“污染”的 Shell 脚本时,会抛出极其诡异且令人摸不着头脑的报错:

  • bash: ./go.sh: /bin/bash^M: bad interpreter: No such file or directory (最经典的 ^M 报错,即 \r 字符被强行当作了命令的一部分)
  • syntax error near unexpected token (各种莫名的语法报错,其实是因为行尾多出来的不可见字符 \r 破坏了命令结构)

3.2.3 两种终极净化方案

为了防患于未然,我们有以下两种解决方法:

方案一:脚本头部“自我物理清洗”黑魔法(强力推荐)

在我们编写的每一个 .sh 脚本顶部(在 #!/bin/bash 之下),无脑塞入这样一行“自我净化”命令:

bash
sed -i 's/\r$//' "$0" 2>/dev/null

TIP

这行命令的原理极其巧妙:$0 代表当前正在执行的脚本文件。脚本启动的一瞬间,会用 sed 强行把自己文件内部的所有 Windows 回车符 \r 全部物理清洗抹除,确保后续代码的执行畅通无阻!

方案二:外部一键净化命令

如果你已经在超算上保存了脚本但无法运行,可以使用以下命令对目标脚本进行一键“脱盐除水”:

bash
sed -i 's/\r$//' filename.sh
# 或者使用 dos2unix 工具(超算计算节点通常未安装该命令)
dos2unix filename.sh

结论:这些限制使得可道云系列在网络受限且需要依赖 SSH 端口转发的超算内网中非常脆弱。我们需要一个无外部运行环境依赖、单文件、无 Session 状态丢失隐患,且足够轻量的现代化网盘管理——Filebrowser。


4. 部署方案一:轻量单文件 Filebrowser(终极推荐)

Filebrowser 是一个用 Go 语言编写的单文件轻量级文件管理器。它将所有配置和用户数据保存在一个独立的 SQLite 数据库文件中,具有以下压倒性优势:

  • 零依赖:不需要 PHP、不需要 Nginx,更不需要配置 php-fpm。
  • 极速部署:仅需一个可执行二进制文件即可直接运行。
  • 稳定可靠:对 SSH 端口转发极度友好,完美避开 Cookie 状态丢失引起的登录死循环问题。

4.1 部署 Filebrowser 步骤

所有的部署和脚本都放在 ~/sd_automation 工作目录下:

bash
# 创建并进入工作目录
mkdir -p ~/sd_automation
cd ~/sd_automation

4.1.1 下载与解压

在超算环境直接拉取 GitHub 资源通常会超时,可以自行添加代理下载:

bash
# 1. 下载 Filebrowser (这里以 v2.63.14 为例)
curl -L "https://github.com/filebrowser/filebrowser/releases/download/v2.63.14/linux-amd64-filebrowser.tar.gz" -o filebrowser.tar.gz

# 2. 解压出核心二进制单文件并赋予执行权限
tar -zxvf filebrowser.tar.gz filebrowser
chmod +x filebrowser
rm -f filebrowser.tar.gz

4.1.2 初始化数据库与用户

Filebrowser 使用 SQLite 数据库存储配置。我们需要显式初始化数据库并创建管理员用户:

bash
# 1. 初始化数据库文件
./filebrowser config init -d ./filebrowser.db

# 2. 添加管理员用户 (密码自定义,例如 1234567891012)
./filebrowser users add admin 1234567891012 --perm.admin -d ./filebrowser.db

# 3. 配置运行参数:绑定 0.0.0.0 端口 19993,设置工作目录为当前目录
./filebrowser config set -a 0.0.0.0 -p 19993 -r ./ -d ./filebrowser.db

4.2 前台测试启动

bash
./filebrowser -d ./filebrowser.db

5. 部署方案二:经典资源管理器 KodExplorer(老旧系统备选)

虽然我们在 3.1 节放弃了 KodBox,但是其前身 KodExplorer (可道云 v4.x 经典版) 依然是老旧系统的绝佳伴侣。它完美兼容 PHP 5.4.16 环境,只要我们解决其对部分 PHP 扩展的依赖和换行符问题,它在 CentOS 7 系统上依然十分顺滑:

5.1 极简兼容与网络突围:使用 Gitee 源码极速克隆

在网络受限的超算环境里,直接去官网下载 Zip 压缩包极易因为大墙拦截导致 403 或 308 强制跳转。我们可以直接通过国内 Gitee(码云)官方开源仓库进行极速克隆:

bash
# 1. 确保回到你的自动化工作区
cd ~/sd_automation

# 2. 彻底清理之前折腾碎的残留文件,没有下载不用清理
rm -rf explorer kodexplorer.zip kodexplorer4.54.zip

# 3. 直接用 git 把 Gitee 官方仓库的纯净源码克隆下来,文件夹直接命名为 explorer
git clone https://gitee.com/kalcaddle/KODExplorer.git explorer

# 4. 进到源码目录,并赋予必要的读写权限
cd explorer
chmod -R 777 ./*

5.2 终极避坑:免 Root 手动解包并强挂 mbstring.so 扩展

在解压并用超算自带的 PHP 启动后,网页在初始化配置页面会弹出一个致命红字警告:php 库缺失 mb_string

  • 为何 mb_string 如此致命mbstring(多字节字符串)扩展用于处理中文字符、提示词中的双字节字符及中文文件名等。若缺失该扩展,进入系统会发生大面积空白报错,且无法正常读写、编辑包含中文的配置文件。
  • 无 Root 解密手段 (物理提取扩展包): 虽然我们没有管理员权限去执行 yum install php-mbstring,但我们可以直接用 yumdownloader 抓取 RPM 扩展包,并在用户沙盒中物理破包提取:
bash
# 在刚刚部署可道云的 explorer 目录中运行

# 1. 免 root 下载 CentOS 7 官方对应 PHP 5.4 的 mbstring 安装包
yumdownloader php-mbstring

# 2. 原地对 rpm 包进行解包 (这会生成一个 usr 文件夹)
rpm2cpio php-mbstring-*.rpm | cpio -idmv

# 3. 将解包出来的 mbstring.so 核心驱动直接拷贝到当前目录下
cp usr/lib64/php/modules/mbstring.so ./

# 4. 删除无用的解包目录与临时 rpm 安装包,保持环境整洁
rm -rf usr php-mbstring-*.rpm

5.3 启动 PHP 服务并后台常驻

5.3.1 临时前台测试启动

bash
php -d extension=./mbstring.so -S 0.0.0.0:19993

5.3.2 工业级后台常驻配置 service.sh

如果直接在前台运行服务,一旦 SSH 终端关闭程序就会退出。我们在 ~/sd_automation/explorer 目录下新建一个管理脚本 service.sh,利用 nohup 让其在超算后台不挂断地常驻运行:

bash
#!/bin/bash

# ========================================================
# 可道云 PHP 5.4 + mbstring 一键后台守护外挂
# ========================================================

# 确保脚本自我净化,防止被 Windows 下的换行符格式污染
# (此行用于防止在 Windows 下直接保存后在 Linux 下报错)
sed -i 's/\r$//' "$0" 2>/dev/null

cd "$(dirname "$0")"

PID_FILE="php_server.pid"
LOG_FILE="php_server.log"
PORT=19993

case "$1" in
    start)
        # 1. 检查是否已经启动
        if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then
            echo "🟢 PHP 服务已经在后台运行 (PID: $(cat "$PID_FILE"))。"
            exit 0
        fi

        echo "🚀 正在将 PHP + mbstring 送往后台常驻..."

        # 2. 核心大招:使用 nohup 强挂 mbstring 并扔进后台,日志全部重定向
        nohup php -d extension=./mbstring.so -S 0.0.0.0:$PORT > "$LOG_FILE" 2>&1 &

        # 3. 瞬间抓取后台进程的 PID 并存档
        echo $! > "$PID_FILE"

        sleep 1
        if kill -0 $(cat "$PID_FILE") 2>/dev/null; then
            echo "🎉 后台起飞成功!PID: $(cat "$PID_FILE")"
            echo "🌐 映射端口: $PORT | 日志文件: $LOG_FILE"
        else
            echo "❌ 起飞失败!请查看 $LOG_FILE 寻找原因。"
        fi
        ;;

    stop)
        if [ -f "$PID_FILE" ]; then
            PID=$(cat "$PID_FILE")
            echo "🛑 正在停止后台 PHP 进程 (PID: $PID)..."
            kill $PID 2>/dev/null
            rm -f "$PID_FILE"
            echo "✨ 后台服务已安全停止。"
        else
            # 备用硬核清理
            PIDS=$(ps -ef | grep "php -d extension=./mbstring.so" | grep -v grep | awk '{print $2}')
            if [ -n "$PIDS" ]; then
                kill -9 $PIDS 2>/dev/null
                echo "✨ 已清理孤儿 PHP 进程。"
            else
                echo "⚠️ 未发现正在运行的后台进程。"
            fi
        fi
        ;;

    status)
        if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then
            echo "🟢 服务运行中,PID: $(cat "$PID_FILE"),端口: $PORT"
        else
            echo "🔴 服务已停止。"
        fi
        ;;

    *)
        echo "使用方法: $0 {start|stop|status}"
        exit 1
        ;;
esac

同样,给脚本赋予权限并后台常驻:

bash
chmod +x service.sh
./service.sh start

6. 网络突围:本地 ProxyJump 隧道一键穿透

由于超算网关有负载均衡,我们需要锁定具体的登录节点(例如 login04)进行二阶跳板转发。因为正常人同一时间只会使用其中一个管理面板,我们可以让 Filebrowser 与 KodExplorer 共用同一个 19993 端口。这样在本地仅需维护一个最简的 SSH 隧道配置,即可一键穿透当前正在运行的那个面板。

6.1 本地 ~/.ssh/config 配置文件条目

在本地 Windows 电脑的 ~/.ssh/config 配置文件中添加如下条目(只需配置一次):

ssh-config
# 0. 全局防断连保持心跳设置 (解决超算主动掐断无传输管道的问题)
Host *
    ServerAliveInterval 30
    ServerAliveCountMax 3

# 1. 外部大门网关 (跳板机)
Host sc-kunshan
    HostName cancon.hpccube.com
    Port your_port
    User your_username
    IdentityFile "E:\.ssh\your_key.pem"

# 2. 精准穿透至 login04 运行节点 (转发网页端管理面板端口)
Host kunshan-tunnel
    HostName login04
    User your_username
    IdentityFile "E:\.ssh\your_key.pem"
    ProxyJump sc-kunshan
    LocalForward 19993 127.0.0.1:19993  # 网页端管理面板端口

6.2 启动穿透连接

在本地命令行终端执行以下一键穿透命令(该命令会保持挂起状态以维持隧道):

bash
ssh -N kunshan-tunnel

此时,保持终端运行,在浏览器中即可访问:

  • 网页端管理面板:访问 http://127.0.0.1:19993

下一篇,我们将进入超算核心,详解 计算节点与登录节点的划分,以及国产海光 DCU 算力底座的环境初始化


  1. Windows SSH 私钥报错处理可查阅 Microsoft OpenSSH 说明手册。 ↩︎

评论 隐私政策