首页 Linux 学习笔记:从科研使用需求出发
文章
取消

Linux 学习笔记:从科研使用需求出发

经典外行人疑惑

下面这些问题大概是外行人的经典疑惑,也是我在接触深度学习领域前长期悬而未决的问题。但很多事情用下面这几个 QA 就说清楚了。

Q:为什么要学习使用 Linux 系统?

A:因为要用研究组里的服务器,服务器一般是 Linux 系统。

Q:服务器是什么?

A:就是一台配置高得很的电脑,它干起活来效率很高。

Q:你用服务器做什么?

A:做深度学习领域的大型实验。

Q:自己电脑不行吗,为什么要用服务器?

A:众所周知,深度学习实验主要使用部署在服务器上的 GPU 计算资源,个人电脑跑不动。

Q:Linux 系统不是和 Windows、Mac 一回事,都是操作系统吗,怎么还要单独学习?

A:服务器上的 Linux 主要是命令行控制的,而不是图形界面。这可不是普通的点点鼠标的人性化电脑。

所以,学习 Linux 只要满足科研使用需求即可,了解这个操作系统的基本逻辑,学一些必要的命令。没必要漫无目的地抱着一本厚厚的技术书从头到尾啃下来。国内比较知名的书可能是《鸟哥的 Linux 私房菜》,但这本书着实和看小说一样,废话太多太磨叽。我选择参考的是 The Linux Documentation Project 上的 《Introduction to Linux》,比较精要也比较权威。

我的科研使用需求,就是用服务器做深度学习的实验,对于 Linux 系统,只需学会这些即可:

  • 逻辑层面:基本概念,多用户系统的逻辑、命令系统的逻辑、文件系统逻辑;
  • 操作层面:平时常用的服务器终端命令。

一、Linux 系统的逻辑

基本概念

Linux 的那些能讲出一本书的历史实在是没必要看,只需要搞明白发行版这个概念。

首先要适应 Linux 是“开源”的这件事,与 Windows、Mac 都不一样,它们完全受自家公司控制,也就只有一套版本号例如 WinXP -> Win7 -> Win10,Mac 的 Catalina -> Big Sur -> Monterey。Linux 系统的核心从诞生之日起就是开源的(不属于某个个人或公司,任何人都可以贡献并使用),于是就有各路人套壳包装变成一套有头有脸的操作系统。

前者那个由 Linux 社区维护更新的核心就叫 Linux 核心(kernel),后者由其他公司或社区包装好的叫发行版(Distribution)。核心顾名思义就是操作系统最必要的功能,发行版除核心外还包括一些重要软件、工具、系统的安装包等,让这个核心更能用。

我们当然无法直接使用核心,用的都是某个发行版。所以给电脑装 Linux 就是找一个喜欢的发行版,下载好系统镜像,和平时装系统一样一步步安装即可:

ld

自然地,一个 Linux 系统有两套版本号:一套是 Linux 核心的版本号(在此查看),一套是发行版的版本号(在各发行版的官网查看)。

账户系统

Linux 系统的重要特性是多账户系统,主要是因为使用 Linux 的服务器通常是供多人使用的,必须设计多账户机制以防使用混乱(实际上 Windows、Mac 也有,但很少使用)。Linux 账户分为:

  • 管理员(root)账户:负责管理机器的,有很多更高的关于机器的权限
  • 普通账户:普通使用者的账户,人很多时可以划到不同群组进行更细致的管理

以我们研究组的服务器为例,管理员目前是大师兄,负责管理维修这台服务器;普通用户就是其他研究生,每个人都有一个号,是向管理员申请的普通账户。

登录服务器账户并操作的方式一般为远程的,即在另一台电脑上进入服务器的命令行。北大的情况是,只要连接校园网,即可以通过 SSH 登录在校园网环境中的服务器。

由于服务器的使用性质,机器都是常年开着机的,一般都是以登入登出的方式使用的,开关机会影响他人使用。因此只有管理员开关机的权限。

