
> 2026年1月：本文档内容已经过时，需要更新。

# 实验机使用说明
这里描述的是重装后的实验机的使用方法。已重装的机器：
- g7、g9（2023-11-22）
- g4（2023-11-24）

本文档默认你已经能够登录实验机，参考：[registry](registry.md)。

## sudo权限
只有部分命令能够通过sudo免密运行，定义在文件[nasp](https://git.nasp.fit/NASP/registry/src/branch/main/scripts/nasp)中，列出如下：
- `docker`
- `reboot`
- `whoami`
- `nvidia-smi`
- `shutdown`
- `ufw`
- `ip`

如果你需要以root权限运行其它命令，请联系管理员。

## 启动docker容器
实验机使用容器化管理。所有实验环境均在docker环境中，裸机环境仅用于启动容器、配置防火墙等。

裸机环境均配置了`dnew`命令（[源码](https://git.nasp.fit/NASP/configurations/src/branch/dev/testbed/scripts/dnew)），方便用户交互式地启动容器。

```
================== dnew ===================
=== contact: xd21@mails.tsinghua.edu.cn ===
Use GPU? [yN]: y  # 按需选择，默认否
Use RDMA? [yN]: y  # 按需选择，默认否
Image name (default: git.nasp.fit/nasp/nasp-ubuntu):  # 如果没有特殊要求，直接回车
Start up command (default: /etc/startup.sh):  # 如果没有特殊要求，直接回车
Will run:
=====
sudo docker run -d --net=host -v /home2:/home2 \
    --cap-add=SYS_NICE --cap-add=IPC_LOCK \
    --security-opt seccomp=unconfined --ulimit memlock=-1:-1 \
    --restart=unless-stopped \
    --name dictxiong_231124-165705 \
    --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all \
    --device=/dev/infiniband/rdma_cm --device=/dev/infiniband/issm0 \
    --device=/dev/infiniband/umad0 --device=/dev/infiniband/uverbs0 \
    -it git.nasp.fit/nasp/nasp-ubuntu /etc/startup.sh
=====
Start the container? [yN]:  # 检查上面的命令，选择是否执行
```

启动后，`dnew`会给出进入容器的方法，可以保存备用。

常用docker命令：
- `sudo docker ps -a` 显示所有容器
- `sudo docker start <container>` 启动指定的容器
- `sudo docker exec -it <container> bash` 启动指定容器中的`bash`
- `sudo docker stop <container>` 停止指定的容器
- `sudo docker rm <container>` 删除指定的容器

## 使用docker容器
在容器内部，用户拥有root权限，可以做任何想做的事情。如果搞坏了docker内部环境，直接删除，重新创建一个容器即可。

容器默认配置为开机自动启动（`--restart=unless-stopped`），除非手动将其停止。容器在启动时会自动执行启动脚本（默认`/etc/startup.sh`），你可以在这里面添加你自己的服务。

### 文件管理
通过`dnew`脚本创建的容器会把物理机上`/home2`挂载到容器内的`/home2`，建议将所有的重要数据都放置在这里面。容器内除了`/home2`之外的文件，都可能会在容器销毁后丢失。

### 安装软件
默认的`git.nasp.fit/nasp/nasp-ubuntu`镜像是一个基于Ubuntu 20的、包含cuda和rdma支持的镜像。要安装软件，使用`apt`，用法与物理机上无异。

```
sudo apt update
sudo apt install zsh
```

### 容器网络
容器在运行时默认指定了`--net=host`，这意味着容器内外的网络是完全共享的。在容器内监听一个端口，等价于在物理机上监听一个端口。`ifconfig`、`ip`、`netstat`等命令有与物理机上一致的效果。

用户可以很容易把容器内的服务暴露给机器外，包括web、ssh等。

### 容器内启动ssh server
你可以在容器内启动一个独立的ssh服务端，从而能够自跳板机直接访问到容器内，方便vscode等应用远程连接。

- 配置`/etc/ssh/sshd_config`，取消掉`#Port 22`的注释，并把它改成一个未被占用的端口；
- 如果你使用公钥登录（推荐），把你的公钥放到`~/.ssh/authorized_keys`文件中；如果你使用密码登录（务必使用强密码），使用`passwd`命令设置密码，修改`/etc/ssh/sshd_config`，允许root用户使用密码登录`PermitRootLogin yes`（不推荐）。
- 启动ssh服务端：`/etc/init.d/ssh start`
- 检查容器的启动脚本，确保里面包含了ssh：`vim /etc/startup.sh`，使得下次物理机开机自动启动容器后会启动ssh服务端

随后，你就能从跳板机直接访问容器内部了。如：

```bash
ssh -p <your_port> -o ProxyJump=ssh@nasp.fit:36022 root@g7
```

> 这里使用了`root`用户，即你在容器内的用户名。如果你在容器内改用了别的用户，请相应修改。

## 自动开关机
按照FIT楼的消防要求，放置在4-103的服务器应当每晚关机。自动关机的流程是：每晚的22:59，启动一个[关机脚本](https://git.nasp.fit/NASP/configurations/src/branch/dev/testbed/scripts/schedule-poweroff.sh)，该关机脚本的逻辑是：检查是否存在文件`/tmp/skip-poweroff`；若存在，则将其删除，然后脚本直接退出；若不存在，则启动时长为一小时的自动关机。机器将在23:59自动关闭。

自动开机是通过Wake-on-lan实现的，每天早上，由g18分批向实验机发送唤醒包。相关配置文件可以在[这里](https://git.nasp.fit/NASP/configurations/src/branch/dev/g18/wakeonlan)找到。