Skip to content

Commit 7d52cd5

Browse files
committed
Fix taoky's PR suggestions. Add fix to ch04.
1 parent 59b4495 commit 7d52cd5

File tree

5 files changed

+29
-22
lines changed

5 files changed

+29
-22
lines changed

Diff for: docs/Ch01/index.md

+5-6
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,10 @@ Linux 内核并不是一个完整的操作系统,因为它过于精简,单
7676

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

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

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

@@ -194,7 +193,7 @@ Windows Server 图标
194193
Android TV 图标
195194
{: .caption }
196195

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

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

Diff for: docs/Ch01/supplement.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ ustc@ustclug-linux101:~$
400400

401401
!!! warning
402402

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

405405
### WSL 1 {#wsl1}
406406

Diff for: docs/Ch02/index.md

+6-2
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ $ mv /path/to/source/file.txt /path/to/dest/
305305

306306
对于不太熟悉命令行的用户来说,路径的概念可能会在最开始带来一些困惑。这里做一些简单的介绍。
307307

308-
在 Windows 系统下,路径是以反斜杠 `\` 分隔的,例如:
308+
在 Windows 系统下,路径是以反斜杠 `\` 分隔的(Windows 系统也可以使用 `/` 分隔路径),例如:
309309

310310
```
311311
C:\Windows\explorer.exe
@@ -346,7 +346,7 @@ $ mv /path/to/source/file.txt /path/to/dest/
346346

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

349-
特别地,用户的主目录(一般是 `/home/<用户名>`)可以被简写为 `~`。
349+
特别地,用户的主目录(一般是 `/home/<用户名>`)可以被简写为 `~`。例如,`~/work/test.c` 可能是 `/home/ustc/work/test.c` 的缩写。
350350

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

@@ -378,6 +378,10 @@ rm main.out
378378

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

381+
!!! tip "为何需要加上 `./`"
382+
383+
一个简单的原因是,如果像 Windows 那样直接输入可执行文件的名称就能运行程序的话,攻击者可能将恶意代码写入到用户工作目录下以一些常见的命令(例如 `ls` 和 `cat`)为名称的文件中,并加入执行(`x`)权限。不知情的用户执行这些命令就会导致恶意代码的运行。而 Linux 系统下不加 `./` 运行的是 `PATH` 环境变量中列出的目录下的可执行文件,这些位置一般只有 `root` 用户能写入,避免了上面的问题。此外另一个原因是,这还避免了用户的程序和系统中安装的程序因为重名而冲突。
384+
381385
之后我们直接输入
382386

383387
```shell

Diff for: docs/Ch03/index.md

+7-5
Original file line numberDiff line numberDiff line change
@@ -148,14 +148,16 @@ Do you want to continue? [Y/n]
148148

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

151-
!!! tip "不确认安装"
151+
!!! tip "跳过安装确认"
152152

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

155155
```bash
156156
apt install -y <软件包>
157157
```
158158

159+
这在编写无交互的**自动化脚本**时特别好用(例如那些能自动安装一系列依赖包的安装脚本)。但是,在这些脚本中,建议使用 `apt-get`,因为相对古老的 `apt-get` 的命令行参数比较稳定,而 `apt` 则有可能会变化,这对脚本的向后兼容性是不利的。
160+
159161
#### 官方软件源镜像 {#software-sources}
160162

161163
通过 apt 安装的软件都来源于相对应的软件源,每个 Linux 发行版一般都带有官方的软件源,在官方的软件源中已经包含了丰富的软件,apt 的软件源列表在 `/etc/apt/sources.list` 下。
@@ -661,19 +663,19 @@ $ rm [OPTION] FILE...
661663

662664
* 删除 `file1.txt` 文件:
663665

664-
```
666+
```shell
665667
$ rm file1.txt
666668
```
667669

668670
* 删除 `test` 目录及其下的所有文件:
669671

