Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions docs/Ch01/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ icon: simple/linux

### 计算机操作系统 {#computer-os}

如果现在提起计算机操作系统,可能多数人的第一反应就是大名鼎鼎的 Windows,此外有些人可能也接触过 macOS 或者 Linux 的各类发行版(如:Ubuntu, Manjaro, CentOS 等),它们都是计算机操作系统。然而计算机最初并没有操作系统。在当时,许多计算机不是通用计算机,它们造出来就是为了某个特定目的而服务的,因此其架构只需要为这个目的而设计即可,无需包括完整的操作系统。另外一个原因是在晶体管时代之前,计算机体积庞大,而性能又十分有限,因此也没有能力承载通用的操作系统。随着计算机性能的提升,人们更加依赖计算机的能力,对计算机的功能要求也日渐复杂。为了能尽可能利用计算机的自动化这一特性,一些操作系统开始成型。在成型的初期,计算机操作系统的目的是为了帮助用户进行批处理操作,不过之后它们也慢慢有了新的功能:进程管理、任务调度、控制输入输出设备等。这样的操作系统逐渐形成了庞大的体系,成为了联络一般用户和计算机底层设备的中介,让用户无需关心绝大多数的底层设备,大大降低了用户的使用学习成本。
如果现在提起计算机操作系统,可能多数人的第一反应就是大名鼎鼎的 Windows,此外有些人可能也接触过 macOS 或者 Linux 的各类发行版(如:Ubuntu, Fedora, Manjaro, CentOS 等),它们都是计算机操作系统。然而计算机最初并没有操作系统。在当时,许多计算机不是通用计算机,它们造出来就是为了某个特定目的而服务的,因此其架构只需要为这个目的而设计即可,无需包括完整的操作系统。另外一个原因是在晶体管时代之前,计算机体积庞大,而性能又十分有限,因此也没有能力承载通用的操作系统。随着计算机性能的提升,人们更加依赖计算机的能力,对计算机的功能要求也日渐复杂。为了能尽可能利用计算机的自动化这一特性,一些操作系统开始成型。在成型的初期,计算机操作系统的目的是为了帮助用户进行批处理操作,不过之后它们也慢慢有了新的功能:进程管理、任务调度、控制输入输出设备等。这样的操作系统逐渐形成了庞大的体系,成为了联络一般用户和计算机底层设备的中介,让用户无需关心绝大多数的底层设备,大大降低了用户的使用学习成本。

### 现代操作系统的功能 \* {#modern-os-functions}

Expand Down Expand Up @@ -76,11 +76,11 @@ Linux 内核并不是一个完整的操作系统,因为它过于精简,单

进入 GNU/Linux 世界,便意味着与 GNU 自由软件打交道。先看看一堆字母 g 开头的应用程序:

- gcc: GNU 的 C 和 C++ 编译器
- gdb: GNU 程序调试器
- gzip: gz 格式压缩与解压缩工具
- `gcc`: GNU 的 C 和 C++ 编译器
- `gdb`: GNU 程序调试器
- `gzip`: gz 格式压缩与解压缩工具
- GNOME: 隶属于 GNU 项目的桌面环境
- gimp: GNU 图像编辑工具
- `gimp`: GNU 图像编辑工具

