第一关:Linux基础知识
创始人
2025-01-15 02:34:45
0

Linux基础知识目录

  • 前言
  • Linux+InternStudio 关卡
    • 1. InternStudio开发机介绍
    • 2. SSH及端口映射
      • 2.1 什么是SSH?
      • 2.2 如何使用SSH远程连接开发机?
        • 2.2.1 使用密码进行SSH远程连接
        • 2.2.2 配置SSH密钥进行SSH远程连接
        • 2.2.3 使用VScode进行SSH远程连接
      • 2.3. 端口映射
        • 2.3.1 什么是端口映射?
        • 2.3.2 如何进行端口映射?
          • 2.3.2.1 使用 ssh 命令进行端口映射
          • 2.3.2.2 使用 vscode 进行端口映射
    • 3. Linux 基础命令
      • 3.1 文件管理
        • 3.1.1 **touch**
        • 3.1.2 **mkdir**
        • 3.1.3 **cd**
        • 3.1.4 **pwd**
        • 3.1.5 **cat**
        • 3.1.6 **vi or vim**
        • 3.1.7 **cp 和 ln(重点)**
        • 3.1.8 **mv 和 rm**
        • 3.1.9 **find**
        • 3.1.10 **ls**
        • 3.1.11 **sed**
      • 3.2 进程管理
      • 3.3 **工具使用**
    • 4. Conda和Shell介绍(附加)
      • 4.1 conda设置
      • 4.2 conda环境管理
        • 4.2.1 创建虚拟环境
        • 4.2.2 查看有哪些虚拟环境
        • 4.2.3 激活与退出虚拟环境
        • 4.2.4 删除与导出虚拟环境
      • 4.3 conda和pip
      • 4.4 studio-conda使用与Shell(扩展)
    • 常见问题
      • 1. InternStudio 开发机的环境玩坏了,如何初始化开发机环境
  • 关卡任务

前言

本文是由上海人工智能实验室主办的第三期书生大模型实战营的笔记,仅供个人和助教批改作业参考,教程原文链接。
报名请在微信搜索“第三期书生大模型实战营”。
本笔记是在原教程的基础上修改的个人批注的笔记

Linux+InternStudio 关卡

😀Hello大家好,欢迎来到书生大模型实战营,这里是实战营为第一次参加实战营同学,和来自各个行业的没有Linux基础知识的同学准备的基础课程,在这里我们会教大家如何使用InternStudio开发机,以及掌握一些基础的Linux知识,让大家不至于在后面的课程中无从下手,希望对大家有所帮助。在这里关卡任务中为大家准备了一些关卡任务,当大家完成必做关卡任务并打卡后,就会获得当前关卡的算力奖励了,让我们开始吧!

1. InternStudio开发机介绍

InternStudio 是大模型时代下的云端算力平台。基于 InternLM 组织下的诸多算法库支持,为开发者提供开箱即用的大语言模型微调环境、工具、数据集,并完美兼容 🤗 HugginFace 开源生态。

如果大家想了解更多关于InternStduio的介绍的话可以查看下面的文档: InternStudio

https://studio.intern-ai.org.cn/

首先打开上面的链接进入InternStudio,完成登录会自动跳转到控制台界面,如下图所示:

在这里插入图片描述

下面给大家讲一下每一个序号对应页面的功能:

  1. 在这里可以创建开发机,以及修改开发机配置和查看相关日志等。

在这里插入图片描述

  1. 这里可以可视化查看开发机中的文件及文件夹,而且如果你创建了两个开发机,那么他们使用的云盘是一个。(因为每一个开发机都是一个Docker 容器,存储云盘挂载的都是一个,关于专业名词解释可以看: 专业名词解释)在这里你可以上传文件或者文件夹,以及创建文件,还可以查看隐藏文件。

在这里插入图片描述

  1. 这是开发机新增的功能,如果大家要做项目的话,可以向小助手申请资源,团队的功能是所有成员共享算力资源,避免造成资源浪费。(毕竟烧的可都是💴啊)
  2. 这里是用来配置SSH密钥的,我们在后面会讲到如何使用。
  3. 最后这个地方是来编辑你的个人信息的,以及查看你算力资源的具体使用。