670-
```
672+
```shell
671673
$ rm -r test/
672674
```
673675

674676
* 删除 `test1/`、`test2/`、`file1.txt` 这些文件、目录。其中,这些文件或者目录可能不存在、写保护或者没有权限读写:
675677

676-
```
678+
```shell
677679
$ rm -rf test1/ test2/ file1.txt
678680
```
679681

Diff for: docs/Ch04/index.md

+10-8
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,15 @@ icon: material/chip
3030

3131
## 进程 {#process}
3232

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

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

3737
### 查看当前运行的进程 {#view-process}
3838

3939
#### htop {#htop}
4040

41-
Htop 可以简单方便查看当前运行的所有进程,以及系统 CPU、内存占用情况与系统负载等信息。
41+
htop 可以简单方便查看当前运行的所有进程,以及系统 CPU、内存占用情况与系统负载等信息。
4242

4343
使用鼠标与键盘都可以操作 htop。Htop 界面的最下方是一些选项,使用鼠标点击或按键盘的 ++"F1"++ 至 ++"F10"++ 功能键可以选择这些功能,常用的功能例如搜索进程(++"F3"++, Search)、过滤进程(++"F4"++, Filter,使得界面中只有满足条件的进程)、切换树形结构/列表显示(++"F5"++, Tree/List)等等。
4444

@@ -79,15 +79,15 @@ root 14 0.0 0.0 0 0 ? S 02:33 0:00 [migration/0]
7979

8080
按照 PID 排序时,我们可以观察系统启动的过程。Linux 系统内核从引导程序接手控制权后,开始内核初始化,随后变为 **init\_task**,初始化自己的 PID 为 0。随后创建出 1 号进程(init 程序,目前一般为 systemd)衍生出用户空间的所有进程,创建 2 号进程 kthreadd 衍生出所有内核线程。随后 0 号进程成为 idle 进程,1 号、2 号并非特意预留,而是产生进程的自然顺序使然。
8181

82-
由于 kthreadd 运行于内核空间,故需按大写 K(++"Shift"++ + ++"k"++)键显示内核进程后才能看到。然而无论如何也不可能在 htop 中看到 0 号进程本体,只能发现 1 号和 2 号进程的 PPID 是 0。
82+
由于 kthreadd 运行于内核空间,故需按大写 K(++"Shift"++ + ++"k"++)键显示内核进程后才能看到。然而无论如何也不可能在 htop 中看到 0 号进程本体,只能发现 1 号和 2 号进程的 PPID (Parent PID) 是 0。
8383

8484
### 进程优先级与状态 {#process-priority-and-stat}
8585

8686
我们平时使用操作系统的时候,可能同时会开启浏览器、聊天软件、音乐播放器、文本编辑器……前面提到它们都是进程,但是单个 CPU 核心一次只能执行一个进程。为了让这些软件看起来「同时」在执行,操作系统需要用非常快的速度将计算资源在这些进程之间切换,这也就引入了进程优先级和进程状态的概念。
8787

8888
#### 优先级与 nice 值 {#nice}
8989

90-
有了进程,谁先运行?谁给一点时间就够了,谁要占用大部分 CPU 时间?这又是如何决定的?这些问题之中体现着优先权的概念。如果说上面所介绍的的那些进程属性描述了进程的控制信息,那么**优先级**则反映操作系统调度进程的手段。在 htop 的显示中有两个与优先级有关的值:Priority(PRI)和 **nice(NI)**。以下主要介绍用户层使用的 nice 值。
90+
有了进程,谁先运行?谁给一点时间就够了,谁要占用大部分 CPU 时间?这又是如何决定的?这些问题之中体现着优先权的概念。如果说上面所介绍的的那些进程属性描述了进程的控制信息,那么**优先级**则反映操作系统调度进程的手段。在 htop 的显示中有两个与优先级有关的值:**Priority(PRI)** **nice(NI)**。以下主要介绍用户层使用的 nice 值。
9191

