Linux 与服务器介绍与基本使用 I
前言
相信各位中一定有很多人是因为迫不得已而使用 Linux。更深入得想一想,还有没有其他原因呢?
对于 Windows 等带图形化界面操作系统,我们所访问的其实是设计者抽象出的交互逻辑。但对于高效的系统,自底向上的彻底理解和掌握是高效使用系统的必备途径。我们得以更深入洞悉文件和文件之间的联系,获得系统更高的主动权。同时,以最小化的人机接口访问能把足够多的资源投入至计算,获得最高的资源利用率。Linux
正是带着这样的思想而诞生的。
因此,学习 Linux ,我们需要掌握:
- 对这一套思想有充分理解、能顺利玩一些玩具
- 使用现有的工具操作命令行、把他人准备好的软件运行起来
- 创造新的工具
让我们开始吧!
关于资源
我们并没有先讲怎么获得一个基于 Linux 的系统,也没有讲这到底是个什么东西。当然,不摸一摸,知道用起来舒不舒服,要了解它、安装它干啥呢?所以我们在这一讲推荐大家直接去 CLab 注册一个账号,根据上面的指南在连接到虚拟机。这样,你就可以在不破坏自己的系统的情况下,体验 Linux 的魅力了。等你被 Linux 深深吸引,就可以到我们的下一讲,看看怎么自己安装一个 Linux 系统了。我们这里以 Debian
系统为例,大家在 CLab
创建云主机的时候,镜像选择 Debian 12
即可。
先跑个小火车
先来个具体的例子,跑个小火车先。连接到你的 Linux
虚拟机,依次输入:
sudo apt update
sudo apt install -y sl
sl
就可以看到一个小火车从你的终端窗口驶过了。这个小火车是一个叫 sl
的软件,是一个玩具软件,用来矫正把 ls 打成 sl 的坏习惯展示 ASCII 艺术的。apt
是 Debian
系操作系统的包管理器,就是帮你管理软件的,sl
是一个很小的软件,所以安装的时候很快就安装好了。
大家看哈,一个程序就这么跑起来了,你已经能让 Linux 系统帮你做事情了。我们来具体看看这是怎么发生的。
你输入的命令大概是这样一个形式:
程序 子命令 选项 对象
其中,除了子命令,选项和对象都是可选的。我们就以第二个命令为例:
apt
是你要运行的程序,install
是子命令,-y
是选项,sl
是对象。很明确了是不是?那么我又怎么知道有哪些程序,这些程序又怎么用呢?
第一个问题可以通过搜索学到,描述你要干的事情,搜索引擎会告诉你需要什么软件,相信大家在第二讲已经学过,同时我们也会在第二讲给大家介绍一些常用的命令。
第二个问题,程序的作者也想到这个问题了,所以大部分程序都会带有帮助程序和帮助文档:
apt -h
:这是最简单的程序帮助,会列出一些常用的知识man apt
:这是最详细的程序帮助,会列出所有的知识,但是可能会很长tldr apt
:这个命令会给出一些使用示例,可以照着抄 (tldr
需要自行安装,相信你可以根据上面安装sl
的方法举一反三)
Linux 101
好,你现在已经知道怎么用 Linux 了,我们来介绍一下 Linux 的一些基本概念。本讲我们不会涉及到很深刻的内容,只是让大家有一个大概的印象。在后续探索中,大家会有更深入的想法。
首先我们来想一想,你刚刚输入的命令是什么?是一个叫做 sl
的程序。程序是什么?你的终端怎么知道 sl
是什么的?小火车是怎么输出到你面前的?为了成体系地解决这些问题,计算机前辈们发挥了计算机科学中”抽象“的传家本领:只要能把这些东西抽象归纳为一个概念,就可以方便地管理所有资源。
所以,“文件”这一概念被抽象出来,Unix 认为“一切皆文件”:他们是数据的容器、可读可写,可以被操作。这样,我们就可以用同样的方法来操作文件、程序、设备等等。这时候就有更多问题了:
- 文件怎么组织?
- 文件是谁的,如何反应不同类型的特性?
- 如何处理文件间的联系?
停下来想一想
tar 是 Linux 下常用的压缩解压缩工具,试试看怎么创建一个 tar 压缩包,然后解压缩它。
文件如何组织
Windows 下,物理实在先于文件而存在,你可能会看到 C D E 盘等盘符,文件是放在盘符下的。但是 Linux 中,硬盘本身也是文件,所以根目录 /
,在所有文件之前存在,所有文件都由其派生。其中,文件夹是一种特殊类型的文件,其中可以包含一系列文件和文件夹的索引。
通过 cd
命令,你可以在切换当前所在的文件夹;通过 ls
命令,你可以查看文件夹下面的内容(不加参数默认是查看当前文件夹)。路径有一些缩写,你可以认为它们会被自动扩展为从 /
出发的路径。.
是当前目录,..
是当前目录的父目录,~
是当前用户的家目录,通常为 /home/用户名
,或者 /root/
。
Linux 上,文件的路径分绝对路径和相对路径两种。绝对路径指的是以 /
为开头或者将被扩展为 /
开头的,从根目录开始查找到本文件的路径,如 /home/lcpu/hello.c
,~/hello.c
,./hello.c
(后两种都将被扩展为/home/lcpu/hello.c
)。相对路径指的是相对于当前所在文件夹,文件的存放位置。如果你的当前目录在 /home/lcpu/
,那么 hello.c
指的就是绝对路径为 /home/lcpu/hello.c 的文件
。
注意,为了安全性考虑,对于可执行文件,如果没有提供绝对路径,终端会在 PATH
中查找,而不会在基于相对路径当前文件夹下查找。如果当前文件夹中有 hello
需要使用 ./hello
进行执行。直接执行的话,终端会因为 PATH
指定的路径中没有 hello
而报错。第四讲中讲过 PATH
在 Windows 系统中的含义,Linux 中也大同小异。
试一试
在自己机器上的 /
路径下面逛逛。
查找资料并回答:/proc
和 /dev
是什么?哪个文件可以获取 CPU 的核心频率?
查阅 scp 和 rsync 的 manual,可以了解如何与远程主机之间进行文件传输。
文件是谁的,有哪些属性?
对文件的基本操作,有读、写、执行三种。作为多机系统,Linux 中文件如果对每个访问者都相同,那就没有安全性可言了。Linux 的做法是,抽象出了“用户”这个实体(其实就是在 /etc/passwd
里面定义的一行 UID 和用户名的对应而已)。为了方便用户的文件共享,同时抽象出了组(Group)的概念,代表一组互相信任的用户。
补充材料
root 是一个特殊用户,可以自行查阅资料了解。
用权限位 4、2、1 (二进制下第 3 2 1 个 bit )代表读、写、执行的权限,每个文件的读、写、执行,对应当前用户、组内用户以及其他用户组成的 3*3 矩阵,就是文件的权限。把每一类用户的权限相加可以得到当前权限的简写。
例子:750,当前用户chmod
的帮助,了解如何改变权限。
所以可执行文件并不是因为这个文件本身有什么特别,而是这个文件被你赋予了可执行的性质。 一个简单的文本文件也可以被加上可执行的权限,也可以发挥操作其他文件的作用,后文的 Shell
脚本,以及 Python
脚本,都是如此。
试一试
如果你会写 Python 的话,写一个从输入读取 4 个数字,输出他们和的程序,输出结果到控制台。
在本地跑起来这个程序之后,把 #!/usr/bin/env python3
放在脚本的第一行(这个特殊的一行叫 Shebang)。给这个脚本加上可执行的属性,然后直接运行这个文本!还记得应该如何运行一个不在 PATH 中的命令吗?
文件间的联系
文件间的联系,主要是通过文件系统的链接来实现的。Linux 中有两种链接:硬链接和软链接。硬链接是指在文件系统中,一个文件可以有多个文件名,存在于多个位置,但是文件系统中只有一份文件副本,所有链接均指向这一副本。删除其中一个文件名并不会影响文件内容,只有所有位置下的文件链接均被删除时,此文件副本才会被最终移除。软链接是指一个文件名指向另一个文件名,删除原文件名会影响软链接的有效性。
硬链接和软链接的区别在于,硬链接是文件系统的一个特性,而软链接是文件系统的一个单独的文件。硬链接只能在同一个文件系统下,而软链接可以在不同文件系统下。硬链接不能链接目录,而软链接可以链接目录。