命令系统

除了图形界面(点鼠标的),操作系统都可以通过在命令行输入命令控制电脑。这个命令行本身也是一个程序,叫做(Shell):Windows 为 cmd(或更高级的 PowerShell),Linux 为 Bash( Mac 使用了更高级的 Zsh,兼容 Bash)。

壳总是会生成提示字符串,示意在其后输入指令,它包含当前账户、文件路径等信息,并以一个提示符与输入的命令分隔:cmd 为 >,Bash 为 $,Zsh 为 %。提示字符串格式为(以 Bash 为例):

账户名 @ 机器名 : 当前路径 $(提示符)

一个指令的格式为:指令名和若干个选项及其参数(各部分以空格隔开)。选项是本指令的细化设置,格式为 -单个字母 ,或 –单词(前者是后者的缩写)。选项通常包含一些参数需要填写,就放在选项的后面。

指令有两种类型,一种是像上面这样敲完指令与选项、参数立即执行,执行后回到命令行提示符;另一种是敲完指令名回车,进入到某个环境,例如命令行里的文本编辑器、python 等。

除了系统自带的指令,可执行文件也可以作为指令执行:进入此文件的目录,输入文件名敲回车即可;或者直接打出文件的路径敲回车。

注意:执行文件与打开/编辑文件不是一个概念。执行必须是可执行文件。在 Linux 系统下,文件是否可执行是以文件权限区分的,可以修改。

除了在命令行敲命令外,还可以像写程序一样组合一系列指令为脚本,运行脚本文件等效于在命令行依次敲击里面的命令。脚本文件是文本文件(通常以 sh 扩展名区分),需要将其权限设为可执行。(因此,Shell 下执行文本文件都视其为自己的脚本,不管其扩展名是什么)

壳作为一个程序,也有自己的配置,如环境变量。这些配置信息通常放在一个配置文件中,常见的如 .bash_profile.bashrc.zshrc 等。

文件系统

操作系统的文件系统基本没什么区别,了解一些 Linux 特有的东西即可:

一是路径格式,根目录为 “/”,绝对路径即从根目录向下,也是用 / 分开的,最后一个 / 可带可不带;相对路径的记号总结如下:

  • ./ :表示当前目录
  • ../ :表示上一级目录
  • -/ : 表示上次的目录
  • ~/ :表示当前用户(提示字符串里写了)目录,用户目录见下文
  • ~用户名/ :表示此用户名的用户目录

二是文件目录的组织,都有哪些文件夹,里面都放什么文件。

  • Linux 不涉及磁盘分区,根目录里就包含了所有文件;
  • 用户目录就是一个账户自己的目录,有了一个账户后,当然要有自己的一块小空间!所有用户的用户目录都在根目录中的 /home ,用户目录的名称就是账户名;
  • 根目录中的 /root 是管理员的用户目录。但管理员日常使用不会用这个身份,使用这个目录,一般会用一个普通账户;
  • 根目录中的其他目录一般都是系统或全局的文件,普通用户不必也没有权限管理它们,就别管了。

三是文件权限,这是多账户避免不了讨论的问题。Linux 所有文件和文件夹都有权限,形式化为长度10的字符串:

  • 第1位表示文件类型:只需知道 d 表示文件夹, - 表示普通文件,l 表示链接即可;
  • 后面的位都可看作开关,- 表示权限关闭,字母表示权限打开:
    • 第2-4位分别表示拥有者的读(r)、写(w)、执行(x)权限;
    • 第5-7位分别表示同群组的用户的读(r)、写(w)、执行(x)权限;
    • 第8-10位分别表示其他人的读(r)、写(w)、执行(x)权限;

应注意,Linux 不是以后缀区分可执行文件的,而是由文件权限中的执行权限(x)决定的。

二、Linux 必备操作

