155 lines
7.9 KiB
Markdown
155 lines
7.9 KiB
Markdown
---
|
||
weight: 5
|
||
title: "Q & A"
|
||
---
|
||
|
||
## 使用 SSH X11 forwarding
|
||
|
||
远程桌面非常笨重。在 Linux 系统上连接到 Linux 服务器时,可以使用 SSH X11 forwarding 代替之:
|
||
|
||
```bash
|
||
ssh chn@srv1.chn.moe -X -Y
|
||
```
|
||
|
||
之后在服务器上运行图形化程序时,就会在本地显示,就像在本地运行那样,只不过有明显的延迟。例如:
|
||
|
||
```bash
|
||
ovito POSCAR
|
||
```
|
||
|
||
## RDP 设置连接类型
|
||
|
||
连接到 Linux 远程桌面时,需要手动设置连接类型为“LAN”,不然会很卡,我也不知道为什么。似乎是 xrdp 的 bug。
|
||
|
||

|
||
<img src="rdp2.png" style="zoom: 50%;" />
|
||
|
||
## 混合使用不同型号的节点
|
||
|
||
不建议这样做,如果你非要这样做再往下看。
|
||
|
||
计算软件(例如 VASP)在编译时需要针对不同的硬件进行优化得到不同的二进制程序,以此发挥硬件的最大性能。
|
||
也就是说,针对不同型号的 CPU 优化的 VASP 其实并不是同一个程序,运行过程中 CPU 收到的指令也不相同。
|
||
大多情况下,越新的 CPU 支持的指令集越多,
|
||
针对新 CPU 优化的程序在旧 CPU 上不能运行(因为旧 CPU 看不懂这些新指令),针对旧 CPU 优化的程序在新 CPU 上运行效率不高。
|
||
|
||
以下面提交任务的命令为例:
|
||
```bash
|
||
sbatch --ntasks=64 --cpus-per-task=1 --export=ALL,OMP_NUM_THREADS=1 --wrap="vasp-intel srun --mpi=pmix vasp-std"
|
||
```
|
||
任务会在某一个节点上先启动、再与其它节点通信并在其它节点上启动;具体启动哪一个 VASP,取决于最先启动的那个节点[^1]。
|
||
例如,你可以使用下面的命令查看当前节点上最终会启动哪一个 VASP:
|
||
```bash
|
||
vasp-intel which vasp-std
|
||
```
|
||
|
||
要跨不同型号的节点使用 VASP,可以按照以下步骤操作:
|
||
1. 准备一个优化得足够“弱”的 VASP,可以在所有节点上运行。对于 srv1,可以使用 `srv1-node1` 上的 VASP,使用下面的命令计算它的路径:
|
||
```bash
|
||
echo $(nix eval --raw nixos#nixosConfigurations.srv1-node1.pkgs.localPackages.vasp.intel)/bin/vasp-intel
|
||
```
|
||
现在的计算结果是 `/nix/store/xlxz74mppn76iwk2y2njh7gjncwsx7r8-vasp-intel/bin/vasp-intel`。
|
||
随着更新,将来的路径会发生变化。
|
||
2. 使用这个 VASP 提交任务,例如:
|
||
```bash
|
||
sbatch -n64 --cpus-per-task=1 --export=ALL,OMP_NUM_THREADS=1 -pall --wrap="/nix/store/xlxz74mppn76iwk2y2njh7gjncwsx7r8-vasp-intel/bin/vasp-intel srun --mpi=pmix vasp-std"
|
||
```
|
||
|
||
对于其它的计算软件,不一定能这样做。因为还有别的针对 CPU 优化的方案(例如,编译多个版本的二进制库,在运行时动态检测 CPU 型号并加载最合适的版本)。
|
||
|
||
并行使用不同型号的 CPU 时,队列系统或 MPI 往往并不会根据型号平衡各个 CPU 的负载,也就是算得快的 CPU 会等着算得慢的 CPU。
|
||
|
||
## BtrFS 是什么
|
||
|
||
它是一个比较现代的文件系统。相比于常用的其它文件系统(例如 Windows 的 NTFS),它的好处有:
|
||
|
||
* 同样的内容只占用一份空间;以及内容会被压缩存储,在读取时自动解压。这样大致可以节省一多半的空间。
|
||
* 每小时自动备份,放置在 `/nix/persistent/.snapshots` 中,大致上会保留最近一周的备份。如果你误删了什么文件,可以去里面找回。
|
||
|
||
## 查看文件或文件夹的大小
|
||
|
||
Windows 下不用教。Linux 下分两种情况:
|
||
|
||
* 对于厦大超算(jykang),使用 `du -ah --max-depth=0 文件或目录名`。
|
||
* 对于其它服务器(使用了 BtrFS):由于压缩和 CoW,实际占用空间会小于大小,因此 `du` 得到的结果不准确。
|
||
使用 `compize 文件或目录名` 命令。
|
||
得到的结果中,`TOTAL` 行 `Disk Usage` 列为实际占用的空间,`TOTAL` 行 `Referenced` 列为文件或文件夹的大小。
|
||
|
||
## 查看硬盘剩余空间
|
||
|
||
Windows 下不用教。Linux 下分两种情况:
|
||
|
||
* 对于厦大超算(jykang):硬盘空间实际上是比较大的,紧张的是 `jykang` 这个用户的限额(quota)。
|
||
似乎没有 root 权限没法看。按照经验大概是 800 G 多一点。
|
||
如果你知道怎样不用 root 用户看,请务必教教我。
|
||
* 对于其它服务器:`df -h`。
|
||
|
||
## 自动启动 Pageant 并添加密钥
|
||
|
||
如果您觉得每次打开 Pageant 都要手动添加密钥很麻烦,希望可以将这个过程自动化;并且熟悉 Windows 命令行的使用,可以编写一个批处理文件。
|
||
将下方代码用记事本保存,然后将扩展名从 `.txt` 改为 `.bat`,之后每次双击该文件即可启动 Pageant 并自动添加密钥:
|
||
|
||
```bash
|
||
"C:\ProgramData\chocolatey\bin\PAGEANT.EXE" "Z:\.ssh\id_rsa.ppk"
|
||
```
|
||
|
||
其中第一个引号内为 Pageant 的路径,第二个引号内为您的密钥文件的路径。也可以将该批处理文件放入开机启动项中,使得 Pageant 在开机时自动启动。
|
||
|
||
因为每个人的密钥文件以及 Pageant 的路径都可能不同,所以这里无法提供通用的批处理文件。
|
||
|
||
## 为什么不转发 agent 就无法区分不同密钥?
|
||
|
||
如果你好奇为什么不使用 Pageant 就无法区分使用不同密钥的登陆:
|
||
|
||
SSH 连接并不是直接由 jykang 用户处理的,
|
||
而是由一个名为 `sshd` 的程序处理,它通常以 `root` 用户的身份运行。
|
||
在完成认证后,`sshd` 会将 Windows 电脑发来的信息解密后转发给以 `jykang` 用户运行的进程,
|
||
并将以 `jykang` 用户运行的进程的输出加密后发回给 Windows 电脑。
|
||
我们只能控制 `jykang` 用户运行的进程,但这里拿不到任何关于密钥的信息。
|
||
|
||
```mermaid
|
||
flowchart TB
|
||
subgraph "Run on windows"
|
||
A[(密钥文件)] -.->|从硬盘读取| B["SSH client (putty, WinSCP, etc.)"]
|
||
end
|
||
subgraph "Run on hpc by root"
|
||
C["SSH server (sshd)"]
|
||
end
|
||
B <--> |"认证信息 & 加密的数据"| C
|
||
subgraph "Run on hpc by <b>jykang</b>"
|
||
D["Other programs (bash, VASP, etc.)"]
|
||
end
|
||
C <--> |"解密后的数据(不包含密钥信息)"| D
|
||
```
|
||
|
||
Pageant 程序就是所谓的“SSH agent”。“SSH agent forwarding” 就是将到 Pageant 的连接通过已经建立的 SSH 连接转发给远程服务器,
|
||
使得远程服务器可以与 Pageant 通信,进而读取密钥信息。
|
||
“SSH agent forwarding” 典型的用途是在远程服务器上使用本地的密钥再次登陆其他服务器,而不是为了区分使用不同密钥的登陆。
|
||
|
||
```mermaid
|
||
flowchart TB
|
||
subgraph "Run on windows"
|
||
A[(密钥文件)] -.->|从硬盘读取| E["SSH agent (pageant)"]
|
||
E <-->|认证信息| B["SSH client (putty, WinSCP, etc.)"]
|
||
end
|
||
subgraph "Run on hpc by root"
|
||
C["SSH server (sshd)"]
|
||
end
|
||
B <--> |"认证信息 & 加密的数据"| C
|
||
subgraph "Run on hpc by <b>jykang</b>"
|
||
D["Other programs (bash, VASP, etc.)"]
|
||
end
|
||
C <--> |"解密后的数据(不包含密钥信息)"| D
|
||
E <-...-> |"通过已经建立的 SSH 连接转发密钥信息"| D
|
||
```
|
||
|
||
事实上,linux 的管理(统计用户使用的资源,等)非常依赖于不同的用户,即用高权限的用户去管理低权限的用户。
|
||
大家都使用同一个账户的情况下,很多管理的功能没有现成的解决方案(要自己手写代码、思考如何设计),甚至完全无法实现。
|
||
整这个东西真的挺麻烦的。我也嫌麻烦(而且我要做的事情比大多数用户多得多)。要不是康老师一定要我做,我才不会做。
|
||
如果你嫌这些麻烦,与其埋怨我,不如去建议自己的导师去自己申请一个账号用。
|
||
|
||
[^1]: MPI 是按照绝对路径来搜索可执行文件的。
|
||
NixOS 的特性导致不同参数编译的 VASP 会被放在不同的目录下,因此会在其它节点上启动与最先启动的节点相同、但不是针对这些节点优化的 VASP。
|
||
如果通过一些手段将不同参数编译的 VASP 放在同一个位置,它们是否能正常通信,我觉得应该是可以的。
|
||
但我觉得这样做意义不大,因为算得快的 CPU 还是需要等着算得慢的 CPU。
|