上面就是InternStudio平台的简单介绍,下面让我们来看一下如何创建开发机,我们来到首页,点击“创建开发机

在这里插入图片描述

这里我们选择创建个人开发机,名称为testCuda版本为12.2,资源配置选择10%,时长默认就行。

创建完成以后在开发机界面可以看到刚刚创建的开发机,点击进入开发机。

在这里插入图片描述

进入开发机以后可以看到开发机的主页面,开发机有三种模式可以选择:JupyterLab、终端和VScode

在这里插入图片描述

其中:

  1. JupyterLab:一个交互式的编程和教学环境,同时内置终端,可以很方便地查看文件,执行代码等
  2. 终端(Terminal, 最轻量级):主要进行命令行操作,或者运行脚本和简单程序
  3. VSCode:网页中集成的VSCode,也可以在本地VSCode中通过SSH连接远程开发,下面就会讲如何配置远程连接。

在这里插入图片描述

  1. 这个是资源使用情况,在后续的课程中会使用到。

2. SSH及端口映射

上面我们介绍了InternStudio平台,以及如何创建开发机,这一小节,我们要了解什么是SSH为什么使用远程连接、如何使用SSH远程连接开发机、什么是端口映射以及如何进行端口映射

2.1 什么是SSH?

SSH全称Secure Shell,中文翻译为安全外壳,它是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。SSH 协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了安全的网络服务。

SSH 是(C/S架构)由服务器客户端组成,为建立安全的 SSH 通道,双方需要先建立 TCP 连接,然后协商使用的版本号和各类算法,并生成相同的会话密钥用于后续的对称加密。在完成用户认证后,双方即可建立会话进行数据交互。

那在后面的实践中我们会配置SSH密钥,配置密钥是为了当我们远程连接开发机时不用重复的输入密码,那为什么要进行远程连接呢

远程连接的好处就是,如果你使用的是远程办公,你可以通过SSH远程连接开发机,这样就可以在本地进行开发。而且如果你需要跑一些本地的代码,又没有环境,那么远程连接就非常有必要了。

2.2 如何使用SSH远程连接开发机?

2.2.1 使用密码进行SSH远程连接

首先我们使用输入密码的方式进行SSH远程连接,后面我们会讲如何配置免密登录。

当完成开发机的创建以后,我们需要打开自己电脑的powerShell终端,使用Win+R快捷键打开运行框,输入powerShell,打开powerShell终端。(如果你是Linux或者Mac操作系统,下面的步骤都是一样的)

我们回到开发机平台,进入开发机页面找到我们创建的开发机,点击SSH连接

在这里插入图片描述

在这里插入图片描述

然后复制登录命令,这里的37367是开发机所使用的SSH端口,一般使用的都是22端口,没有这个端口号的话是连不上SSH的,并且每个人的端口都不一样,所以如果大家在连接开发机时出现连不上的情况,那就需要检查一下是不是端口错了。

将复制的命令粘贴到powershell中,然后回车,这里我们需要输入密码,我们将登录命令下面的密码复制下来,然后粘贴到终端中注意密码复制后右键就粘贴好了,shell的粘贴快捷键有的电脑是shift+ins,这里密码粘贴密码是不显示的,这是正常的。

最后回车出现以下内容就代表成功了:

在这里插入图片描述

在这里插入图片描述

当我们连接上开发机以后,可以使用hostname查看开发机名称,使用uname -a查看开发机内核信息,使用lsb_release -a查看开发机版本信息,使用nvidia-smi查看GPU的信息,这些命令我们后面都会讲到,如果想要退出远程连接,输入两次exit就可以了。

2.2.2 配置SSH密钥进行SSH远程连接

但是在我们开发学习的时候,每次远程都输入密码比较麻烦,我们可以设置SSH key来跳过输入密码这一步骤,在ssh命令中我们可以使用ssh-keygen命令来生成密钥

