HPC 3.1: Configurar SSH FS en VS Code

Esta guía te ayuda a la configuracion del clúster Helix (nodo de login cicima-hpc) mediante la extensión SSH FS de visual code.


¿Por qué SSH FS y no Remote-SSH?

VS Code tiene dos formas de trabajar remoto:

SSH FS (recomendado en Helix)Remote-SSH (no recomendado)
Dónde corre VS CodeEn tu máquina localInstala un servidor completo en el HPC
Uso de disco en el HPC~0 (solo lee archivos por SFTP)300 MB – 1 GB por usuario en $HOME
Proceso corriendo en el nodo de loginNingunoUn node residente mientras estés conectado
Terminal integradaLocalRemota

Los administradores de Helix piden usar SSH FS para no llenar el $HOME compartido con carpetas .vscode-server que crecen sin control. Esta guía sigue esa recomendación.


Prerrequisitos

Antes de empezar debes tener:

  • VS Code instalado.
  • Cuenta activa en el clúster Helix.
  • Una llave SSH generada (típicamente en ~/.ssh/una_tavo_ed25519 o similar).
  • La llave pública ya cargada en el servidor (ssh-copy-id o pegada en ~/.ssh/authorized_keys del HPC).
  • Preferiblemente keychain instalado y configurado para no tipear passphrase en cada conexión.

Paso 1 — Verificar que SSH funciona desde terminal

Antes de configurar VS Code, confirma que puedes entrar al clúster desde la línea de comandos. Si esto no funciona, tampoco va a funcionar en VS Code.

Abre una terminal y ejecuta:

bash

ssh hpc

Si tienes el alias configurado en ~/.ssh/config, esto debería entrar directo sin pedir contraseña.

Si no tienes el alias, prueba con usuario + IP directo:

ssh gustavo.matamoros.gonzalez@10.10.132.5

Paso 2 — Configurar ~/.ssh/config con un alias corto

Para no repetir usuario + host + llave en cada comando, define un alias en tu configuración SSH local.

Abre (o crea) el archivo:

nano ~/.ssh/config

Agrega el siguiente bloque:

Ajusta:

  • La IP en HostName (ssh hpc «hostname -I»)
  • Tu usuario en User.
  • El path de tu llave privada en IdentityFile.
Host hpc
    HostName 10.10.132.5
    User gustavo.matamoros.gonzalez
    IdentityFile ~/.ssh/una_tavo_ed25519
    IdentitiesOnly yes
    ServerAliveInterval 60
    ServerAliveCountMax 3

Importante — mantén el nombre cicima-hpc. Los archivos tasks.json que crearemos después referencian ese nombre exacto. Si le pones otro, tendrás que cambiarlo en cada tarea.

Ajusta los permisos:

chmod 600 ~/.ssh/config

Prueba con el alias:

ssh hpc

Si entra directo, estás listo para instalar la extensión.


Paso 3 — Instalar la extensión SSH FS

  1. Abre VS Code.
  2. Pulsa Ctrl+Shift+X para abrir el panel de extensiones.
  3. En el buscador, escribe: SSH FS
  4. Instala la que dice «SSH FS» de Kelvin Schoofs (ID: Kelvin.vscode-sshfs).
  5. Espera a que termine la instalación. No necesitas reiniciar VS Code.

Al instalar, aparece un ícono nuevo en la barra lateral izquierda: parece un servidor con un enchufe. Ese es el panel de SSH FS.

Paso 4 — Crear la configuración de conexión en SSH FS

  1. Click en el ícono de SSH FS en la barra lateral izquierda. Si no lo ves, presiona Ctrl+Shift+P y busca «SSH FS: Focus on Configurations View».
  1. Verás una sección CONFIGURATIONS con un botón + (Add configuration). Click en el +.

  1. Se abre un editor con el nombre de la configuración.
    1. Name: hpc (⚠️ Importante: este nombre lo usarán después las tareas del tasks.json. lige uno corto y recuérdalo. En esta guía usamos hpc. Solo permite: minúsculas, números, _.+-.)
    2. Location «Global settings.json» (para que la config esté disponible en cualquier ventana de VS Code).

4.2 — Editar los detalles de la conexión

Al guardar, se abre un formulario grande con muchos campos. Rellena los siguientes:

Sección superior:

  • Name: hpc
  • Label: HPC Helix
  • Group, Merge, Extend, PuTTY: déjalos vacíos/default.
  • Host: 10.10.132.5 (⚠️ NO pongas aquí el alias hpc. SSH FS no siempre resuelve alias del ~/.ssh/config como bash lo hace. Si pones hpc, obtienes error getaddrinfo ENOTFOUND hpc. Usa el hostname o IP real.)

  • Private key (Path): ~/.ssh/una_tavo_ed25519

  • Agent: si usas keychain o ssh-agent, activa esta casilla y puedes dejar el private key vacío.

  • Root

