Skip to content

Commit 08cb3f0

Browse files
authored
Merge pull request #64 from ustclug/101-winter
2025 Winter Review
2 parents fca35ee + 91d156e commit 08cb3f0

24 files changed

+389
-287
lines changed

.markdownlint.jsonc

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"MD007": {
3+
// Unordered list indentation
4+
"indent": 4
5+
},
6+
"MD013": false, // Line length
7+
"MD033": {
8+
// Inline HTML
9+
"allowed_elements": [
10+
"br", // Useful in tables
11+
"figure",
12+
"figcaption",
13+
"s",
14+
"del" // Python-Markdown parsing issue with CJK
15+
]
16+
},
17+
"MD046": false, // Use fenced code block style, too many false positives
18+
"MD051": false, // Link fragments should be valid, false positives
19+
"MD052": false, // Reference link should be defined and used, false positives with includes/man.md
20+
"MD010": false, // Some command output contains hard tabs
21+
"MD024": {
22+
// Allow multiple headers with the same content, if they are not siblings
23+
"siblings_only": true
24+
}
25+
}

docs/Appendix/distribution.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Ubuntu 基于 Debian,并且相比 Debian 而言更加新手友好。而 Debian
1818

1919
简单使用:
2020

21-
```shell
21+
```console
2222
$ sudo dnf install audacity # 安装 audacity
2323
$ sudo dnf remove firefox # 卸载 firefox
2424
$ dnf search thunderbird # 搜索 thunderbird
@@ -51,7 +51,7 @@ SELinux 添加了额外的「强制访问控制」安全措施:系统中所有
5151

5252
Arch 使用的默认软件包管理器是 `pacman`。以下是一些常用的命令。
5353

54-
```shell
54+
```console
5555
$ sudo pacman -Syu # 更新系统所有软件包
5656
$ sudo pacman -S firefox # 安装 Firefox
5757
$ sudo pacman -Rs chromium # 卸载 Chromium 和它的所有依赖
@@ -86,7 +86,7 @@ openSUSE 使用 RPM 作为其软件包格式,但是与 Fedora、CentOS 等不
8686

8787
以下是一些常用的命令:
8888

89-
```shell
89+
```console
9090
$ sudo zypper update # 更新系统所有软件包
9191
$ sudo zypper install firefox # 安装 Firefox
9292
$ sudo zypper remove chromium # 卸载 Chromium 和它的所有依赖
@@ -118,7 +118,7 @@ Gentoo 的软件包管理器是 Portage。其对应最常用的 CLI 工具是 `e
118118

119119
以下是一些常用的命令:
120120

121-
```shell
121+
```console
122122
$ sudo emerge --sync # 更新软件包索引
123123
$ sudo emerge --update --ask @world # 更新已安装的程序(不包含依赖)
124124
$ sudo emerge -a firefox # 安装 Firefox

docs/Ch01/index.md

Lines changed: 5 additions & 6 deletions
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,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

docs/Ch01/supplement.md

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ SELinux 有 3 种工作模式:
5353

5454
使用 `sestatus` 命令查看 SELinux 状态:
5555

56-
```
56+
```console
5757
$ sestatus
5858
SELinux status: enabled
5959
SELinuxfs mount: /sys/fs/selinux
@@ -220,13 +220,13 @@ $ sudo resize2fs /dev/sda2
220220

221221
在服务器上首先安装 `openssh-server` 软件包,它提供了 SSH 服务器的功能。
222222

223-
```
223+
```console
224224
$ sudo apt install openssh-server
225225
```
226226

227227
启动并检查 SSH 服务状态:
228228

229-
```
229+
```console
230230
$ sudo systemctl start ssh
231231
$ sudo systemctl status ssh
232232
● ssh.service - OpenBSD Secure Shell server
@@ -248,7 +248,7 @@ $ sudo systemctl status ssh
248248

249249
我们可以使用 `ssh` 命令直接连接到本地(localhost)的 SSH 服务器。其中 `@` 符号前的是登录的用户名,后面的是服务器的域名或 IP 地址。
250250

251-
```
251+
```console
252252
$ ssh ustc@localhost
253253
The authenticity of host 'localhost (127.0.0.1)' can't be established.
254254
ECDSA key fingerprint is SHA256:czt1KYx+RIkFTpSPQOLq+GqLbLRLZcD1Ffkq4Z3ZR2U.
@@ -321,7 +321,7 @@ ustc@ustclug-linux101:~$
321321

322322
首先在自己的机器上使用 `ssh-keygen` 生成密钥:
323323

324-
```
324+
```console
325325
$ ssh-keygen
326326
Generating public/private rsa key pair.
327327
Enter file in which to save the key (/home/ustc/.ssh/id_rsa):
@@ -349,7 +349,7 @@ ustc@ustclug-linux101:~$
349349

350350
在本地使用 `ssh-copy-id` 命令将公钥拷贝到服务器上:
351351

352-
```
352+
```console
353353
$ ssh-copy-id ustc@localhost
354354
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
355355
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
@@ -377,7 +377,7 @@ ustc@ustclug-linux101:~$
377377

378378
然后让 SSH 服务器重新加载配置:
379379