SSH密钥是一种安全便捷的登录认证方式,用于在SSH协议中进行身份验证和加密通信。

ssh-keygen支持RSA和DSA两种认证密钥。

常用参数包括:

  • -t:指定密钥类型,如dsa、ecdsa、ed25519、rsa。
  • -b:指定密钥长度。
  • -C:添加注释。
  • -f:指定保存密钥的文件名。
  • -i:读取未加密的ssh-v2兼容的私钥/公钥文件。

这里我们使用RSA算法生成密钥,命令为:

ssh-keygen -t rsa 

输入命令后一路回车就可以了,这里的密钥默认情况下是生成在~/.ssh/目录下的,~表示的是家目录,如果是windows就是C:\Users\{your_username}\。在powerShell中可以使用Get-Content命令查看生成的密钥,如果是linux操作系统可以使用cat命令。

在这里插入图片描述

在这里插入图片描述

然后我们回到开发机平台,在首页点击配置SSH Key,接着点击添加SSH公钥

在这里插入图片描述

在这里插入图片描述

将刚刚生成的密钥复制下来,粘贴到公钥框中,名称会被自动识别到,最后点击立即添加,SSH Key就配置完成了。

在这里插入图片描述

完成SSH Key创建以后,重启终端进行远程连接,就会跳过密码输入这一步了。

2.2.3 使用VScode进行SSH远程连接

当然也可以使用SSH远程连接软件,例如:Windterm、Xterminal等。这里我们使用VScode进行远程连接,使用VScode的好处是,本身它就是代码编辑器,进行代码修改等操作时会非常方便。

如果要在VScode中进行远程连接,我们还需要安装一套插件,如何安装VScode大家可以网上搜索一下非常简单。(开发机里边的vscode搜索不到这个插件,本地vscode可以)

在这里插入图片描述

如果你已经安装好了VScode,可以在点击左侧的扩展页面,在搜索框中输入“SSH”,第一个就是我们要安装的插件,点开它“Install”就可以了。

在这里插入图片描述

安装完成插件以后,点击侧边栏的远程连接图标,在SSH中点击“+”按钮,添加开发机SSH连接的登录命令。

在这里插入图片描述

我们将登录命令复制下来,然后将命令粘贴到弹出的窗口中,最后回车:

在这里插入图片描述

在这里插入图片描述

配置文件这一块默认就好,当然你也可以自定义,下面是配置文件的具体内容:(这里包括了你所有远程连接过的信息)

Host ssh.intern-ai.org.cn #主机ip也可以是域名   HostName ssh.intern-ai.org.cn #主机名   Port 37367 #主机的SSH端口   User root #登录SSH使用的用户   StrictHostKeyChecking no   UserKnownHostsFile /dev/null 

后面的一些配置选项,如果想要手动添加就需要按照上面的格式对相应部分进行修改。

如果将*StrictHostKeyChecking noUserKnownHostsFile* /dev/null删除掉会跳出指纹验证的弹窗:

在这里插入图片描述

StrictHostKeyChecking no表示禁用严格的主机密钥检查。这意味着当连接到一个新的 SSH 服务器时,不会严格验证服务器的主机密钥,可能会带来一定的安全风险。

UserKnownHostsFile /dev/null则是将用户已知的主机密钥文件设置为 /dev/null ,这实质上是忽略了对已知主机密钥的记录和使用。

但是在一般的安全实践中,不建议随意禁用严格的主机密钥检查。

然后在右下角弹出来的提示窗口中点击“连接”就可以远程到开发机中了。

在这里插入图片描述

在这里插入图片描述

远程连接完成以后,可以选择打开的文件夹,也可以称为工作目录,你可以选择开发机中的也可以选择本地的,开发机中的文件夹,就是我们前面提到的云盘

当下一次进行远程连接的时候,就不需要输入登录命令等信息了,只需要打开vscode的远程连接就可以看到第一次连接的开发机信息,下面的root代表我们第一连接开发机时使用的是/root工作目录。

在这里插入图片描述

并且下图中的->表示进入开发机后需要重新选择工作目录:

在这里插入图片描述

而下图中的->表示进入上一次开发机选择的工作目录:

在这里插入图片描述

每次选择的工作目录都会在这个开发机信息下面显示:(这里就多了一个lagent的工作目录)

在这里插入图片描述

下面我们来介绍一下什么时端口映射

2.3. 端口映射

2.3.1 什么是端口映射?

端口映射是一种网络技术,它可以将外网中的任意端口映射到内网中的相应端口,实现内网与外网之间的通信。通过端口映射,可以在外网访问内网中的服务或应用,实现跨越网络的便捷通信。

那么我们使用开发机为什么要进行端口映射呢?

因为在后续的课程中我们会进行模型web_demo的部署实践,那在这个过程中,很有可能遇到web ui加载不全的问题。这是因为开发机Web IDE中运行web_demo时,直接访问开发机内 http/https 服务可能会遇到代理问题,外网链接的ui资源没有被加载完全。

所以为了解决这个问题,我们需要对运行web_demo的连接进行端口映射,将外网链接映射到我们本地主机,我们使用本地连接访问,解决这个代理问题。下面让我们实践一下。

在这里插入图片描述

我们先根据一个图了解一下开发机端口映射是如何工作的:

下面会有实践步骤这里先理解如何进行端口映射的

ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no 

上面是一个端口映射命令,在主机上运行该命令即可进行端口映射,下面用一个流程图了解端口映射的过程:

在这里插入图片描述

个人PC会远程连接到开发机唯一暴露在外的37367端口,(这个在SSH的时候提到过每个人的开发机暴露的端口都不一样),并设置隧道选项。暴露端口是作为中转站进行流量的转发。

  • -C:启用压缩,减少传输数据量。
  • -N:不执行远程命令,只建立隧道。
  • -g:允许远程主机连接到本地转发的端口。

当在个人PC上执行这个SSH命令后,SSH客户端会在本地机器的7860端口上监听。

任何发送到本地7860端口的流量,都会被SSH隧道转发到远程服务器的127.0.0.1地址上的7860端口。

这意味着,即使开发机的这个端口没有直接暴露给外部网络,我们也可以通过这个隧道安全地访问远程服务器上的服务。。

2.3.2 如何进行端口映射?
2.3.2.1 使用 ssh 命令进行端口映射

我们还是来到开发机界面,找到我们的开发机,点击自定义服务,复制第一条命令,
在这里插入图片描述

ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L {本地机器_PORT}:127.0.0.1:{开发机_PORT} -o StrictHostKeyChecking=no 

下面给他大家介绍一下命令各部分的含义:

  • -p 37367:是指定 SSH 连接的端口为 37367,这个前面提到过。
  • root@ssh.intern-ai.org.cn:表示要以 root 用户身份连接到 ssh.intern-ai.org.cn 这个主机。
  • -CNg
    • -C 通常用于启用压缩。
    • -N 表示不执行远程命令,仅建立连接用于端口转发等。
    • -g 允许远程主机连接到本地转发的端口。
  • -L {本地机器_PORT}:127.0.0.1:{开发机_PORT}:这是设置本地端口转发,将本地机器的指定端口(由 {本地机器_PORT} 表示)转发到远程主机(这里即 ssh.intern-ai.org.cn)的 127.0.0.1 (即本地回环地址)和指定的开发机端口(由 {开发机_PORT} 表示)。
  • -o StrictHostKeyChecking=no:关闭严格的主机密钥检查,这样可以避免第一次连接时因为未知主机密钥而产生的提示或错误。

当你运行一个web demo的时候,就可以使用这个命令进行端口映射,举个例子:

我们创建一个hello_world.py文件(在开发机界面右键创建文件,修改名字为hello_world.py),在文件中填入以下内容:

import socket import re import gradio as gr   # 获取主机名 def get_hostname():     hostname = socket.gethostname()     match = re.search(r'-(\d+)$', hostname)     name = match.group(1)          return name   # 创建 Gradio 界面 with gr.Blocks(gr.themes.Soft()) as demo:     html_code = f"""             

