经典外行人疑惑
下面这些问题大概是外行人的经典疑惑,也是我在接触深度学习领域前长期悬而未决的问题。但很多事情用下面这几个 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 就是找一个喜欢的发行版,下载好系统镜像,和平时装系统一样一步步安装即可:
自然地,一个 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 |
查看当前在线用户 | who 或 w |
查看用户登录日志 | 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
:翻页(这个操作无法用滚轮实现)
其他尚未更新。