它们的首字母 g 都是 GNU 的缩写(当然不是所有以 g 开头的都是 GNU 软件)。许多 Linux 上的系统管理命令虽然未必以 g 开头,但都属于自由软件;还有[更多优秀的软件](https://www.gnu.org/software/),被自由软件爱好者维护、分享……选择 Linux,很大程度上是一种对极客精神与开源文化的认同。

Expand Down Expand Up @@ -194,7 +194,7 @@ Windows Server 图标
Android TV 图标
{: .caption }

## 让自己的计算机用上 Linux {#use-linux}
## 让自己的计算机用上 Linux {#use-linux} @@

有很多尚未接触过 Linux 的读者看到这里可能已经在期待或者计划让自己尽快开始使用 Linux 了。事实上,如果把 Linux 看作一个领域,那它的确是一个重视实践的领域。而且出于学习目的,在阅读本书未来的章节时在手头准备一个随时可用的 Linux 发行版是十分关键和有益的。因此,本书**强烈建议各位读者在本机安装一个属于自己的 Linux 发行版**,以供随时实践。

Expand Down
9 changes: 9 additions & 0 deletions docs/Ch01/supplement.md
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,10 @@ ustc@ustclug-linux101:~$

你可能会在老版本的 Windows 上注意到,在「添加与删除 Windows 组件」的地方,有一个「基于 UNIX 的应用程序子系统」。需要注意的是,这个选项和 WSL 没有任何关系。它也无法直接运行 Linux 或者其他 UNIX 的程序。并且,这个子系统目前也已经停止了开发。

!!! warning

请注意,**WSL 可能将主机的文件系统挂载在子系统的某个位置**。这在通常情况下会使得文件共享更加方便,但也可能导致在子系统中执行文件操作(例如文件删除)时错误地操作了主机上的文件。

### WSL 1 {#wsl1}

WSL 1 面向 Linux 应用程序提供了一套兼容的内核接口,在 Linux 程序运行的时候,WSL 1 处理(Linux 使用的)ELF 可执行文件格式,将 Linux 的系统调用翻译为 Windows 的系统调用,从而运行 Linux 程序。WSL 1 中可以访问到 Windows 下的文件,也与主机共享网络。
Expand Down Expand Up @@ -534,6 +538,11 @@ $ sudo apt-get install ubuntu-desktop

重启虚拟机,在设置中进行分辨率的修改。

## 使用 Ventoy {#using-ventoy}

使用 Ventoy 可以简单方便地从 U 盘或者其他移动介质安装各类操作系统(且支持在一个介质中存放多个系统镜像),当然也包括 GNU/Linux。有关如何使用 Ventoy,请参考其网站[^2]。

## 引用来源 {#references .no-underline}

[^1]: [Apple silicon - Wikipedia](https://en.wikipedia.org/wiki/Apple_silicon)
[^2]: [Ventoy 中文网站](https://www.ventoy.net/cn/index.html)
39 changes: 30 additions & 9 deletions docs/Ch02/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -289,14 +289,14 @@ Xfce4-session 是 Xfce 的会话管理器。它的任务是保存桌面的状态

使用命令行操作可以减少鼠标操作,我们经常可以使用一条命令来代替好几次的鼠标单击。例如如果我们想要移动某一个文件,我们要执行下面步骤:

- 打开文件所在的文件夹 `../source/`
- 打开目标文件夹 `../dest/`
- 从 `../source/` 文件夹拖拽文件 `file.txt` 到 `../dest/` 文件夹中
- 打开文件所在的文件夹 `/path/to/source/`
- 打开目标文件夹 `/path/to/dest/`
- 从 `source` 文件夹拖拽文件 `file.txt` 到 `dest` 文件夹中

然而使用命令行,我们只需要执行一条指令。

```shell
$ mv ../source/file.txt ../dest/
$ mv /path/to/source/file.txt /path/to/dest/
```

可能在初学者看来,熟记这条指令并不容易,但是从长远上看,熟悉了命令行之后再加上有自动补全的 shell 程序,使用命令行可以节省大量时间。
Expand All @@ -322,13 +322,32 @@ $ mv ../source/file.txt ../dest/
另外,以上的路径都是绝对路径,还有一种「相对路径」:

```shell
./file.txt # 当前目录下的 file.txt 文件
../file.txt # 上一级目录(父目录)下的 file.txt 文件
../abc/file.txt # 上一级目录(父目录)下的 abc 文件夹下的 file.txt 文件
file1.txt # 当前目录下的 file1.txt 文件
./file1.txt # 当前目录下的 file1.txt 文件
./file2.txt # 当前目录下的 file2.txt 文件
../file3.txt # 上一级目录(父目录)下的 file3.txt 文件
../abc/file4.txt # 上一级目录(父目录)下的 abc 文件夹下的 file4.txt 文件
../../file5.txt # 上上级目录下的 file5.txt
```

它们的关系是这样的:

```plain
上上级目录/
|___ file5.txt
|___ 上一级目录/
|___ file3.txt
|___ 当前目录/
| |___ file1.txt
| |___ file2.txt
|___ abc/
|___ file4.txt
```

每个正在运行中的进程(包括 Shell)都有自己的「当前工作目录」(当前所在的目录),进程可以切换自己的当前工作目录,以上的相对路径都是相对于当前工作目录的。可以发现,不管当前工作目录在哪里,绝对路径对应的文件都是一致的,而相对路径对应的文件就会随着当前工作目录的变化而变化。

特别地,用户的主目录(一般是 `/home/<用户名>`)可以被简写为 `~`。

#### 自动化脚本 {#shell-automation}

!!! tip "提示"
Expand Down Expand Up @@ -357,6 +376,8 @@ gcc main.c -o main.out
rm main.out
```

和其他地方不一样,在 Shell 中运行程序时,程序名(`main.out`)前面必须有 `./`。这是因为因为我们的工作目录不包含在环境变量(`$PATH`)中,故如果不加 `./` 则系统会找不到程序。系统中安装的程序(例如 `gcc`)一般会放在 `$PATH` 环境变量中包含了的路径下,故运行它们不需要使用 `./`。

之后我们直接输入

```shell
Expand All @@ -375,7 +396,7 @@ $ sh run.sh

#### 进行高级的系统维护工作 {#shell-system-maintenance}

一些高级的系统维护任务只能通过命令行来完成,因为相关的程序并没有提供图形界面的控制面板,或者需要手工编写复杂的配置文件。
一些高级的系统维护任务只能通过命令行来完成,或者需要手工编写复杂的配置文件,因为相关的程序并没有提供图形界面的控制面板

#### 使用命令行看上去很酷 {#shell-duang}

Expand Down Expand Up @@ -454,7 +475,7 @@ Desktop Documents Music Pictures Public Templates Videos
#### 示例 3 {#shell-commands-example-3}

```shell
$ cd Desktop
$ cd Desktop # 这里的 Desktop 是相对路径,指的就是当前目录下的 Desktop 文件夹
$ ls
```

Expand Down
4 changes: 2 additions & 2 deletions docs/Ch02/solution.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@ icon: material/tooltip-question

??? info "解答"

在 Linux 服务器的环境下,桌面环境不是必需品。我们知道,与 Windows 不同,Linux 下桌面环境也只是一个(可选的)软件。服务器中的配置完全可以在命令行中完成。
在 Linux 服务器的环境下,桌面环境不是必需品。我们知道,Linux 下桌面环境也只是一个(可选的)软件(Windows Server 中,桌面环境也不是必须安装的)。服务器中的配置完全可以在命令行中完成。

并且,安装桌面环境会占用额外的资源,尤其对于性能较低的服务器(例如在各种云服务器厂商上可以购买到的配置最低的机器,或者一些 SoC 嵌入式设备)。同时配置远程连接桌面(如使用 VNC)的过程也是比较麻烦的。
并且,安装桌面环境会占用额外的资源,尤其对于性能较低的服务器(例如在各种云服务器厂商上可以购买到的配置最低的机器,或者一些 SoC 嵌入式设备)。同时配置远程连接桌面(如使用 VNC)的过程也是比较麻烦的,且桌面环境也并没有命令行环境简单可靠
45 changes: 33 additions & 12 deletions docs/Ch03/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ icon: material/folder-open

有了软件仓库,我们不需要手动下载大量的软件包再通过包管理器安装。只需要知道软件在软件仓库中的名称,即可让包管理器从网络中抓取到相应的软件包到本地,自动进行安装。

但是与应用商店相比,使用包管理器安装需要预先知道所需软件在软件仓库中的对应包名,和应用商店相比无法进行模糊搜索(不过你也可以在包管理器官网上进行查找包名,再通过包管理器安装)。
但是与应用商店相比,使用包管理器安装需要预先知道所需软件在软件仓库中的对应包名,和应用商店相比无法进行模糊搜索(不过你也可以在包管理器官网或者通过包管理器的命令行前端查找包名,再通过包管理器安装)。

包管理系统有很多,比如管理 Debian (.deb) 软件包的 `dpkg` 以及它的前端 `apt`(用于 Debian 系的发行版);`rpm` 包管理器以及它的前端 `dnf`(用于 Fedora 和新版的 CentOS 和 RHEL)、前端 `yum`(用于 CentOS 7 和 RHEL 7 等);`pacman` 包管理器(用于 Arch Linux 和 Manjaro)等等。

Expand Down Expand Up @@ -85,7 +85,7 @@ firefox/bionic-updates,bionic-security,now 72.0.2+build1-0ubuntu0.18.04.1 amd64

#### 安装 {#installation}

在确定了软件包的包名后,可以通过 `apt install <包名>` 进行安装
在确定了软件包的包名后,可以通过 `apt install <包名>` 安装软件包。如果需要一次性安装多个包,可以用 `apt install <包名1> <包名2> ...` 的写法

下面是 `apt install firefox` 安装火狐浏览器的输出结果示例。

Expand Down Expand Up @@ -148,6 +148,14 @@ Do you want to continue? [Y/n]

具体有关权限的知识点将在[第五章](../Ch05/index.md)展开。

!!! tip "不确认安装"

如果不希望 `apt` 询问是否安装,可以使用

```bash
apt install -y <软件包>
```

#### 官方软件源镜像 {#software-sources}

通过 apt 安装的软件都来源于相对应的软件源,每个 Linux 发行版一般都带有官方的软件源,在官方的软件源中已经包含了丰富的软件,apt 的软件源列表在 `/etc/apt/sources.list` 下。
Expand Down Expand Up @@ -211,7 +219,7 @@ Ubuntu 官方源位于国外,往往会有速度与延迟上的限制,可以
$ sudo sed -i 's|//.*archive.ubuntu.com|//mirrors.ustc.edu.cn|g' /etc/apt/sources.list
```

当然也可以直接使用 vimnano 等文本编辑器进行修改。
当然也可以直接使用 `vim`、`nano` 等文本编辑器进行修改。

#### 第三方软件源 {#third-party-software-sources}

Expand All @@ -228,7 +236,7 @@ Ubuntu 官方源位于国外,往往会有速度与延迟上的限制,可以
1. 安装需要的的软件包

```shell
$ sudo apt-get update
$ sudo apt-get update # 更新本地的包列表

$ sudo apt-get install \
ca-certificates \
Expand Down Expand Up @@ -444,14 +452,10 @@ Ubuntu 官方源位于国外,往往会有速度与延迟上的限制,可以
(Output omitted)
```

这个目录下的 `clang` 和 `clang++` 就类似于我们比较熟悉的 `gcc` 和 `g++`。这两个是可以直接运行进行编译源代码的可执行文件。

当然,我们不能每次在需要编译程序的时候输入如此长的路径找到 `clang` 和 `clang++`,而更希望的是能够像 `apt` 那样在任何地方都可以直接运行。

我们可以这样做:
这个目录下的 `clang` 和 `clang++` 就类似于我们比较熟悉的 `gcc` 和 `g++`。这两个是可以直接运行进行编译源代码的可执行文件。当然,我们不能每次在需要编译程序的时候输入如此长的路径找到 `clang` 和 `clang++`,而更希望的是能够像 `apt` 那样在任何地方都可以直接运行。我们可以这样做:

```shell
$ # 将 clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04 目录下的所有内容复制到 /usr/local/ 下
$ # 将 clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04 目录下的所有内容复制到 /usr/local/ 下
$ sudo cp -R * /usr/local/
```

Expand All @@ -466,13 +470,17 @@ Ubuntu 官方源位于国外,往往会有速度与延迟上的限制,可以

在上面的复制过程中,源目录和目标目录的两个 `bin` 目录会相互合并,`clang` 和 `clang++` 两个可执行文件也就被复制到了 `/usr/local/bin/` 目录中。这样子也就达到了我们希望能够在任意地方调用我们的可执行文件的目的。此外,在复制的时候 lib、doc 等文件夹也会和 `/usr/local` 下的对应目录合并,将 clang 的库和文档加到系统当中。

!!! warning "有关手工获取的软件"

对于手工从 Internet 或者其他来源获取到的软件,在使用前务必注意检查其完整性(例如检查压缩文件的 hash 和官方网站上提供的是否一致)和安全性。运行有问题的程序,或者特别是安装有问题的程序(例如上面那样安装到 `/usr/local`),会导致系统安全受到损害。如非必要,请尽可能使用包管理器从官方软件源中安装软件。

### 更多用法 {#more-usage}

关于软件包管理器的更多用法可查看 [Pacman/Rosetta](https://wiki.archlinuxcn.org/wiki/Pacman/Rosetta) 页面,该页展示了一些流行的 Linux 发行版包管理器命令以及命令操作内容的对应关系。

### 使用源代码编译安装 {#compiling-installation}

此部分内容请见拓展阅读:[编译安装](supplement.md)。
此部分内容请见拓展阅读:[编译安装](supplement.md#compiling-installation)。

## 操作文件与目录 {#operate-files-and-dirs}

Expand Down Expand Up @@ -535,7 +543,7 @@ $ less FILE

### 编辑文件内容 {#nano}

Nano 是在很多机器上自带的命令行文本编辑器,相比于 vim 和 emacs 来说,对新手更加友好,不需要提前记忆复杂的键位。
Nano 是在很多机器上自带的命令行文本编辑器,相比于 vim 和 emacs 来说,对新手更加友好,不需要提前记忆复杂的键位。如果 Nano 没有被默认安装,则可以通过 `apt` 来安装。

```shell
$ nano file.txt # 使用 nano 编辑 file.txt 文件(如果没有则创建)
Expand Down Expand Up @@ -629,6 +637,10 @@ $ mv [OPTION] SOURCE... DIRECTORY
| `-f`, `--force` | 覆盖目标地址同名文件 |
| `-u`, `--update` | 仅当源文件比目标文件新才进行移动 |

!!! tip "重命名"

`mv` 命令可以作为对文件或目录重命名的方式。例如,`mv oldname newname` 可以将 `oldname` 的文件或目录重命名为 `newname`。

### 删除文件和目录 {#rm}

```shell
Expand Down Expand Up @@ -665,6 +677,15 @@ $ rm [OPTION] FILE...
$ rm -rf test1/ test2/ file1.txt
```

!!! warning "注意目录拼写"

使用 `rm` 删除时,请务必注意目录拼写。例如:

```shell
$ rm -rf /home/ustc/folder # 删除 folder
$ rm -rf / home/ustc/folder # 删除根目录下的所有文件和 home/ustc/folder 及其中的文件:这很危险!
```

### 创建目录 {#mkdir}

```shell
Expand Down
2 changes: 1 addition & 1 deletion docs/Ch04/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ icon: material/chip

## 进程 {#process}

在导言中提到的「桌面环境、浏览器、聊天软件、办公软件、游戏、终端,以及后台运行着的系统服务」,它们都是进程。简单而不太严谨地来说,进程就是正在运行的程序:当我们启动一个程序的时候,操作系统会从硬盘中读取程序文件,将程序内容加载入内存中,之后 CPU 就会执行这个程序。
在导言中提到的「桌面环境、浏览器、聊天软件、办公软件、游戏、终端,以及后台运行着的系统服务」,它们都是进程。简单而不太严谨地来说,进程就是已被载入的程序:当我们启动一个程序的时候,操作系统会从硬盘中读取程序文件,将程序内容加载入内存中,之后 CPU 就会执行这个程序,也就能看到一个“进程”

进程是现代操作系统中必不可少的概念。在 Windows 中,我们可以使用「任务管理器」查看系统运行中的进程;Linux 中同样也有进程的概念。下面我们简单介绍 Linux 中的进程。

Expand Down
Loading