9292
Nice 值越高代表一个进程对其它进程越 "nice"(友好),对应的优先级也就更低。Nice 值最高为 19,最低为 -20。通常,我们运行的程序的 nice 值为 0。我们可以打开 htop 观察与调整每个进程的 nice 值。
9393

@@ -114,7 +114,9 @@ $ renice -n 10 -p 12345 # 设置 PID 为 12345 的进程的 nice 值为 10
114114

115115
在实际的 Linux 系统中,进程的状态分类要稍微复杂一些。在 htop 中,按下 H 键到帮助页,可以看到对进程状态的如下描述:
116116

117-
Status: R: running; S: sleeping; T: traced/stopped; Z: zombie; D: disk sleep
117+
```
118+
Status: R: running; S: sleeping; T: traced/stopped; Z: zombie; D: disk sleep
119+
```
118120

119121
其中 R 状态对应上文的运行和就绪态(即表明该程序可以运行),S 和 D 状态对应上文阻塞态。
120122

@@ -345,7 +347,7 @@ $ tmux
345347

346348
在没有使用 tmux 时,我们无法将命令行界面状态保留下一次登录。这其中最关键的矛盾在于,只要终端关闭,当前 session 下所有进程默认结束(当然也可以像上面实验那样不响应 SIGHUP)。解决这个问题的思路之一便是在 SSH 断开时保证终端的存在。而 tmux 即可做到这一点。
347349

348-
tmux 做了什么呢?它把在上面运行的所有 shell 托管在一个单独的会话中,与当前终端脱离。并且每一个 shell 有不同的 pty。而当前终端下的 tmux,仅仅是一个客户端,需要连接哪个 session,就使用 attach 命令让客户端与服务程序通信,把客户端所在终端的输入定向到由服务端掌控的被绿框框选的特定终端中,从而完成对各个 pane 的交互。
350+
tmux 做了什么呢?它把在上面运行的所有 shell 托管在一个单独的会话中,与当前终端脱离。并且每一个 shell 有不同的 pty (pseudoterminal)。而当前终端下的 tmux,仅仅是一个客户端,需要连接哪个 session,就使用 attach 命令让客户端与服务程序通信,把客户端所在终端的输入定向到由服务端掌控的被绿框框选的特定终端中,从而完成对各个 pane 的交互。
349351

350352
## 服务 {#service}
351353

@@ -401,7 +403,7 @@ $ systemctl status
401403

402404
!!! tip "Less 翻页器"
403405

404-
当我们在终端中使用 systemd 组件时,如果输出内容较多,systemd 会使用 less 作为翻页器(Pager),方便我们阅读。
406+
当我们在终端中使用 systemd 组件时,如果输出内容较多,systemd 会使用 `less` 作为翻页器(Pager),方便我们阅读。
405407

406408
上面命令所列出的是系统中正在运行的服务,若想了解全部服务内容,可以运行 `systemctl list-units` 来查看。该命令将显示所有 systemd 管理的单元,同时右面还会附上一句注释来表明该服务的任务。
407409

@@ -614,7 +616,7 @@ crontab 的配置格式很简单,对于配置文件的每一行,前半段为
614616
# 每天凌晨 3 点 05 分将查询到的公网 ip 发送到自己的邮箱 (假设半夜 3 点重新拨号)
615617
```
616618

617-
如果这里解释得尚不清楚,可以访问 <https://crontab.guru/>,该网站可以将配置文件中的时间字段翻译为日常所能理解的时间表示。
619+
如果这里解释得尚不清楚,可以访问 <https://crontab.guru/>,该网站可以将配置文件中的时间字段翻译为日常所能理解的时间表示。此外,还可以查看 crontab 的 man 文档(`man 5 crontab`)。
618620

619621
![crontab](images/crontab.gif)
620622

0 commit comments

Comments
 (0)