☁️ Welcome {get_hostname()} user, welcome to the ShuSheng LLM Practical Camp Course!

😀 Let’s go on a journey through ShuSheng Island together.

""" gr.Markdown(html_code) demo.launch()

编辑完成后记得ctrl+s保存

在运行代码之前,需要先使用pip install gradio==4.29.0命令安装以下依赖包(命令复制粘贴到终端里),然后在Web IDE的终端中运行了一个python hello_world.py命令

在这里插入图片描述

如果不进行端口映射的话,使用本地IP是访问不了的

在这里插入图片描述

我可以使用下面的命令,将它输入到powerShell中:

ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no 

在这里插入图片描述

这样就代表成功了。(注意:这个命令不返回任何的内容,这样代表端口映射在运行了,然后在网页中打开连接就可以看到web ui的界面了)

在这里插入图片描述

2.3.2.2 使用 vscode 进行端口映射

当然,如果我们运行不同的web ui的话,需要重复输入命令,这样很麻烦,这就需要用到VScode了。前面我们已经SSH远程连接了开发机,VScode提供了自动端口映射的功能,我们不需要手动配置,我们可以使用“Ctrl+Shift+~”快捷键唤醒终端,在终端的右侧可以找到端口选项:

在这里插入图片描述

在这里可以查看端口映射的信息,如果需要修改端口的话,可以在端口那一栏修改端口号。

3. Linux 基础命令

这一部分我会带着大家了解Linux的一些基础操作,还有使用一些工具。让大家能够在遇到问题的时候,可以自行解决,如果大家有遇到什么问题的话,也可以在这里评论,我会及时给大家回答。

因为我们使用开发机时很少使用到权限管理,所以我们就不介绍了。(后面的操作均在VScode的终端中进行)

3.1 文件管理

在 Linux 中,常见的文件管理操作包括:

  • 创建文件:可以使用 touch 命令创建空文件。
  • 创建目录:使用 mkdir 命令。
  • 目录切换:使用cd命令。
  • 显示所在目录:使用pwd命令。
  • 查看文件内容:如使用 cat 直接显示文件全部内容,moreless 可以分页查看。
  • 编辑文件:如 vivim 等编辑器。
  • 复制文件:用 cp 命令。
  • 创建文件链接:用ln命令。
  • 移动文件:通过 mv 命令。
  • 删除文件:使用 rm 命令。
  • 删除目录rmdir(只能删除空目录)或 rm -r(可删除非空目录)。
  • 查找文件:可以用 find 命令。
  • 查看文件或目录的详细信息:使用ls命令,如使用 ls -l查看目录下文件的详细信息。
  • 处理文件:进行复杂的文件操作,可以使用sed命令。

这里介绍几种我们在课程中会使用到的命令:

3.1.1 touch

我们可以使用touch快速的创建文件,这样我们不用手动点击进行创建了。例如我们要创建一个demo.py文件:

3.1.2 mkdir

同样的使用方法,如果要创建一个名为test的目录:

在这里插入图片描述

3.1.3 cd

这个命令会是使用最多的一个命令,在使用之前需要为没有计算机基础的同学讲一下目录结构,画一张图让大家理解:

在这里插入图片描述

我们现在使用的是root目录,也是root用户的家目录~,linux操作系统中/表示根目录,根目录下有许多系统所需的目录和文件,刚才我们创建的目录就存在与root目录下,其中.表示的是当前目录,..表示的上级目录。如果我现在要进入到test目录,然后回到root目录,我们可以这样操作:

3.1.4 pwd

我们可以使用pwd命令查看当前所在的目录:这样可以方便我们确定我们当前所在哪个目录下面。

在这里插入图片描述

3.1.5 cat

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除外
3.1.6 vi or vim

当我们需要编辑文件的时候可以使用vi或者vim命令,当你进入文件编辑以后,有三种模式:

在这里插入图片描述

进入编辑模式可以使用i,vim的方便之处就是可以在终端进行简单的文件修改。

3.1.7 cp 和 ln(重点)

**cp**命令在后面课程中会经常用到,它是用来将一个文件或者目录复制到另一个目录下的操作,常用的使用有:

  • 复制文件:cp 源文件 目标文件
  • 复制目录:cp -r 源目录 目标目录

但是如果我们是要使用模型的话,这种操作会占用大量的磁盘空间,所以我们一般使用ln命令,这个就和windows的快捷方式一样。linux中链接分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。

所以我们一般使用软连接,它的常用的使用方法如下:

ln [参数][源文件或目录][目标文件或目录] 

参数如下:

  • -s:创建软链接(符号链接)也是最常用的;
  • -f:强制执行,覆盖已存在的目标文件;
  • -i:交互模式,文件存在则提示用户是否覆盖;
  • -n:把符号链接视为一般目录;
  • -v:显示详细的处理过程。
3.1.8 mv 和 rm

mv命令和rm命令的使用方式很相似,但是mv是用来移动文件或者目录的,同时还可以进行重命名。rm命令则是用来删除文件或者目录的。

常用的使用方法如下:

  • mv 命令

常用参数:

  • -i:交互模式,覆盖前询问。
  • -f:强制覆盖。
  • -u:只在源文件比目标文件新时才进行移动。

使用示例:

  • mv file1.txt dir1/:将文件 file1.txt 移动到目录 dir1 中。

  • mv file1.txt file2.txt:将文件 file1.txt 重命名为 file2.txt

  • rm 命令

常用参数:

  • -i:交互模式,删除前询问。
  • -f:强制删除,忽略不存在的文件,不提示确认。
  • -r:递归删除目录及其内容。

使用示例:

  • rm file.txt:删除文件 file.txt
  • rm -r dir1/:递归删除目录 dir1 及其所有内容。

删除目录的命令也可以使用rmdir

3.1.9 find

find命令是Linux系统中一个强大的文件搜索工具,它可以在指定的目录及其子目录中查找符合条件的文件或目录,并执行相应的操作。

以下是find命令的一些常见用法:

  1. 按文件名查找:使用-name选项按照文件名查找文件。例如,find /path/to/directory -name "file.txt"将在指定目录及其子目录中查找名为file.txt的文件。
  2. 按文件类型查找:使用-type选项按照文件类型查找文件。例如,find /path/to/directory -type f将查找指定目录及其子目录中的所有普通文件。
  3. 按文件大小查找:使用-size选项按照文件大小查找文件。例如,find /path/to/directory -size +100M将查找指定目录及其子目录中大于100MB的文件。
  4. 按修改时间查找:使用-mtime-atime-ctime选项按照文件的修改时间、访问时间或状态更改时间查找文件。例如,find /path/to/directory -mtime -7将查找指定目录及其子目录中在7天内修改过的文件。
  5. 按文件权限查找:使用-perm选项按照文件权限查找文件。例如,find /path/to/directory -perm 755将查找指定目录及其子目录中权限为755的文件。
  6. 按用户或组查找:使用-user-group选项按照文件的所有者或所属组查找文件。例如,find /path/to/directory -user username将查找指定目录及其子目录中属于用户username的文件。
  7. 执行操作:使用-exec选项可以对找到的文件执行相应的操作。例如,find /path/to/directory -name "*.txt" -exec rm {} \;将删除找到的所有以.txt结尾的文件。
3.1.10 ls

ls命令可以用来列出目录的内容以及详细信息

常用参数及使用方法如下:

  • -a:显示所有文件和目录,包括隐藏文件(以.开头的文件或目录)。
  • -l:以长格式显示详细信息,包括文件权限、所有者、大小、修改时间等。
  • -h:与-l结合使用,以人类可读的方式显示文件大小(如KMG等)。
  • -R:递归列出子目录的内容。
  • -t:按文件修改时间排序显示。、

在这里插入图片描述

3.1.11 sed

sed命令是一种流编辑器,主要用于文本处理,在处理复杂的文件操作时经常用到,在后续的课程中会使用到,sed命令常用参数及使用示例如下:

  • 参数说明:
    • -e