Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
25 changes: 25 additions & 0 deletions .markdownlint.jsonc
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"MD007": {
// Unordered list indentation
"indent": 4
},
"MD013": false, // Line length
"MD033": {
// Inline HTML
"allowed_elements": [
"br", // Useful in tables
"figure",
"figcaption",
"s",
"del" // Python-Markdown parsing issue with CJK
]
},
"MD046": false, // Use fenced code block style, too many false positives
"MD051": false, // Link fragments should be valid, false positives
"MD052": false, // Reference link should be defined and used, false positives with includes/man.md
"MD010": false, // Some command output contains hard tabs
"MD024": {
// Allow multiple headers with the same content, if they are not siblings
"siblings_only": true
}
}
8 changes: 4 additions & 4 deletions docs/Appendix/distribution.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Ubuntu 基于 Debian,并且相比 Debian 而言更加新手友好。而 Debian

简单使用:

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

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

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

以下是一些常用的命令:

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

以下是一些常用的命令:

```shell
```console
$ sudo emerge --sync # 更新软件包索引
$ sudo emerge --update --ask @world # 更新已安装的程序(不包含依赖)
$ sudo emerge -a firefox # 安装 Firefox
Expand Down
11 changes: 5 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,10 @@ Linux 内核并不是一个完整的操作系统,因为它过于精简,单

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

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

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

Expand Down
29 changes: 19 additions & 10 deletions docs/Ch01/supplement.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ SELinux 有 3 种工作模式:

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

```
```console
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
Expand Down Expand Up @@ -220,13 +220,13 @@ $ sudo resize2fs /dev/sda2

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

```
```console
$ sudo apt install openssh-server
```

启动并检查 SSH 服务状态:

```
```console
$ sudo systemctl start ssh
$ sudo systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
Expand All @@ -248,7 +248,7 @@ $ sudo systemctl status ssh

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

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

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

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

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

```
```console
$ ssh-copy-id ustc@localhost
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/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
Expand Down Expand Up @@ -377,7 +377,7 @@ ustc@ustclug-linux101:~$

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

```
```console
$ sudo systemctl reload ssh
```

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

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

!!! warning "WSL 对宿主机文件系统的挂载"

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

### WSL 1 {#wsl1}

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

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

```bash
```console
$ sudo apt-get install ubuntu-desktop
```

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

```bash
```console
$ sudo nano /etc/gdm3/custom.conf
```

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

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

```bash
```console
$ sudo apt install --install-recommends linux-generic-hwe-20.04
```

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

## 使用 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)
67 changes: 46 additions & 21 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/
```console
$ mv /path/to/source/file.txt /path/to/dest/
```

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

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

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

```
C:\Windows\explorer.exe
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/<用户名>`)可以被简写为 `~`。例如,`~/work/test.c` 可能是 `/home/ustc/work/test.c` 的缩写。

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

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

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

!!! tip "为何需要加上 `./`"

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

之后我们直接输入

```shell
```console
$ sh run.sh
```

Expand All @@ -375,7 +400,7 @@ $ sh run.sh

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

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

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

Expand All @@ -387,7 +412,7 @@ $ sh run.sh

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

```shell
```console
$ sudo apt install cmatrix
```

Expand Down Expand Up @@ -429,7 +454,7 @@ $ sh run.sh

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

```shell
```console
$ pwd
```

Expand All @@ -441,7 +466,7 @@ $ pwd

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

```shell
```console
$ ls
```

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

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

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

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

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

```shell
```console
$ sudo apt install curl
```

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

打开终端并运行:

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

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

```shell
```console
$ curl -fsSL https://101.lug.ustc.edu.cn/Ch02/wordpress.sh | sudo bash
```

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

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

```shell
```console
$ sudo apt install jekyll
```

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

```shell
```console
$ jekyll new my-awesome-site
$ cd my-awesome-site
$ jekyll serve
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)的过程也是比较麻烦的,且桌面环境也并没有命令行环境简单可靠
Loading