380-
```
380+
```console
381381
$ sudo systemctl reload ssh
382382
```
383383

@@ -398,6 +398,10 @@ ustc@ustclug-linux101:~$
398398

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

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

403407
WSL 1 面向 Linux 应用程序提供了一套兼容的内核接口,在 Linux 程序运行的时候,WSL 1 处理(Linux 使用的)ELF 可执行文件格式,将 Linux 的系统调用翻译为 Windows 的系统调用,从而运行 Linux 程序。WSL 1 中可以访问到 Windows 下的文件,也与主机共享网络。
@@ -496,7 +500,7 @@ Featured Server Snaps 一样可以选择不安装,可以之后自行配置。
496500

497501
如果你需要带图形界面的虚拟机,只需要安装 `ubuntu-desktop` 即可。
498502

499-
```bash
503+
```console
500504
$ sudo apt-get install ubuntu-desktop
501505
```
502506

@@ -516,7 +520,7 @@ $ sudo apt-get install ubuntu-desktop
516520
* 使用 Ubuntu 22.04 或 22.10:目前只有部分 daily build 版本可用。
517521
* 在 Ubuntu 20.04 上**禁用 Wayland**:
518522

519-
```bash
523+
```console
520524
$ sudo nano /etc/gdm3/custom.conf
521525
```
522526

@@ -528,12 +532,17 @@ $ sudo apt-get install ubuntu-desktop
528532

529533
接下来自行通过 HWE 升级 Ubuntu 20.04 的内核至 5.15:
530534

531-
```bash
535+
```console
532536
$ sudo apt install --install-recommends linux-generic-hwe-20.04
533537
```
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

Lines changed: 46 additions & 21 deletions
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

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

302302
可能在初学者看来,熟记这条指令并不容易,但是从长远上看,熟悉了命令行之后再加上有自动补全的 shell 程序,使用命令行可以节省大量时间。
@@ -305,7 +305,7 @@ $ mv ../source/file.txt ../dest/
305305

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

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

310310
```
311311
C:\Windows\explorer.exe
@@ -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/<用户名>`)可以被简写为 `~`。例如,`~/work/test.c` 可能是 `/home/ustc/work/test.c` 的缩写。
350+
332351
#### 自动化脚本 {#shell-automation}
333352

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

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

362-
```shell
387+
```console
363388
$ sh run.sh
364389
```
365390

@@ -375,7 +400,7 @@ $ sh run.sh
375400

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

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

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

@@ -387,7 +412,7 @@ $ sh run.sh
387412

388413
使用以下命令安装(软件的安装将在[第三章](../Ch03/index.md)详细介绍):
389414

390-
```shell
415+
```console
391416
$ sudo apt install cmatrix
392417
```
393418

@@ -429,7 +454,7 @@ $ sh run.sh
429454

430455
#### 示例 1 {#shell-commands-example-1}
431456

432-
```shell
457+
```console
433458
$ pwd
434459
```
435460

@@ -441,7 +466,7 @@ $ pwd
441466

442467
#### 示例 2 {#shell-commands-example-2}
443468

444-
```shell
469+
```console
445470
$ ls
446471
```
447472

@@ -453,8 +478,8 @@ Desktop Documents Music Pictures Public Templates Videos
453478

454479
#### 示例 3 {#shell-commands-example-3}
455480

456-
```shell
457-
$ cd Desktop
481+
```console
482+
$ cd Desktop # 这里的 Desktop 是相对路径,指的就是当前目录下的 Desktop 文件夹
458483
$ ls
459484
```
460485

@@ -492,7 +517,7 @@ WordPress 是一个以 PHP 和 MySQL 为平台的自由开源的博客软件和
492517

493518
下载脚本要使用 `curl` 命令,我们要先安装 curl。
494519

495-
```shell
520+
```console
496521
$ sudo apt install curl
497522
```
498523

@@ -511,7 +536,7 @@ $ sudo apt install curl
511536

512537
打开终端并运行:
513538

514-
```shell
539+
```console
515540
$ curl -fsSL https://101.lug.ustc.edu.cn/Ch02/wordpress.sh > wordpress.sh
516541
$ # 可以阅读 wordpress.sh 了解其运行的命令,检查代码无误后执行:
517542
$ sudo bash wordpress.sh
@@ -527,7 +552,7 @@ $ sudo bash wordpress.sh
527552

528553
在本节之前的版本中,以上的命令是:
529554

530-
```shell
555+
```console
531556
$ curl -fsSL https://101.lug.ustc.edu.cn/Ch02/wordpress.sh | sudo bash
532557
```
533558

@@ -546,13 +571,13 @@ Jekyll 是一个将纯文本转化为静态博客和网站的工具。
546571

547572
我们只需要通过命令行安装它。
548573

549-
```shell
574+
```console
550575
$ sudo apt install jekyll
551576
```
552577

553578
再输入几行命令用于创建网站:
554579

555-
```shell
580+
```console
556581
$ jekyll new my-awesome-site
557582
$ cd my-awesome-site
558583
$ jekyll serve

docs/Ch02/solution.md

Lines changed: 2 additions & 2 deletions
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)的过程也是比较麻烦的,且桌面环境也并没有命令行环境简单可靠

0 commit comments

Comments
 (0)