文章目录
学习目标
学习什么是SSH、为什么使用远程连接、如何使用SSH远程连接开发机
学习什么是端口映射、为什么使用端口映射、如何进行端口映射
学习一些常用linux命令不常用的参数
1、SSH连接
1.1什么是SSH
SSH全称Secure Shell,中文翻译为安全外壳,它是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。SSH 协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了安全的网络服务。
SSH 是(C/S架构)由服务器和客户端组成,为建立安全的 SSH 通道,双方需要先建立 TCP 连接,然后协商使用的版本号和各类算法,并生成相同的会话密钥用于后续的对称加密。在完成用户认证后,双方即可建立会话进行数据交互。
那在后面的实践中我们会配置SSH密钥,配置密钥是为了当我们远程连接开发机时不用重复的输入密码。
1.2个人PC为什么要进行远程连接
远程连接的好处就是,如果你使用的是远程办公,你可以通过SSH远程连接开发机,这样就可以在本地进行开发。而且如果你需要跑一些本地的代码,又没有环境,那么远程连接就非常有必要了。
1.3如何使用SSH远程连接开发机
1.3.1使用密码进行SSH远程连接
打开自己的电脑,打开终端
使用如下命令可以查看一些信息
hostname # 查看开发机名称
uname -a # 查看开发机内核信息
lsb_release -a # 查看开发机版本信息
nvidia-smi # 查看GPU的信息,
nvidia-smi -a| grep Product # 查看GPU型号
exit # 输入两次exit就可以退出开发机了。
1.3.2配置SSH密钥进行SSH远程连接(可选)
但是在我们开发学习的时候,每次远程都输入密码比较麻烦,我们可以在自己的电脑上生成秘钥,在开发机上设置SSH key来跳过输入密码这一步骤,在ssh命令中我们可以使用ssh-keygen命令来生成密钥
如果计算机的用户名是中文的,InternStudio会识别不了,这种情况就需要用密码来登录SSH,不过不影响使用。
SSH密钥是一种安全便捷的登录认证方式,用于在SSH协议中进行身份验证和加密通信。
ssh-keygen支持RSA和DSA两种认证密钥。
常用参数包括:
-t:指定密钥类型,如dsa、ecdsa、ed25519、rsa。
-b:指定密钥长度。
-C:添加注释。
-f:指定保存密钥的文件名。
-i:读取未加密的ssh-v2兼容的私钥/公钥文件。
这里我们使用RSA算法生成密钥,命令为:
ssh-keygen -t rsa
输入命令后一路回车就可以了
- linux密钥默认情况下是生成在
~/.ssh/目录下的
,~表示的是家目录, - windows密钥默认情况下是生成在
C:\Users\{your_username}\
。
在powerShell中可以使用Get-Content命令查看生成的密钥,如果是linux操作系统可以使用cat命令。
然后我们回到开发机平台,在首页点击配置SSH Key,接着点击添加SSH公钥,
1.3.3使用VScode进行SSH远程连接
如果要在VScode中进行远程连接,我们还需要安装一套插件,如何安装VScode大家可以网上搜索一下非常简单。配置文件中的各项内容含义:
Host ssh.intern-ai.org.cn # 主机ip也可以是域名
HostName ssh.intern-ai.org.cn # 主机名
Port 37367 # 主机的SSH端口
User root # 登录SSH使用的用户
StrictHostKeyChecking no # 表示禁用严格的主机密钥检查。这意味着当连接到一个新的 SSH 服务器时,不会严格验证服务器的主机密钥,可能会带来一定的安全风险。
UserKnownHostsFile /dev/null # 则是将用户已知的主机密钥文件设置为 /dev/null ,这实质上是忽略了对已知主机密钥的记录和使用。但是在一般的安全实践中,不建议随意禁用严格的主机密钥检查。
2、端口映射
2.1什么是端口映射
端口映射是一种网络技术,它可以将外网中的任意端口映射到内网中的相应端口,实现内网与外网之间的通信。通过端口映射,可以在外网访问内网中的服务或应用,实现跨越网络的便捷通信。
2.2开发机为什么要进行端口映射呢
因为在后续的课程中我们会进行模型web_demo的部署实践,那在这个过程中,很有可能遇到web ui加载不全的问题。这是因为开发机Web IDE中运行web_demo时,直接访问开发机内 http/https 服务可能会遇到代理问题,外网链接的ui资源没有被加载完全。
所以为了解决这个问题,需要对运行web_demo的连接进行端口映射,将外网链接映射到我们个人PC,我们使用个人PC连接访问,解决这个代理问题。下面让我们实践一下。
ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no
上面是一个端口映射命令,在主机上运行该命令即可进行端口映射,下面用一个流程图了解端口映射的过程:
个人PC会远程连接到开发机唯一暴露在外的37367端口,(这个在SSH的时候提到过每个人的开发机暴露的端口都不一样),并设置隧道选项。暴露端口是作为中转站进行流量的转发。
-p 37367:是指定 SSH 连接的端口为 37367,这个前面提到过。
root@ssh.intern-ai.org.cn:表示要以 root 用户身份连接到 ssh.intern-ai.org.cn 这个主机。
-C:启用压缩,减少传输数据量。
-N:不执行远程命令,只建立隧道,即仅建立连接用于端口转发。
-g:允许远程主机连接到本地转发的端口。
-L {本地机器_PORT}:127.0.0.1:{开发机_PORT}:这是设置本地端口转发,将本地机器的指定端口(由 {本地机器_PORT} 表示)转发到远程主机(这里即 ssh.intern-ai.org.cn)的 127.0.0.1 (即本地回环地址)和指定的开发机端口(由 {开发机_PORT} 表示)。
-o StrictHostKeyChecking=no:关闭严格的主机密钥检查,这样可以避免第一次连接时因为未知主机密钥而产生的提示或错误。
当在个人PC上执行这个SSH命令后,SSH客户端会在本地机器的7860端口上监听。任何发送到本地7860端口的流量,都会被SSH隧道转发到远程服务器的127.0.0.1地址上的7860端口。
这意味着,即使开发机的这个端口没有直接暴露给外部网络,我们也可以通过这个隧道安全地访问远程服务器上的服务。
运行demo在个人PC机上的效果:
3、Linux 基础命令
3.1文件管理
- cat命令
可以查看文件里面的内容,更多的使用命令可以使用–help命令查看:
-a,--show-all等价于-vET
-b,--number-non空白数非空输出行,覆盖-n
-e, 等价于-vE
-E,--show-结束显示$在每一行的末尾
-n,--number编号所有输出行
-s,--crick-空白抑制重复的空输出行
-t等价于-vT
-t,--show-tabs将制表符显示为^I
-v,--show非打印使用^和M-表示法,LFD和TAB除外
- vi&vim命令
命令模式
dd删除一行
yy复制一行
p粘贴
g到首行
G到末行
ZZ不保存退出
末行模式
/查找
- sed命令
处理文件:进行复杂的文件操作,可以使用sed命令。
参数说明:
-e<script> 或 --expression=<script>:直接在命令行中指定脚本进行文本处理。
-f<script文件> 或 --file=<script文件>:从指定的脚本文件中读取脚本进行文本处理。
-n 或 --quiet 或 --silent:仅打印经过脚本处理后的输出结果,不打印未匹配的行。
动作说明:
a:在当前行的下一行添加指定的文本字符串。
c:用指定的文本字符串替换指定范围内的行。
d:删除指定的行。
i:在当前行的上一行添加指定的文本字符串。
p:打印经过选择的行。通常与 -n 参数一起使用,只打印匹配的行。
s:使用正则表达式进行文本替换。例如,s/old/new/g 将所有 "InternLM" 替换为 "InternLM yyds"。
- rm命令&mv命令
rm命令常用参数:
-i:交互模式,删除前询问。
-f:强制删除,忽略不存在的文件,不提示确认。
-r:递归删除目录及其内容。
mv命令常用参数:
-i:交互模式,覆盖前询问。
-f:强制覆盖。
-u:只在源文件比目标文件新时才进行移动。
- ln命令
参数如下:
-s:创建软链接(符号链接)也是最常用的;
-f:强制执行,覆盖已存在的目标文件;
-i:交互模式,文件存在则提示用户是否覆盖;
-n:把符号链接视为一般目录;
-v:显示详细的处理过程。
- find命令
find命令是Linux系统中一个强大的文件搜索工具,它可以在指定的目录及其子目录中查找符合条件的文件或目录,并执行相应的操作。
以下是find命令的一些常见用法:
-name选项,按文件名查找,
find /path/to/directory -name "file.txt"将在指定目录及其子目录中查找名为file.txt的文件。
-type选项,按文件类型查找,
find /path/to/directory -type f将查找指定目录及其子目录中的所有普通文件。
-size选项,按文件大小查找,
find /path/to/directory -size +100M将查找指定目录及其子目录中大于100MB的文件。
-mtime、-atime或-ctime选项,按修文件的修改时间、访问时间或状态更改时间查找文件。
find /path/to/directory -mtime -7将查找指定目录及其子目录中在7天内修改过的文件。
-perm选项,按文件权限查找,
find /path/to/directory -perm 755将查找指定目录及其子目录中权限为755的文件。
-user或-group选项,按用户或组查找,
find /path/to/directory -user username将查找指定目录及其子目录中属于用户username的文件。
-exec选项,执行操作:使用可以对找到的文件执行相应的操作。
find /path/to/directory -name "*.txt" -exec rm {} \;将删除找到的所有以.txt结尾的文件。
- ls命令
常用参数及使用方法如下:
-a:显示所有文件和目录,包括隐藏文件(以.开头的文件或目录)。
-l:以长格式显示详细信息,包括文件权限、所有者、大小、修改时间等。
-h:与-l结合使用,以人类可读的方式显示文件大小(如K、M、G等)。
-R:递归列出子目录的内容。
-t:按文件修改时间排序显示。
3.2进程管理
进程管理命令是进行系统监控和进程管理时的重要工具
top:动态显示正在运行的进程
pstree:树状查看正在运行的进程
# pgrep:用于查找进程,查找匹配条件的进程。可以根据进程名、用户等条件查找进程。
pgrep -u username # 查找特定用户的所有进程
# nice:更改进程的优先级。nice 值越低,进程优先级越高。
nice -n 10 long-running-command # 以较低优先级运行一个长时间运行的命令
jobs:显示当前终端会话中的作业列表,包括后台运行的进程。
# bg 和 fg:将进程调入后台
bg # 将最近一个挂起的作业放到后台运行
fg # 将后台作业调到前台运行
nvidia-smi相关:
这个命令会每1秒更新一次状态信息。
nvidia-smi -l 1
列出所有 GPU 并显示它们的 PID 和进程名称:
nvidia-smi pmon
这会强制结束 GPU ID 为 0 上的 PID 为 12345 的进程:
nvidia-smi --id=0 --ex_pid=12345
设置 GPU 性能模式:
nvidia-smi -pm 1
nvidia-smi -i 0 -pm 1
第一个命令会为所有 GPU 设置为性能模式,第二个命令只针对 ID 为 0 的 GPU。
重启 GPU:
nvidia-smi --id=0 -r
这会重启 ID 为 0 的 GPU。
下面通过一张图片对GPU信息进行介绍:
3.3工具
这里介绍一个工具TMUX,TMUX 是一个终端多路复用器。它可以在多个终端之间轻松切换,分离它们(这不会杀死终端,它们继续在后台运行)和将它们重新连接到其他终端中。
为什么要介绍这个工具呢?因为在后面进行Xtuner微调模型的时候,时间会很长,使用Tmux可以解决程序被杀死中断的情况
具体使用参考:https://www.ruanyifeng.com/blog/2019/10/tmux.html
想退出tmux可以使用Ctrl+d
快捷键
4、conda&shell介绍
4.1添加conda源
#设置清华镜像
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
如果我们想要查看conda的配置信息可以使用conda config --show
命令
4.2创建虚拟环境
conda create -n name numpy
命令常用参数:
-n 或 --name:指定要创建的环境名称。
-c 或 --channel:指定额外的软件包通道。
--clone:从现有的环境克隆来创建新环境。
-p 或 --prefix:指定环境的安装路径(非默认位置)。
4.3导出与还原环境
# 获得环境中的所有配置
conda env export --name myenv > myenv.yml
# 重新还原环境
conda env create -f myenv.yml
4.4pip&conda
1. conda可以管理非python包,pip只能管理python包。
2. conda可以用来创建虚拟环境,pip不能,需要依赖virtualenv之类的包。
3. conda安装的包是编译好的二进制文件,安装包文件过程中会自动安装依赖包;pip安装的包是wheel或源码,装过程中不会去支持python语言之外的依赖项。
4. conda安装的包会统一下载到当前虚拟环境对应的目录下,下载一次多次安装。pip是直接下载到对应环境中。
Wheel 是一种 Python 安装包的格式。它是一种预编译的二进制分发格式,类似于 conda 中的已编译二进制文件。
Wheel 格式的主要优点包括:
安装速度快:因为已经进行了预编译,所以在安装时不需要像源码安装那样进行编译过程,节省了时间。
一致性:确保在不同的系统和环境中安装的结果是一致的。
例如,如果您要安装一个大型的 Python 库,使用 Wheel 格式可以避免在不同的机器上因为编译环境的差异而导致的安装问题。而且,对于那些没有编译环境或者编译能力较弱的系统,Wheel 格式能够让安装过程更加顺畅。
4.5conda环境导出与还原
创建test.sh脚本并赋予可执行权限,写入以下内容
#!/bin/bash
# 定义导出环境的函数
export_env() {
local env_name=$1
echo "正在导出环境: $env_name"
# 导出环境到当前目录下的env_name.yml文件
conda env export -n "$env_name" > "$env_name.yml"
echo "环境导出完成。"
}
# 定义还原环境的函数
restore_env() {
local env_name=$1
echo "正在还原环境: $env_name"
# 从当前目录下的env_name.yml文件还原环境
conda env create -n "$env_name" -f "$env_name.yml"
echo "环境还原完成。"
}
# 检查是否有足够的参数
if [ $# -ne 2 ]; then
echo "使用方法: $0 <操作> <环境名>"
echo "操作可以是 'export' 或 'restore'"
exit 1
fi
# 根据参数执行操作
case "$1" in
export)
export_env "$2"
;;
restore)
restore_env "$2"
;;
*)
echo "未知操作: $1"
exit 1
;;
esac
使用./test.sh restore xtuner0.1.17
,restore是默认参数,后面是环境名称
4.6shell
Shell 脚本 是一种包含一系列命令的文本文件,这些命令按照特定的顺序排列,用于在 Unix/Linux 或类似的操作系统环境中自动执行任务。
Shell 脚本通常使用 Shell 语言编写,常见的 Shell 语言如 Bash、Sh 等,就是我们前面所介绍了Linux基础命令,这就属于Shell语言。
它有以下几个重要特点:
自动化:可以将一系列重复、复杂的操作编写为一个脚本,然后只需运行脚本即可自动完成这些操作,从而节省时间和减少错误。例如,每天定时备份重要文件的脚本。
系统管理:用于管理系统配置、用户权限、进程控制等。比如,创建新用户并设置其权限的脚本。
批处理:能够同时处理多个文件或数据。例如,将一批图片文件从一种格式转换为另一种格式的脚本。
流程控制:像条件判断(if-else)、循环(for、while)等,使脚本能够根据不同的情况执行不同的操作。
心得
此次学习算是一个查漏补缺,并对一些感兴趣的内容进行记录,比如ssh连接部分使用秘钥连接是个很简洁的一步操作,端口如何映射,为啥要映射,一些常用命令的其他参数使用方法等
本期学习到此结束,感谢书生大模型实战营~