以下涉及的操作都不需要管理员权限。关于管理员要用的操作,还是等我成为组里服务器的管理员时再说吧!

账户操作

操作命令
远程登入账户ssh 用户名@服务器地址 (在其他电脑)
退出账户exit
查看当前在线用户whow
查看用户登录日志last

系统级信息查看

操作命令
任务管理器top

浏览操作

操作命令使用场景
查看当前路径pwd想复制一个绝对路径出来
更改路径cd + 路径名浏览各目录,最常用操作
列出当前路径下的文件ls ll(详细) ls -a(显示隐藏文件) 
(在命令行)查看文件cat + 文件名 
(使用默认软件)打开文件/文件夹(仅 Mac)open + 文件名/路径名MacOS 中想要转到图形化界面操作时
查找文件/文件夹find + 文件名/路径名(支持正则表达式) 

文件整体修改操作

操作命令
创建文件touch + 文件名
创建文件夹mkdir + 文件夹名
移动mv + 文件路径 + 目标路径
复制cp + 文件路径 + 目标路径
重命名mv + 文件名 + 新文件名
删除文件rm + 文件路径(支持正则表达式)
删除文件夹rm -r + 文件夹路径
跨设备复制文件(在待移动文件设备上)scp + 文件路径 + 目标路径
注意:服务器路径前加 username@servername: 
下载链接文件wget + 文件链接

文件内部编辑操作

可以通过 open 命令在外部软件中打开然后编辑,这里讨论在命令行内部编辑文件。

方式一:echo 命令

  • echo + 字符串 > 文件路径:写入字符串到文件;
  • echo + 字符串 >> 文件路径:追加字符串到文件。

这种方式通常适合在空文件中写入一些简单的东西,或者在配置文件中加一条规则。

方式二:使用 Linux 命令行里的文本编辑器是 Vim

输入 vim + 文件路径 以进入 Vim 环境编辑此文件。具体使用方法详见我的这篇 Vim 学习笔记。如果从未接触过,可能会非常不习惯,这种方式还是只适合临时的少量的文本修改。

如果嫌麻烦,还是写好了移动到服务器上吧!最好是有一个图形界面的东西辅助我们!

很多 Linux 发行版是有图形界面的,为何不用呢?道理很简单,服务器那台机器就是个大箱子,连显示屏都没有,管理员连装都不想装,没必要!而且都是远程访问它的,要想远程看到系统的图形界面,岂不是还要传输图形界面的画面?想想 Windows 远程桌面有多难用就知道了!

但是我这里说的图形界面不是这个!在远程控制服务器的电脑上装一些软件如 VSCode,可以借它与服务器交互信息,让它在你的电脑本地给你整理出来一个图形界面(而不是直接把服务器安装的图形界面图像传输过来)。

VSCode 中安装 “Remote - SSH” 扩展后,边栏会出现一台小电脑按钮。在 SSH TARGETS 处点击加号,即远程 SSH 连接到服务器。连接成功后点击边栏的文件按钮,就可以打开服务器上的文件夹了。此时的 VSCode 就变成了一个图形界面的文件管理器,移动、复制、删除、查看、运行等文件操作均可通过鼠标点击实现,省下了在命令行里输命令的麻烦。

有些机构或公司会有自己的服务器客户端(例如我们学院的公用服务器),效果类似 VSCode 的图形界面,具体怎么用参考相应的帮助。

程序

运行 sh 程序:bash xx.sh 查看显卡:nvidia-smi

三、Linux 进阶操作

这些操作可能是非必需的,但能在效率上锦上添花。

命令行快捷键

  • Tab:命令自动补全;
  • Ctrl + C:强行结束命令 / 从程序环境中回到命令行提示符;
  • Shift + PageUp / PageDown:翻页(这个操作无法用滚轮实现)

其他尚未更新。

本文由作者按照 CC BY 4.0 进行授权,转载请注明

数学课程手写笔记总结

深度学习科研方法论(非知识或技术)