Paso 5 — Conectar al servidor

Hay dos formas equivalentes:

Forma 1 — Desde el panel de SSH FS:

  1. Click derecho sobre hpc en la lista.
  2. Elige «Add as Workspace folder».

Forma 2 — Con la paleta de comandos:

  1. Ctrl+Shift+P → escribe: SSH FS: Add as Workspace folder
  2. Elige cicima-hpc de la lista.

VS Code te va a preguntar si confías en el workspace. Elige «Yes, I trust the authors».

En unos segundos deberías ver tu carpeta home del HPC aparecer en el explorador de VS Code, como si fuera una carpeta local. Puedes navegar, abrir archivos, editar, guardar, y todo va directo al servidor por SFTP.

Verificación rápida:

  • Abre cualquier archivo del HPC.
  • Cambia una línea, guarda (Ctrl+S).
  • Vuelve a abrirlo desde una terminal SSH (cat archivo) y confirma que el cambio se guardó.

Paso 6 — Crear la configuración .vscode/ con las tareas

Para poder compilar y ejecutar código remotamente sin salir de VS Code, creamos dos archivos de configuración dentro de una carpeta .vscode en la raíz del workspace remoto.

6.1 — Crear la carpeta

En el explorador de VS Code:

  1. Click derecho sobre la raíz del workspace remoto.
  2. Elige «New Folder» → nombre: .vscode

6.2 — Crear c_cpp_properties.json

Este archivo le dice a IntelliSense dónde encontrar los compiladores y headers de MPI en el clúster.

Dentro de .vscode/, crea un archivo llamado c_cpp_properties.json con este contenido:

{
    "configurations": [
        {
            "name": "HPC OpenMPI",
            "compilerPath": "/opt/openmpi/4.0.4_gnu/bin/mpicxx",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

6.3 — Crear tasks.json

Este archivo define las tareas de compilación y ejecución. Incluye tareas para C/C++ (MPI, OpenMP) y para Python + Slurm.

Dentro de .vscode/, crea un archivo llamado tasks.json con este contenido:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Compilar OpenMPI",
      "type": "ssh-shell",
      "host": "hpc",
      "command": "/opt/openmpi/4.0.4_gnu/bin/mpicxx \"${remoteFile}\" -o \"${remoteFileDirname}/${remoteFileBasenameNoExtension}\"",
      "group": { "kind": "build", "isDefault": true },
      "problemMatcher": ["$gcc"]
    },
    {
      "label": "Compilar OpenMP",
      "type": "ssh-shell",
      "host": "hpc",
      "command": "/usr/bin/g++ \"${remoteFile}\" -o \"${remoteFileDirname}/${remoteFileBasenameNoExtension}\" -fopenmp",
      "group": "build",
      "problemMatcher": ["$gcc"]
    },
    {
      "label": "Ejecutar OpenMPI con Slurm",
      "type": "ssh-shell",
      "host": "hpc",
      "command": "cd \"${remoteFileDirname}\" && srun --partition=debug --ntasks=4 /opt/openmpi/4.0.4_gnu/bin/mpirun -np 4 \"./${remoteFileBasenameNoExtension}\"",
      "problemMatcher": []
    },
    {
      "label": "Ejecutar OpenMP con Slurm",
      "type": "ssh-shell",
      "host": "hpc",
      "command": "cd \"${remoteFileDirname}\" && OMP_NUM_THREADS=4 srun --partition=debug --ntasks=1 --cpus-per-task=4 \"./${remoteFileBasenameNoExtension}\"",
      "problemMatcher": []
    },
    {
      "label": "Ejecutar Python con Slurm",
      "type": "ssh-shell",
      "host": "hpc",
      "command": "cd \"${remoteFileDirname}\" && module load Anaconda && srun --partition=debug --ntasks=1 --cpus-per-task=1 python \"${remoteFile}\"",
      "problemMatcher": []
    },
    {
      "label": "Enviar sbatch",
      "type": "ssh-shell",
      "host": "hpc",
      "command": "cd \"${remoteFileDirname}\" && sbatch \"${remoteFile}\"",
      "problemMatcher": []
    },
    {
      "label": "Ver mi cola (squeue)",
      "type": "ssh-shell",
      "host": "hpc",
      "command": "squeue -u $USER",
      "problemMatcher": []
    },
    {
      "label": "Últimos jobs de hoy (sacct)",
      "type": "ssh-shell",
      "host": "hpc",
      "command": "sacct -u $USER --starttime=today -o JobID,JobName,State,Elapsed,MaxRSS,NodeList",
      "problemMatcher": []
    }
  ]
}

Guarda con Ctrl+S.