Skip to content

Commit fcda431

Browse files
committed
Ch1 to Ch3 modifications
1 parent 8678f63 commit fcda431

File tree

6 files changed

+77
-30
lines changed

6 files changed

+77
-30
lines changed

docs/Ch01/index.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ icon: simple/linux
2626

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

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

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

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

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

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

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

@@ -194,7 +194,7 @@ Windows Server 图标
194194
Android TV 图标
195195
{: .caption }
196196

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

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

docs/Ch01/supplement.md

+9
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,10 @@ ustc@ustclug-linux101:~$
398398

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

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

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

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

541+
## 使用 Ventoy {#using-ventoy}
542+
543+
使用 Ventoy 可以简单方便地从 U 盘或者其他移动介质安装各类操作系统(且支持在一个介质中存放多个系统镜像),当然也包括 GNU/Linux。有关如何使用 Ventoy,请参考其网站[^2]
544+
537545
## 引用来源 {#references .no-underline}
538546

539547
[^1]: [Apple silicon - Wikipedia](https://en.wikipedia.org/wiki/Apple_silicon)
548+
[^2]: [Ventoy 中文网站](https://www.ventoy.net/cn/index.html)

docs/Ch02/index.md

+30-9
Original file line numberDiff line numberDiff line change
@@ -289,14 +289,14 @@ Xfce4-session 是 Xfce 的会话管理器。它的任务是保存桌面的状态
289289

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

292-
- 打开文件所在的文件夹 `../source/`
293-
- 打开目标文件夹 `../dest/`
294-
-`../source/` 文件夹拖拽文件 `file.txt``../dest/` 文件夹中
292+
- 打开文件所在的文件夹 `/path/to/source/`
293+
- 打开目标文件夹 `/path/to/dest/`
294+
-`source` 文件夹拖拽文件 `file.txt``dest` 文件夹中
295295

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

298298
```shell
299-
$ mv ../source/file.txt ../dest/
299+
$ mv /path/to/source/file.txt /path/to/dest/
300300
```
301301

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

324324
```shell
325-
./file.txt # 当前目录下的 file.txt 文件
326-
../file.txt # 上一级目录(父目录)下的 file.txt 文件
327-
../abc/file.txt # 上一级目录(父目录)下的 abc 文件夹下的 file.txt 文件
325+
file1.txt # 当前目录下的 file1.txt 文件
326+
./file1.txt # 当前目录下的 file1.txt 文件
327+
./file2.txt # 当前目录下的 file2.txt 文件
328+
../file3.txt # 上一级目录(父目录)下的 file3.txt 文件
329+
../abc/file4.txt # 上一级目录(父目录)下的 abc 文件夹下的 file4.txt 文件
330+
../../file5.txt # 上上级目录下的 file5.txt
331+
```
332+
333+
它们的关系是这样的:
334+
335+
```plain
336+
上上级目录/
337+
|___ file5.txt
338+
|___ 上一级目录/
339+
|___ file3.txt
340+
|___ 当前目录/
341+
| |___ file1.txt
342+
| |___ file2.txt
343+
|___ abc/
344+
|___ file4.txt
328345
```
329346

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

349+
特别地,用户的主目录(一般是 `/home/<用户名>`)可以被简写为 `~`。
350+
332351
#### 自动化脚本 {#shell-automation}
333352

334353
!!! tip "提示"
@@ -357,6 +376,8 @@ gcc main.c -o main.out
357376
rm main.out
358377
```
359378

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

362383
```shell
@@ -375,7 +396,7 @@ $ sh run.sh
375396

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

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

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

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

456477
```shell
457-
$ cd Desktop
478+
$ cd Desktop # 这里的 Desktop 是相对路径,指的就是当前目录下的 Desktop 文件夹
458479
$ ls
459480
```
460481

docs/Ch02/solution.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,6 @@ icon: material/tooltip-question
2323

2424
??? info "解答"
2525

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

28-
并且,安装桌面环境会占用额外的资源,尤其对于性能较低的服务器(例如在各种云服务器厂商上可以购买到的配置最低的机器,或者一些 SoC 嵌入式设备)。同时配置远程连接桌面(如使用 VNC)的过程也是比较麻烦的。
28+
并且,安装桌面环境会占用额外的资源,尤其对于性能较低的服务器(例如在各种云服务器厂商上可以购买到的配置最低的机器,或者一些 SoC 嵌入式设备)。同时配置远程连接桌面(如使用 VNC)的过程也是比较麻烦的,且桌面环境也并没有命令行环境简单可靠

docs/Ch03/index.md

+29-12
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ icon: material/folder-open
4343

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

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

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

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

8686
#### 安装 {#installation}
8787

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

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

@@ -148,6 +148,13 @@ Do you want to continue? [Y/n]
148148

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

151+
!!! tip "不确认安装"
152+
如果不希望 `apt` 询问是否安装,可以使用
153+
154+
```bash
155+
apt install -y <软件包>
156+
```
157+
151158
#### 官方软件源镜像 {#software-sources}
152159

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

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

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

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

230237
```shell
231-
$ sudo apt-get update
238+
$ sudo apt-get update # 更新本地的包列表
232239

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

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

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

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

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

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

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

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

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

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

@@ -535,7 +541,7 @@ $ less FILE
535541

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

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

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

638+
!!! tip "重命名"
639+
`mv` 命令可以作为对文件或目录重命名的方式。例如,`mv oldname newname` 可以将 `oldname` 的文件或目录重命名为 `newname`
640+
632641
### 删除文件和目录 {#rm}
633642

634643
```shell
@@ -665,6 +674,14 @@ $ rm [OPTION] FILE...
665674
$ rm -rf test1/ test2/ file1.txt
666675
```
667676

677+
!!! warning "注意目录拼写"
678+
使用 `rm` 删除时,请务必注意目录拼写。例如:
679+
680+
```shell
681+
$ rm -rf /home/ustc/folder # 删除 folder
682+
$ rm -rf / home/ustc/folder # 删除根目录下的所有文件和 home/ustc/folder 及其中的文件:这很危险!
683+
```
684+
668685
### 创建目录 {#mkdir}
669686

670687
```shell

docs/Ch04/index.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ icon: material/chip
3030

3131
## 进程 {#process}
3232

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

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

0 commit comments

Comments
 (0)