docs: update docs
更新文档,添加系统启动相关的文档 Log:
This commit is contained in:
parent
950671f766
commit
7df2468bb7
@ -40,6 +40,19 @@ export default defineConfig({
|
|||||||
{text: "2.7.软件包管理技巧", link: "/deepin进阶教程/2.deepin软件包管理/2.7.软件包管理技巧" },
|
{text: "2.7.软件包管理技巧", link: "/deepin进阶教程/2.deepin软件包管理/2.7.软件包管理技巧" },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
text: "3.系统初始化",
|
||||||
|
items: [
|
||||||
|
{ text: "3.1.启动过程概述", link: "/deepin进阶教程/3.系统初始化/3.1.启动过程概述" },
|
||||||
|
{ text: "3.2.Systemd初始化", link: "/deepin进阶教程/3.系统初始化/3.2.Systemd初始化" },
|
||||||
|
{ text: "3.3.内核消息", link: "/deepin进阶教程/3.系统初始化/3.3.内核消息" },
|
||||||
|
{ text: "3.4.系统消息", link: "/deepin进阶教程/3.系统初始化/3.4.系统消息" },
|
||||||
|
{ text: "3.5.系统管理", link: "/deepin进阶教程/3.系统初始化/3.5.系统管理" },
|
||||||
|
{ text: "3.6.其他系统监控", link: "/deepin进阶教程/3.系统初始化/3.6.其他系统监控" },
|
||||||
|
{ text: "3.7.定制Systemd", link: "/deepin进阶教程/3.系统初始化/3.7.定制Systemd" },
|
||||||
|
{ text: "3.8.udev系统", link: "/deepin进阶教程/3.系统初始化/3.8.udev系统" },
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
text: "11.编程开发",
|
text: "11.编程开发",
|
||||||
items: [
|
items: [
|
||||||
|
@ -45,7 +45,7 @@ sudo apt install clang-tidy # clang-tidy静态分析工具
|
|||||||
sudo apt install clang-format # clang-format代码格式化工具
|
sudo apt install clang-format # clang-format代码格式化工具
|
||||||
```
|
```
|
||||||
|
|
||||||
clang-format可以使用配置文件进行配置,deepin社区提供一份符合deepin代码风格的配置文件,你可以在[这里](https://github.com/linuxdeepin/deepin-styleguide)
|
clang-format可以使用配置文件进行配置,deepin社区提供一份符合deepin代码风格的配置文件,你可以在[这里](https://github.com/linuxdeepin/deepin-styleguide)
|
||||||
找到,不过建议不要依靠这个配置文件,因为这个配置文件是根据deepin的代码风格来的,如果你的代码风格不是deepin的,那么这个配置文件就不适合你。
|
找到,不过建议不要依靠这个配置文件,因为这个配置文件是根据deepin的代码风格来的,如果你的代码风格不是deepin的,那么这个配置文件就不适合你。
|
||||||
|
|
||||||
拥有一个好的代码风格是非常重要的,它可以提高代码可读性,可维护性,可扩展性,可复用性,可测试性等等,所以你应该自己制定一套代码风格,然后使用clang-format来格式化你的代码。
|
拥有一个好的代码风格是非常重要的,它可以提高代码可读性,可维护性,可扩展性,可复用性,可测试性等等,所以你应该自己制定一套代码风格,然后使用clang-format来格式化你的代码。
|
||||||
|
38
docs/deepin进阶教程/11.编程开发/11.5.DTK编程环境开发.md
Normal file
38
docs/deepin进阶教程/11.编程开发/11.5.DTK编程环境开发.md
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# 11.5.DTK编程环境开发
|
||||||
|
|
||||||
|
## 11.5.1. 介绍
|
||||||
|
|
||||||
|
DTK是deepin和UOS使用的一套开发框架,它是基于Qt开发的,所以在你需要先安装Qt的开发环境。
|
||||||
|
|
||||||
|
## 11.5.2. 安装
|
||||||
|
|
||||||
|
### C++
|
||||||
|
|
||||||
|
你先需要配置CPP的安装环境,见[11.1.C++编程环境搭建](./11.1.C++编程环境搭建.md)。
|
||||||
|
|
||||||
|
### Qt
|
||||||
|
|
||||||
|
```Shell
|
||||||
|
|
||||||
|
sudo apt install qt5-default qtbase5-dev qtcreator
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### DTK
|
||||||
|
|
||||||
|
```Shell
|
||||||
|
sudo apt install dtkwidget-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
## 11.5.3. 文本编辑器
|
||||||
|
|
||||||
|
DTK是基于Qt开发的,所以你可以使用任意的文本编辑器,比如vim、emacs、vscode等。 和C++一样
|
||||||
|
|
||||||
|
## 11.5.4. IDE
|
||||||
|
|
||||||
|
这里推荐使用QtCreator,因为它是Qt官方出品的IDE,当然如果你想使用其他支持C++的IDE也是可以的。
|
||||||
|
|
||||||
|
## 11.5.5. 文档资料
|
||||||
|
|
||||||
|
- [DTK官方文档](https://docs.deepin.org/info/%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8/%E5%9F%BA%E7%A1%80%E7%8E%AF%E5%A2%83/DTK/%E5%BC%80%E5%8F%91)
|
||||||
|
- [Qt官方文档](https://doc.qt.io/qt-5/index.html)
|
@ -63,7 +63,7 @@ deepin 系统默认只会提供软件的 stable 版本,除非你加入了测
|
|||||||
|
|
||||||
deepin源的指定在`/etc/apt/sources.list`文件下,例如,现在的v23 beige系统
|
deepin源的指定在`/etc/apt/sources.list`文件下,例如,现在的v23 beige系统
|
||||||
|
|
||||||
```Text
|
```
|
||||||
https://community-packages.deepin.com/beige/ beige main commercial community
|
https://community-packages.deepin.com/beige/ beige main commercial community
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -24,7 +24,7 @@ deepin 采用了 Debian 的软件包管理机制,所以在 deepin 中,软件
|
|||||||
:::
|
:::
|
||||||
每个 deepin 档案库的网址都有一个这样的 “Release” 文件,例如 “[https://community-packages.deepin.com/beige/dists/beige/Release](https://community-packages.deepin.com/beige/dists/beige/Release)”,内容如下
|
每个 deepin 档案库的网址都有一个这样的 “Release” 文件,例如 “[https://community-packages.deepin.com/beige/dists/beige/Release](https://community-packages.deepin.com/beige/dists/beige/Release)”,内容如下
|
||||||
|
|
||||||
```Text
|
```
|
||||||
Origin: Linux Deepin
|
Origin: Linux Deepin
|
||||||
Label: Deepin
|
Label: Deepin
|
||||||
Codename: beige
|
Codename: beige
|
||||||
@ -69,7 +69,7 @@ MD5Sum:
|
|||||||
归档层次的 "Release" 文件,其全部归档位置在 "/etc/apt/sources.list"中的 "deb"行中指定,如以下的 "[https://community-packages.deepin.com/beige/dists/beige/main/binary-amd64/Release](https://community-packages.deepin.com/beige/dists/beige/main/binary-amd64/Release)"
|
归档层次的 "Release" 文件,其全部归档位置在 "/etc/apt/sources.list"中的 "deb"行中指定,如以下的 "[https://community-packages.deepin.com/beige/dists/beige/main/binary-amd64/Release](https://community-packages.deepin.com/beige/dists/beige/main/binary-amd64/Release)"
|
||||||
或 "[https://community-packages.deepin.com/beige/dists/beige/main/binary-arm64/Release](https://community-packages.deepin.com/beige/dists/beige/main/binary-arm64/Release)"。
|
或 "[https://community-packages.deepin.com/beige/dists/beige/main/binary-arm64/Release](https://community-packages.deepin.com/beige/dists/beige/main/binary-arm64/Release)"。
|
||||||
|
|
||||||
```Text
|
```
|
||||||
Version: 2022
|
Version: 2022
|
||||||
Component: main
|
Component: main
|
||||||
Origin: Linux Deepin
|
Origin: Linux Deepin
|
||||||
@ -80,7 +80,7 @@ Description: Deepin Beige packages.
|
|||||||
|
|
||||||
对于部分档案库,比如说 experimental 和 bullseye-backports, 它们包含的软件包不会被自动安装,这是因为有额外的行,例如在 "http://deb.debian.org/debian/dists/experimental/main/binary-amd64/Release" 里面有如下额外的一行。
|
对于部分档案库,比如说 experimental 和 bullseye-backports, 它们包含的软件包不会被自动安装,这是因为有额外的行,例如在 "http://deb.debian.org/debian/dists/experimental/main/binary-amd64/Release" 里面有如下额外的一行。
|
||||||
|
|
||||||
```Text
|
```
|
||||||
Archive: experimental
|
Archive: experimental
|
||||||
Origin: Debian
|
Origin: Debian
|
||||||
Label: Debian
|
Label: Debian
|
||||||
|
@ -140,7 +140,7 @@ deepin 不建议使用换源的方式进行大版本的更新,因为这样会
|
|||||||
|
|
||||||
如果不想要引入推荐的特定软件包,你必须创建 "`/etc/apt/preferences`" 文件并且像如下所示的那样在文件的顶部明确列出这些软件包。
|
如果不想要引入推荐的特定软件包,你必须创建 "`/etc/apt/preferences`" 文件并且像如下所示的那样在文件的顶部明确列出这些软件包。
|
||||||
|
|
||||||
```Text
|
```
|
||||||
Package: package-1
|
Package: package-1
|
||||||
Pin: version *
|
Pin: version *
|
||||||
Pin-Priority: -1
|
Pin-Priority: -1
|
||||||
@ -169,7 +169,7 @@ apt 软件包有自己的 cron 脚本 “`/etc/cron.daily/apt`” ,它支持
|
|||||||
|
|
||||||
unattended-upgrades 软件包主要用于 stable 系统的安全更新。如果自动升级损坏 stable 系统的风险小于被入侵者利用已被安全更新修复的安全漏洞,你应该考虑使用自动更新,配置参数如下。
|
unattended-upgrades 软件包主要用于 stable 系统的安全更新。如果自动升级损坏 stable 系统的风险小于被入侵者利用已被安全更新修复的安全漏洞,你应该考虑使用自动更新,配置参数如下。
|
||||||
|
|
||||||
```Text
|
```
|
||||||
APT::Periodic::Update-Package-Lists "1";
|
APT::Periodic::Update-Package-Lists "1";
|
||||||
APT::Periodic::Download-Upgradeable-Packages "1";
|
APT::Periodic::Download-Upgradeable-Packages "1";
|
||||||
APT::Periodic::Unattended-Upgrade "1";
|
APT::Periodic::Unattended-Upgrade "1";
|
||||||
@ -177,7 +177,7 @@ APT::Periodic::Unattended-Upgrade "1";
|
|||||||
|
|
||||||
如果你运行的是 unstable 系统,你应该不会想要使用自动更新,因为它肯定会在某天损坏系统。即使位于这样的 unstable 情况下,你可能依旧想提前下载软件包以节省交互式升级的时间,其配置参数如下。
|
如果你运行的是 unstable 系统,你应该不会想要使用自动更新,因为它肯定会在某天损坏系统。即使位于这样的 unstable 情况下,你可能依旧想提前下载软件包以节省交互式升级的时间,其配置参数如下。
|
||||||
|
|
||||||
```Text
|
```
|
||||||
APT::Periodic::Update-Package-Lists "1";
|
APT::Periodic::Update-Package-Lists "1";
|
||||||
APT::Periodic::Download-Upgradeable-Packages "1";
|
APT::Periodic::Download-Upgradeable-Packages "1";
|
||||||
APT::Periodic::Unattended-Upgrade "0";
|
APT::Periodic::Unattended-Upgrade "0";
|
||||||
@ -187,7 +187,7 @@ APT::Periodic::Unattended-Upgrade "0";
|
|||||||
|
|
||||||
如果你想限制 APT 的下载带宽到 800Kib/sec(=100KiB/sec),你应该像下面那样设置 APT 的配置参数。
|
如果你想限制 APT 的下载带宽到 800Kib/sec(=100KiB/sec),你应该像下面那样设置 APT 的配置参数。
|
||||||
|
|
||||||
```Text
|
```
|
||||||
APT::Acquire::http::Dl-Limit "800";
|
APT::Acquire::http::Dl-Limit "800";
|
||||||
```
|
```
|
||||||
|
|
||||||
|
85
docs/deepin进阶教程/3.系统初始化/3.1.启动过程概述.md
Normal file
85
docs/deepin进阶教程/3.系统初始化/3.1.启动过程概述.md
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
# 3.1. 启动过程概述
|
||||||
|
|
||||||
|
你一定好奇从计算机开机到进入桌面,到底发生了什么?这篇文章将会带你了解一下启动过程。
|
||||||
|
|
||||||
|
计算机启动就像一个多级火箭发射的过程,每一级都有自己的任务,上一级完成任务后,下一级才能开始工作。这里我们将会从最底层的硬件开始,一步步的了解启动过程。
|
||||||
|
|
||||||
|
## 3.1.1. 第一级:BIOS(Basic Input/Output System)
|
||||||
|
|
||||||
|
BIOS是计算机的基本输入输出系统,它是计算机的第一级启动程序,它的主要功能是检测计算机的硬件配置,然后将控制权交给操作系统。
|
||||||
|
|
||||||
|
不过在现在的计算机中,BIOS已经不是唯一的启动程序了,UEFI[统一可扩展固件接口](https://baike.baidu.com/item/%E7%BB%9F%E4%B8%80%E5%8F%AF%E6%89%A9%E5%B1%95%E5%9B%BA%E4%BB%B6%E6%8E%A5%E5%8F%A3/22786233)也是一种启动程序,它的功能和BIOS类似,但是它的功能更加强大,它可以加载更多的操作系统,比如我们的deepin系统就是通过UEFI启动的。
|
||||||
|
|
||||||
|
还有一种启动程序叫做uboot,它和UEFI类似,但是不常见于我们日常使用的计算机中,主要存在于国产计算机和部分基于ARM的单板机中。
|
||||||
|
|
||||||
|
## 3.1.2. 第二级:引导加载程序
|
||||||
|
|
||||||
|
引导加载程序是计算机的第二级启动程序,它的主要功能是加载操作系统内核,然后将控制权交给操作系统内核。
|
||||||
|
|
||||||
|
在我们deepin系统中,引导加载程序是grub2,由上一级UEFI加载。grub2加载内核,所以你可以在grub中选择不同的内核启动,如果我们在系统里面升级了内核,就可以通过grub来选择启动新的内核。
|
||||||
|
|
||||||
|
GRUB2 首先读取 ESP 分区,使用 "/boot/efi/EFI/debian/grub.cfg"里面 search.fs_uuid 指定的 UUID 来确定 GRUB2 菜单配置文件 "/boot/grub/grub.cfg" 所在的分区。
|
||||||
|
|
||||||
|
::: danger 别动
|
||||||
|
如果你不理解grub的配置文件,不要随意修改,否则可能会导致系统无法启动。对于一般用户,我们推荐使用deepin的启动管理器来管理启动项,你可以在控制中心找到它。
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: tip
|
||||||
|
grub支持修改主题,不过可能导致系统无法引导,我建议你这么做之前备份好资料,并且准备一个liveCD系统以防万一。
|
||||||
|
:::
|
||||||
|
|
||||||
|
GRUB2 菜单配置文件的关键部分看起来像:
|
||||||
|
|
||||||
|
```
|
||||||
|
menuentry 'deepin GNU/Linux' ... {
|
||||||
|
load_video
|
||||||
|
insmod gzio
|
||||||
|
insmod part_gpt
|
||||||
|
insmod ext2
|
||||||
|
search --no-floppy --fs-uuid --set=root fe3e1db5-6454-46d6-a14c-071208ebe4b1
|
||||||
|
echo 'Loading Linux 5.18.0-amd64 ...'
|
||||||
|
linux /boot/vmlinuz-5.18.0-amd64 root=UUID=fe3e1db5-6454-46d6-a14c-071208ebe4b1 ro quiet
|
||||||
|
echo 'Loading initial ramdisk ...'
|
||||||
|
initrd /boot/initrd.img-5.18.0-amd64
|
||||||
|
}
|
||||||
|
```
|
||||||
|
/boot/grub/grub.cfg 文件上面部分菜单条目意义
|
||||||
|
| 设置 | 值 |
|
||||||
|
|:---------------------:|:---------------------------------------------------------:|
|
||||||
|
| GRUB2 模块加载 | gzio, part_gpt, ext2 |
|
||||||
|
| 使用的根文件系统分区 | 由 UUID=fe3e1db5-6454-46d6-a14c-071208ebe4b1 指定的分区标识 |
|
||||||
|
| 内核镜像文件在根文件系统中的路径 | /boot/vmlinuz-5.18.0-amd64 |
|
||||||
|
| 使用的内核启动参数 | "root=UUID=fe3e1db5-6454-46d6-a14c-071208ebe4b1 ro quiet" |
|
||||||
|
| initrd 镜像文件在根文件系统中的路径 | /boot/initrd.img-5.18.0-amd64 |
|
||||||
|
|
||||||
|
::: tip
|
||||||
|
通过删除 "/boot/grub/grub.cfg" 里面的 quiet ,你能够查看内核启动日志信息。为固化这个修改,请编辑 "/etc/default/grub"里的 "GRUB_CMDLINE_LINUX_DEFAULT="quiet"" 行
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: tip
|
||||||
|
通过设置在“ /etc/default/grub” 的 GRUB_BACKGROUND 变量指向到图像文件,或者把图像文件本身放入 “/boot/grub/”,你能够定制 GRUB 的启动图像。
|
||||||
|
:::
|
||||||
|
|
||||||
|
参见 “info grub” 及 grub-install(8)。
|
||||||
|
|
||||||
|
## 3.1.3. 第三级:内核
|
||||||
|
|
||||||
|
内核是计算机的第三级启动程序,它的主要功能是加载操作系统的驱动程序,然后将控制权交给操作系统的第一个进程。
|
||||||
|
|
||||||
|
在我们deepin系统中,内核是linux内核,由上一级grub2加载。内核加载驱动程序,所以你可以在内核启动参数中指定加载哪些驱动程序,比如我们可以通过内核启动参数来指定加载nvidia显卡驱动。
|
||||||
|
|
||||||
|
## 3.1.4. 第四级:第一个进程
|
||||||
|
|
||||||
|
第一个进程是操作系统的第一个进程,它的主要功能是加载操作系统的其他进程,然后将控制权交给操作系统的第一个用户进程。
|
||||||
|
|
||||||
|
如果你学习过操作系统的进程管理,你应该知道操作系统的第一个进程叫做init进程,它的PID是1,它的父进程是0,它的父进程是内核。
|
||||||
|
|
||||||
|
不过在现代的linux系统中,init进程已经不是唯一的第一个进程了,它的替代者是systemd,systemd是一个守护进程,它的主要功能是管理系统中的所有进程。
|
||||||
|
|
||||||
|
systemd是一个很有野心的软件,它目的是替换掉linux系统里面很多不好用的软件,目标是成为linux世界里面最重要的组件之一。
|
||||||
|
|
||||||
|
[systemd官网](https://systemd.io/)
|
||||||
|
|
||||||
|
systemd会启动一系列服务 (service),这些服务会在后台运行,比如网络服务、打印服务、文件系统服务、用户管理服务、安全服务、时间服务、日志服务、电源管理服务、蓝牙服务、声音服务、打印服务、磁盘管理服务、文件系统管理服务、系统监控服务。
|
||||||
|
|
||||||
|
当显示管理器(DisplayManager)被启动时,你就可以看到熟悉的登陆页面了。deepin使用的是LightDM作为显示管理器,你可以在显示管理器切换到其他桌面环境。
|
71
docs/deepin进阶教程/3.系统初始化/3.2.Systemd初始化.md
Normal file
71
docs/deepin进阶教程/3.系统初始化/3.2.Systemd初始化.md
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
# 3.2. Systemd初始化
|
||||||
|
|
||||||
|
本节描述系统是怎样通过 PID=1 的 systemd(1) 程序来启动(即初始化进程)。
|
||||||
|
|
||||||
|
## 3.2.1. 什么是systemd
|
||||||
|
|
||||||
|
systemd是Linux系统的一个守护进程,它的作用是管理系统中的所有进程,比如启动、停止、重启、查看状态等。
|
||||||
|
|
||||||
|
你可以使用`systemctl` 命令来管理systemd进程。详见[Systemd](https://wiki.deepin.org/zh/Systemd)
|
||||||
|
|
||||||
|
## 3.2.2. systemd的初始化
|
||||||
|
|
||||||
|
systemd 初始化进程基于单元配置文件 (参见 systemd.unit(5)) 来并行派生进程,这些单元配置文件使用声明样式来书写,代替之前的类 SysV 的过程样式。这些单元配置文件从下面的一系列路径来加载 (参见 systemd-system.conf(5)) :
|
||||||
|
|
||||||
|
派生的进程被放在一个单独的 [Linux control groups](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html),在单元后命名,它们属于一个私有的 systemd 层级结构(参见 cgroups 和 第 4.7.4 节 “Linux 安全特性”)。
|
||||||
|
|
||||||
|
单元配置文件从下列一系列路径中加载(参见 systemd-system.conf(5)):
|
||||||
|
|
||||||
|
- `/lib/systemd/system`: OS 默认配置文件
|
||||||
|
- `/etc/systemd/system`: 系统管理员的配置文件,它将忽略操作系统默认的配置文件
|
||||||
|
- `/run/systemd/system`: 运行时产生的配置文件,它将忽略安装的配置文件
|
||||||
|
|
||||||
|
他们的相互依赖关系通过"`Wants=`", "`Requires=`", "`Before=`", "`After=`", … 等指示来配置,(参见 systemd.unit(5) 里的 "MAPPING OF UNIT PROPERTIES TO THEIR INVERSES")。 资源控制也是被定义 (参见 systemd.resource-control(5)).
|
||||||
|
|
||||||
|
根据单元配置文件的后缀来区分它们的类型:
|
||||||
|
|
||||||
|
- `*.service`描述由 systemd 控制和监管的进程.参见 systemd.service(5).
|
||||||
|
- `*.device`描述在 sysfs(5) 里面作为 udev(7) 设备树展示的设备。参见 systemd.device(5).
|
||||||
|
- `*.mount` 描述由 systemd 控制和监管的文件系统挂载点。参见 systemd.mount(5).
|
||||||
|
- `*.automount` 描述由 systemd 控制和监管的文件系统自动挂载点。参见 systemd.automount(5).
|
||||||
|
- `*.swap` 描述由 systemd 控制和监管的 swap 文件或设备。参见 systemd.swap(5).
|
||||||
|
- `*.path` 描述被 systemd 监控的路径,用于基于路径的活动。参见 systemd.path(5).
|
||||||
|
- `*.socket` 描述被 systemd 控制和监管的套接字,用于基于套接字的活动。参见 systemd.socket(5).
|
||||||
|
- `*.timer` 描述被 systemd 控制和监管的计时器,用于基于时间的活动。参见 systemd.timer(5).
|
||||||
|
- `*.slice` 管理 cgroups(7) 的资源。参见 systemd.slice(5).
|
||||||
|
- `*.scope` 使用 systemd 的总线接口来程序化的创建,用以管理一系列系统进程。 参见 systemd.scope(5).
|
||||||
|
- `*.target` 把其它单元配置文件分组,在启动的时候,来创建同步点。参见systemd.target(5).
|
||||||
|
|
||||||
|
系统启动时(即,init),systemd 进程会尝试启动"`/lib/systemd/system/default.target`(通常是到"graphical.target"的符号链接)。首先,一些特殊的 target 单元(参见 systemd.special(7)),比如 "local-fs.target"、"swap.target"和"cryptsetup.target"会被引入以挂载文件系统。之后,其它 target 单元也会根据单元依赖关系而被引入。详细情况,请阅读 bootup(7)。
|
||||||
|
|
||||||
|
systemd 提供向后兼容的功能。在 "/etc/init.d/rc[0123456S].d/[KS]name" 里面的 SysV 风格的启动脚本仍然会被分析;telinit(8) 会被转换为 systemd 的单元活动请求。
|
||||||
|
|
||||||
|
在你了解这些之后,可以尝试自己写一个 systemd 单元配置文件,然后使用 systemctl(1) 来管理它。[wiki](https://wiki.deepin.org/zh/%E5%A6%82%E4%BD%95%E8%87%AA%E5%B7%B1%E5%86%99%E4%B8%80%E4%B8%AA%E5%BC%80%E6%9C%BA%E8%87%AA%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1%EF%BC%9F)
|
||||||
|
|
||||||
|
::: warning 小心
|
||||||
|
模拟的运行级别 2 到 4 全部被符号链接到了相同的“multi-user.target”。
|
||||||
|
:::
|
||||||
|
|
||||||
|
## 3.2.3. 主机名
|
||||||
|
|
||||||
|
内核维护系统主机名。在启动的时候,通过 systemd-hostnamed.service 启动的系统单位设置系统的主机名,此主机名保存在 "/etc/hostname"。这个文件应该只包含系统主机名,而不是全称域名。
|
||||||
|
|
||||||
|
不带参数运行 hostname(1) 命令可以打印出当前的主机名。
|
||||||
|
|
||||||
|
## 3.2.4. 文件系统
|
||||||
|
|
||||||
|
硬盘和网络文件系统的挂载选项可以在 "/etc/fstab" 中设置,参见 fstab(5) 和 第 9.6.7 节 “通过挂载选项优化文件系统”。
|
||||||
|
|
||||||
|
加密文件系统的配置设置在“/etc/crypttab”中。参见 crypttab(5)
|
||||||
|
|
||||||
|
软 RAID 的配置 mdadm(8) 设置在 "/etc/mdadm/mdadm.conf". 参见 mdadm.conf(5).
|
||||||
|
|
||||||
|
::: warning
|
||||||
|
每次启动的时候,在挂载了所有文件系统以后,"/tmp", "/var/lock", 和 "/var/run" 中的临时文件会被清空。
|
||||||
|
:::
|
||||||
|
|
||||||
|
## 3.2.5. 网络接口初始化
|
||||||
|
|
||||||
|
对于deepin,网络接口通常由两个服务进行初始化:lo 接口通常在“networking.service”处理,而其它接口则由“NetworkManager.service”处理。
|
||||||
|
|
||||||
|
参见 第 5 章 网络设置 来获取怎样来配置它们的信息。
|
15
docs/deepin进阶教程/3.系统初始化/3.3.内核消息.md
Normal file
15
docs/deepin进阶教程/3.系统初始化/3.3.内核消息.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# 3.3. 内核消息
|
||||||
|
|
||||||
|
内核消息是内核向用户空间发送的消息,它们可以是错误、警告、信息等。
|
||||||
|
|
||||||
|
在控制台上显示的内核错误信息,能够通过设置他们的阈值水平来配置。
|
||||||
|
| 错误级别值 | 错误级别名称 | 说明 |
|
||||||
|
|:-----:|:------------:|:-----------:|
|
||||||
|
| 0 | KERN_EMERG | 系统不可用 |
|
||||||
|
| 1 | KERN_ALERT | 行为必须被立即采取 |
|
||||||
|
| 2 | KERN_CRIT | 危险条件 |
|
||||||
|
| 3 | KERN_ERR | 错误条件 |
|
||||||
|
| 4 | KERN_WARNING | 警告条件 |
|
||||||
|
| 5 | KERN_NOTICE | 普通但重要的条件 |
|
||||||
|
| 6 | KERN_INFO | 信息提示 |
|
||||||
|
| 7 | KERN_DEBUG | debug 级别的信息 |
|
17
docs/deepin进阶教程/3.系统初始化/3.4.系统消息.md
Normal file
17
docs/deepin进阶教程/3.系统初始化/3.4.系统消息.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# 3.4. 系统消息
|
||||||
|
|
||||||
|
在 systemd 下, 内核和系统的信息都通过日志服务 systemd-journald.service (又名 journald)来记录,放在"/var/log/journal"下的不变的二进制数据,或放在"/run/log/journal/"下的变化的二进制数据.这些二进制日志数据,可以通过 journalctl(1) 命令来访问。例如,你可以显示从最后一次启动以来的日志,按如下所示:
|
||||||
|
```
|
||||||
|
$ journalctl -b
|
||||||
|
```
|
||||||
|
| 操作 | 命令片段 |
|
||||||
|
|:----------------------------------------:|:---------------------------:|
|
||||||
|
| 查看从最后一次启动开始的系统服务和内核日志 | "journalctl -b --system" |
|
||||||
|
| 查看从最后一次启动开始的当前用户的服务日志 | "journalctl -b --user" |
|
||||||
|
| 查看从最后一次启动开始的 "$unit" 工作日志 | "journalctl -b -u $unit" |
|
||||||
|
| 查看从最后一次启动开始的 "$unit"的工作日志 ("tail -f" 式样) | "journalctl -b -u $unit -f" |
|
||||||
|
|
||||||
|
|
||||||
|
在 systemd 下,系统日志工具 rsyslogd(8) 可以被卸载。如果安装了它,它会改变它的行为来读取易失性二进制日志数据(代替在 systemd 之前默认的 "/dev/log")并创建传统的永久性 ASCII 系统日志数据。"/etc/default/rsyslog" 和 "/etc/rsyslog.conf" 能够自定义日志文件和屏幕显示。参见 rsyslogd(8) 和 rsyslog.conf(5),也可以参见第 9.3.2 节 “日志分析”
|
||||||
|
|
||||||
|
在deepin中,你也可以选择图形化的日志查看工具,比如deepin日志查看器。
|
52
docs/deepin进阶教程/3.系统初始化/3.5.系统管理.md
Normal file
52
docs/deepin进阶教程/3.系统初始化/3.5.系统管理.md
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# 3.5. 系统管理
|
||||||
|
|
||||||
|
systemd 不仅仅提供系统初始化,还用 systemctl(1) 命令提供通用的系统管理操作
|
||||||
|
|
||||||
|
| 操作 | 命令片段 |
|
||||||
|
|--------------------------------------|--------------------------------------------|
|
||||||
|
| 列出所有 target 单元配置 | "systemctl list-units --type=target" |
|
||||||
|
| 列出所有 service 单元配置 | "systemctl list-units --type=service" |
|
||||||
|
| 列出所有单元配置类型 | "systemctl list-units --type=help" |
|
||||||
|
| 列出内存中所有 socket 单元 | "systemctl list-sockets" |
|
||||||
|
| 列出内存中所有 timer 单元 | "systemctl list-timers" |
|
||||||
|
| 启动 "$unit" | "systemctl start $unit" |
|
||||||
|
| 停止 "$unit" | "systemctl stop $unit" |
|
||||||
|
| 重新加载服务相关的配置 | "systemctl reload $unit" |
|
||||||
|
| 停止和启动所有 "$unit" | "systemctl restart $unit" |
|
||||||
|
| 启动 "$unit" 并停止所有其它的 | "systemctl isolate $unit" |
|
||||||
|
| 转换到 "图形" (图形界面系统) | "systemctl isolate graphical" |
|
||||||
|
| 转换到 "多用户" (命令行系统) | "systemctl isolate multi-user" |
|
||||||
|
| 转换到 "应急模式" (单用户命令行系统) | "systemctl isolate rescue" |
|
||||||
|
| 向"$unit"发送杀死信号 | "systemctl kill $unit" |
|
||||||
|
| 检查"$unit"服务是否是活动的 | "systemctl is-active $unit" |
|
||||||
|
| 检查"$unit"服务是否是失败的 | "systemctl is-failed $unit" |
|
||||||
|
| 检查"$unit|$PID|device"的状态 | "systemctl status $unit|$PID|$device" |
|
||||||
|
| 显示"$unit|$job"的属性 | "systemctl show $unit|$job" |
|
||||||
|
| 重设失败的"$unit" | "systemctl reset-failed $unit" |
|
||||||
|
| 列出所有单元服务的依赖性 | "systemctl list-dependencies --all" |
|
||||||
|
| 列出安装在系统上的单元文件 | "systemctl list-unit-files" |
|
||||||
|
| 启用 "$unit" (增加符号链接) | "systemctl enable $unit" |
|
||||||
|
| 禁用 "$unit" (删除符号链接) | "systemctl disable $unit" |
|
||||||
|
| 取消遮掩 "$unit" (删除到 "/dev/null" 的符号链接) | "systemctl unmask $unit" |
|
||||||
|
| 遮掩 "$unit" (增加到 "/dev/null" 的符号链接) | "systemctl mask $unit" |
|
||||||
|
| 获取默认的 target 设置 | "systemctl get-default" |
|
||||||
|
| 设置默认 target 为"graphical" (图形系统) | "systemctl set-default graphical" |
|
||||||
|
| 设置默认的 target 为"multi-user" (命令行系统) | "systemctl set-default multi-user" |
|
||||||
|
| 显示工作环境变量 | "systemctl show-environment" |
|
||||||
|
| 设置环境变量 "variable" 的值为 "value" | "systemctl set-environment variable=value" |
|
||||||
|
| 取消环境变量 "variable" 的设置 | "systemctl unset-environment variable" |
|
||||||
|
| 重新加载所有单元文件和后台守护进程(daemon) | "systemctl daemon-reload" |
|
||||||
|
| 关闭系统 | "systemctl poweroff" |
|
||||||
|
| 关闭和重启系统 | "systemctl reboot" |
|
||||||
|
| 挂起系统 | "systemctl suspend" |
|
||||||
|
| 休眠系统 | "systemctl hibernate" |
|
||||||
|
|
||||||
|
这里, 上面例子中的"$unit",可以是一个单元名(后缀.service 和 .target 是可选的),或者,在很多情况下,也可以是匹配的多个单元 (shell 式样的全局通配符"*", "?", "[]",通过使用 fnmatch(3) ,来匹配目前在内存中的所有单元的基本名称).
|
||||||
|
|
||||||
|
上面列子的系统状态改变命令,通常是通过"sudo"来处理,用以获得需要的系统管理权限。
|
||||||
|
|
||||||
|
"`systemctl status $unit|$PID|$device`" 的输出使用有颜色的点("●")来概述单元状态,让人看一眼就知道。
|
||||||
|
|
||||||
|
- 白色的 "●" 表示一个 "不活动"或"变为不活动中"的状态。
|
||||||
|
- 红色的 "●"表示“失败”或者“错误”状态。
|
||||||
|
- 绿色"●"表示“活动”、“重新加载中”或“激活中”状态。
|
13
docs/deepin进阶教程/3.系统初始化/3.6.其他系统监控.md
Normal file
13
docs/deepin进阶教程/3.系统初始化/3.6.其他系统监控.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# 3.6. 其他系统监控
|
||||||
|
|
||||||
|
这里是 systemd 下其它零星的监控命令列表。请阅读包括 cgroups(7) 在内的相关的 man 手册页
|
||||||
|
| 操作 | 命令片段 |
|
||||||
|
|---------------------|---------------------------------------|
|
||||||
|
| 显示每一个初始化步骤所消耗的时间 | "systemd-analyze time" |
|
||||||
|
| 列出所有单元的初始化时间 | "systemd-analyze blame" |
|
||||||
|
| 加载"$unit"文件并检测错误 | "systemd-analyze verify $unit" |
|
||||||
|
| 简洁的显示用户调用会话的运行时状态信息 | "loginctl user-status" |
|
||||||
|
| 简洁的显示调用会话的运行时状态信息 | "loginctl session-status" |
|
||||||
|
| 跟踪 cgroups 的启动过程 | "systemd-cgls" |
|
||||||
|
| 跟踪 cgroups 的启动过程 | "ps xawf -eo pid,user,cgroup,args" |
|
||||||
|
| 跟踪 cgroups 的启动过程 | 读取 "/sys/fs/cgroup/systemd/" 下的 sysfs |
|
48
docs/deepin进阶教程/3.系统初始化/3.7.定制Systemd.md
Normal file
48
docs/deepin进阶教程/3.系统初始化/3.7.定制Systemd.md
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
# 3.7. 定制Systemd
|
||||||
|
|
||||||
|
## 3.7.1. 套接字激活
|
||||||
|
|
||||||
|
套接字激活是指,当一个服务需要监听一个端口时,它不会直接监听,而是由systemd来监听,然后将连接转发给服务。这样做的好处是,当服务不需要监听端口时,systemd就不会监听,从而节省了资源。
|
||||||
|
|
||||||
|
使用默认安装,通过 systemd 启动的过程中,在 network.target 启动后,很多网络服务 (参见 第 6 章 网络应用)作为后台守护进程(daemon)启动。 "sshd" 也不列外。让我们修改为按需启动"sshd" 作为一个定制化的例子。
|
||||||
|
|
||||||
|
首先,禁用系统安装的服务单元。
|
||||||
|
|
||||||
|
```Shell
|
||||||
|
sudo systemctl stop sshd.service
|
||||||
|
sudo systemctl mask sshd.service
|
||||||
|
```
|
||||||
|
传统 Unix 服务的按需套接字激活(on-demand socket activation)系统由 inetd (或 xinetd)超级服务来提供。在 systemd 下, 相同功能能够通过增加*.socket 和 *.service 单元配置文件来启用。
|
||||||
|
|
||||||
|
sshd.socket 用来定义一个监听的套接字
|
||||||
|
|
||||||
|
```
|
||||||
|
[Unit]
|
||||||
|
Description=SSH Socket for Per-Connection Servers
|
||||||
|
|
||||||
|
[Socket]
|
||||||
|
ListenStream=22
|
||||||
|
Accept=yes
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=sockets.target
|
||||||
|
```
|
||||||
|
|
||||||
|
sshd@.service 作为 sshd.socket 匹配的服务文件
|
||||||
|
|
||||||
|
```
|
||||||
|
[Unit]
|
||||||
|
Description=SSH Per-Connection Server
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=-/usr/sbin/sshd -i
|
||||||
|
StandardInput=socket
|
||||||
|
```
|
||||||
|
|
||||||
|
这里,sshd.socket 用来定义一个监听的套接字,sshd@.service 作为 sshd.socket 匹配的服务文件。sshd.socket 会监听 22 端口,当有连接请求时,sshd@.service 会被启动。
|
||||||
|
|
||||||
|
现在,启用这两个单元文件。
|
||||||
|
|
||||||
|
```Shell
|
||||||
|
sudo systemctl deamon-reload
|
||||||
|
```
|
43
docs/deepin进阶教程/3.系统初始化/3.8.udev系统.md
Normal file
43
docs/deepin进阶教程/3.系统初始化/3.8.udev系统.md
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# 3.8. udev系统
|
||||||
|
|
||||||
|
udev是一个用于管理设备节点的守护进程,它会根据设备的属性来创建设备节点,udev的配置文件位于/etc/udev/目录下
|
||||||
|
|
||||||
|
从 Linux 内核 2.6 版开始,udev 系统 提供了自动硬件发现和初始化机制。(参见 udev(7)).在内核发现每个设备的基础上,udev 系统使用从 sysfs 文件系统 (参见 第 1.2.12 节 “procfs 和 sysfs”)的信息启动一个用户进程,使用 modprobe(8) 程序 (参见 第 3.8.1 节 “内核模块初始化”)加载支持它所要求的内核模块, 创建相应的设备节点。
|
||||||
|
|
||||||
|
::: tip
|
||||||
|
由于某些理由,"/lib/modules/kernel-version/modules.dep"没有被 depmod(8) 正常生成,模块可能不会被 udev 系统按期望的方式加载。执行"depmod -a" 来修复它。
|
||||||
|
|
||||||
|
"/etc/fstab"里面的挂载规则,设备节点不必需是静态的。你能够使用 UUID 来挂载设备,来代替"/dev/sda"之类的设备名. 参见 第 9.6.3 节 “使用 UUID 访问分区”.
|
||||||
|
:::
|
||||||
|
|
||||||
|
由于 udev 系统是一个正在变化的事物,我在其它文档进行了详细描述,在这里只提供了最少的信息。
|
||||||
|
|
||||||
|
## 3.8.1. 内核模块初始化
|
||||||
|
|
||||||
|
通过 modprobe(8) 程序添加和删除内核模块,使我们能够从用户进程来配置正在运行的 Linux 内核。udev 系统(参见 第 3.8 节 “udev 系统”)自动化它的调用来帮助内核模块初始化。
|
||||||
|
|
||||||
|
下面的非硬件模块和特殊的硬件驱动模块,需要被预先加载,把它们在"/etc/modules"文件里列出 (参见 modules(5)).
|
||||||
|
|
||||||
|
- TUN/TAP 模块提供虚拟的 Point-to-Point 网络设备 (TUN) 和虚拟的 Ethernet 以太网网络设备 (TAP),
|
||||||
|
- netfilter 模块提供 netfilter 防火墙能力(iptables(8), 第 5.6 节 “Netfilter 网络过滤框架”),
|
||||||
|
- watchdog timer 驱动模块。
|
||||||
|
|
||||||
|
modprobe(8) 程序的配置文件是按 modprobe.conf(5)的说明放在"/etc/modprobes.d/" 目录下,(如果你想避免自动加载某些内核模块,考虑把它们作为黑名单放在"/etc/modprobes.d/blacklist" 文件里.)
|
||||||
|
|
||||||
|
"/lib/modules/version/modules.dep" 文件由 depmod(8) 程序生成,它描述了 modprobe(8) 程序使用的模块依赖性.
|
||||||
|
|
||||||
|
::: warning 注意
|
||||||
|
如果你在启动时出现模块加载问题,或者 modprobe(8)时出现模块加载问题, "depmod -a" 可以通过重构"modules.dep"来解决这些问题。
|
||||||
|
:::
|
||||||
|
|
||||||
|
modinfo(8) 程序显示 Linux 内核模块信息。
|
||||||
|
|
||||||
|
lsmod(8) 程序以好看的格式展示"/proc/modules"的内容,显示当前内核加载了哪些模块。
|
||||||
|
|
||||||
|
::: tip
|
||||||
|
你能够精确识别你系统上的硬件。 参见第 9.5.3 节 “硬件识别”.
|
||||||
|
|
||||||
|
你可以在启动时配置硬件来激活期望的硬件特征。参见 第 9.5.4 节 “硬件配置”.
|
||||||
|
|
||||||
|
你可以重新编译内核来增加你的特殊设备的支持。参见 第 9.10 节 “内核”.
|
||||||
|
:::
|
@ -19,7 +19,7 @@ git clone https://github.com/deepin-community/.guide.deepin.org.git
|
|||||||
|
|
||||||
然后使用文本编辑器打开仓库,你会看到如下目录结构:
|
然后使用文本编辑器打开仓库,你会看到如下目录结构:
|
||||||
|
|
||||||
```text
|
```
|
||||||
.
|
.
|
||||||
├── docs
|
├── docs
|
||||||
├── LICENSE
|
├── LICENSE
|
||||||
|
Loading…
Reference in New Issue
Block a user