From 858545c1dd729ddbb150cade00277e066a980b9f Mon Sep 17 00:00:00 2001 From: Zhouzhongping Date: Thu, 11 Apr 2024 17:29:53 +0800 Subject: [PATCH] =?UTF-8?q?Linux=EF=BC=9A=E7=B3=BB=E7=BB=9F=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E8=AF=A6=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{Linux 系统管理.md => Linux 系统启动详解.md} | 125 ++++++------------ 1 file changed, 37 insertions(+), 88 deletions(-) rename Tech/operating-system/Linux/3.系统管理/{Linux 系统管理.md => Linux 系统启动详解.md} (77%) diff --git a/Tech/operating-system/Linux/3.系统管理/Linux 系统管理.md b/Tech/operating-system/Linux/3.系统管理/Linux 系统启动详解.md similarity index 77% rename from Tech/operating-system/Linux/3.系统管理/Linux 系统管理.md rename to Tech/operating-system/Linux/3.系统管理/Linux 系统启动详解.md index 1315f3d3..ce0c8830 100644 --- a/Tech/operating-system/Linux/3.系统管理/Linux 系统管理.md +++ b/Tech/operating-system/Linux/3.系统管理/Linux 系统启动详解.md @@ -1,6 +1,6 @@ --- -title: Linux 系统管理 -description: Linux 系统管理和配置 +title: Linux 服务管理 +description: Linux 服务管理和配置 keywords: - Linux - 系统管理 @@ -25,7 +25,7 @@ Linux,一种自由和开源的操作系统,因其强大的定制性和稳定 3. **内核阶段**:加载到内存的内核首先会解压自身,然后启动并初始化系统硬件和驱动。这包括设置和初始化处理器和内存管理系统、唤醒和初始化其他的 CPU 核心、探测并初始化系统中的各种硬件设备、设置中断处理程序和系统调用处理程序、初始化虚拟文件系统(VFS)等。接着,它会使用在 initrd 中的程序和驱动来挂载根文件系统。 4. **系统初始化阶段**:内核成功挂载根文件系统后,会启动第一个进程 init 或 systemd。这个进程会根据预设的运行级别来启动其他的服务和守护进程,完成系统的启动。在这个阶段,init 系统(例如 systemd)不仅启动系统服务,还负责管理这些服务。例如,如果某个服务因故崩溃,init 系统可以自动重新启动它。此外,init 系统还负责设置环境变量、管理系统日志、维护文件系统挂载点等任务。一般来说,init 进程在启动系统服务之后,不会直接进入等待状态,而是会进入一个事件循环,等待如硬件事件、服务状态改变、用户请求等事件,然后根据事件类型进行相应的处理。 -#### BIOS 阶段 +#### 1.BIOS 阶段 当电脑开机时,会进行一种叫做电源自检(Power-On Self Test,POST)的过程。这个过程是由电脑的基本输入/输出系统(Basic Input/Output System,BIOS)或统一可扩展固件接口(Unified Extensible Firmware Interface,UEFI)来管理的。**POST 是电脑启动过程中的第一个步骤,是为了确定系统的基本硬件设备是否能够正常运行。** @@ -54,7 +54,7 @@ graph LR 在这个阶段,有一些系统可能使用 UEFI(统一的可扩展固件接口)而不是传统的 BIOS。UEFI 是一个规范,定义了软件与操作系统和平台固件之间的软件接口。UEFI 启动过程的细节和 BIOS 有所不同,但基本思路是类似的:它**负责初始化硬件,然后加载并运行启动加载器。** -#### 引导加载器阶段 +#### 2.引导加载器阶段 **启动加载程序(Bootloader)是在计算机启动过程中,BIOS 或 UEFI 完成硬件检测后,用于加载操作系统内核的一个小程序。**常见的 Linux 启动加载程序有 GRUB(GNU GRand Unified Bootloader)、LILO(Linux Loader)、SYSLINUX 等。 @@ -78,7 +78,7 @@ graph LR 引导加载器不仅可以加载 Linux,也可以加载许多其他类型的操作系统。例如,GRUB 支持加载 Linux、Windows、FreeBSD 等等。**这是通过多启动(multi-boot)规范实现的,它定义了一个标准的方法让引导加载器与操作系统内核交互。** -#### 内核阶段 +#### 3.内核阶段 **一旦启动加载程序(例如 GRUB)将操作系统内核加载到内存并将控制权移交给它,Linux 内核就开始初始化。**在内核初始化过程中,它实际上是在设定一个基本的运行环境,这样用户空间的程序才能在这个环境中运行。在这个环境中,内核提供了许多基本的服务,例如设备驱动、文件系统、网络服务、进程调度等。所有这些服务在用户空间的程序看来就像是操作系统的一部分,但它们实际上都是由内核提供的。 @@ -108,7 +108,7 @@ graph LR 7. **启动 init 进程**:最后,内核会启动一个特殊的用户空间程序,称为 init 进程。这个进程的进程 ID(PID)是 1,它负责启动所有其他的用户空间程序和服务。 -#### 系统初始化阶段 +#### 4.系统初始化阶段 **在 Linux 内核完成初始化并挂载了根文件系统后,它将启动第一个用户空间程序,这个进程通常被称为 init 进程。init 进程的进程 ID(PID)是 1,它是所有其他用户空间进程的父进程。**init 进程在系统中有特殊的地位,它负责启动其他所有的系统服务和用户空间进程。 @@ -135,13 +135,15 @@ graph LR 运行级别是 Linux 系统中用于定义系统需要运行哪些服务和进程的方式。每个运行级别都有特定的服务和进程集合,可以根据系统的需求进行切换。Linux 系统中包含以下七个运行级别: -1. **运行级别 0**:系统停机,通常用于正常关闭系统。 -2. **运行级别 1**:单用户模式,通常用于系统维护。 -3. **运行级别 2**:多用户模式,不包括网络服务。 -4. **运行级别 3**:完全的多用户模式,包括网络服务。这通常是 Linux 系统默认的运行级别。 -5. **运行级别 4**:通常不使用,用户可以自定义。 -6. **运行级别 5**:图形用户模式,启动 X Window 图形界面。 -7. **运行级别 6**:系统重启。 +| 运行级别 | 描述 | +| -------- | ------------------------------------------------------------ | +| 0 | 系统停机,通常用于正常关闭系统。 | +| 1 | 单用户模式,通常用于系统维护。 | +| 2 | 多用户模式,不包括网络服务。 | +| 3 | 完全的多用户模式,包括网络服务。这通常是 Linux 系统默认的运行级别。 | +| 4 | 通常不使用,用户可以自定义。 | +| 5 | 图形用户模式,启动 X Window 图形界面。 | +| 6 | 系统重启。 | ### 管理运行级别 @@ -247,6 +249,26 @@ kill -9 123 killall bash ``` +### 进程管理命令手册 + +| 命令 | 描述 | +| --------- | ------------------------------------------------------------ | +| `ps` | 显示当前进程的快照。 | +| `top` | 动态显示进程状态,可以实时查看系统中各个进程的资源占用情况。 | +| `htop` | 与 `top` 类似,但提供了一个更美观、更友好的界面以及额外的功能,如垂直和水平滚动。 | +| `pgrep` | 根据条件查找进程,并列出匹配条件的进程 ID。 | +| `pkill` | 发送信号到匹配条件的进程,常用于终止进程。 | +| `kill` | 发送信号到特定的进程,最常用于终止进程。 | +| `killall` | 根据进程的名称来终止一组进程。 | +| `nice` | 启动一个进程并设置其优先级。优先级较低的进程运行得较慢,从而减少对系统资源的占用。 | +| `renice` | 修改已经运行的进程的优先级。 | +| `nohup` | 运行命令使其可以在用户注销后继续运行。 | +| `jobs` | 显示当前会话中的所有作业及其状态。 | +| `bg` | 将一个在后台暂停的作业恢复执行。 | +| `fg` | 将一个在后台运行的作业调到前台继续运行。 | +| `&` | 在命令后添加 `&` 可以让命令在后台运行。 | +| `disown` | 将作业从当前会话的作业列表中移除,使得该作业不会在会话结束时被终止。 | + ## 服务管理 ### 服务的概念 @@ -263,9 +285,9 @@ killall bash 与传统的 SysV init 和 Upstart 等系统相比,systemd 提供了许多高级特性。其中一个主要特点就是并行化处理,能同时启动多个服务,大大提高了系统启动的速度。此外,systemd 还支持按需启动服务,即只有在服务被需要时才启动。这些特性加上实时系统状态查看,服务依赖管理,系统资源控制等,使得 systemd 能为用户提供现代化的、高效的、全面的解决方案。 -systemd 还提供了一种新的系统配置方法,即使用 systemd 单元(unit)文件。这些单元文件用于定义服务、设备、挂载点、套接字等对象的属性和行为。单元文件是纯文本文件,易于编辑,支持灵活的配置选项。 +**systemd 还提供了一种新的系统配置方法,即使用 systemd 单元(unit)文件。**这些单元文件用于定义服务、设备、挂载点、套接字等对象的属性和行为。单元文件是纯文本文件,易于编辑,支持灵活的配置选项。 -除了基本的初始化服务,systemd 还提供了进程监控、日志管理、设备管理、网络配置、用户会话管理等多项功能。特别是通过日志管理工具 journald,实现了全面的日志管理功能。journald 可以收集各种类型的日志信息,包括内核日志、系统服务日志、用户程序日志等,然后将它们统一存储在一个中央日志库中,便于用户查阅和管理。 +除了基本的初始化服务,**systemd 还提供了进程监控、日志管理、设备管理、网络配置、用户会话管理等多项功能。**特别是通过日志管理工具 journald,实现了全面的日志管理功能。journald 可以收集各种类型的日志信息,包括内核日志、系统服务日志、用户程序日志等,然后将它们统一存储在一个中央日志库中,便于用户查阅和管理。 尽管 systemd 具有诸多优点,但由于其庞大和复杂,也引来了不少批评。一些人认为 systemd 违反了 Unix 哲学——" 做一件事,并把它做好 ",它的功能太过全面,违反了模块化设计的原则。然而,也有很多人认为,对于现代 Linux 系统来说 systemd 是必不可少的。 @@ -392,76 +414,3 @@ init [runlevel] 另一方面,新的服务管理工具和框架也正在不断出现,比如用 Go 语言编写的 [supervisord](http://supervisord.org/),或者是由 Uber 开发的 [Peloton](https://eng.uber.com/peloton/)。这些工具都试图在特定环境下提供更好的服务管理能力。 总的来说,服务管理是一个重要且不断发展的领域。随着新技术的发展,我们期待看到更多的创新和进步,以帮助我们更好地管理和维护系统服务。 - -## 设备驱动管理 - -### 设备驱动概述 - -Linux 设备驱动是操作系统中一个重要的组成部分,负责管理并控制计算机硬件。设备驱动通过提供统一的接口,使得上层的应用软件无需了解底层硬件的细节,就能够利用硬件设备的功能。无论是显卡,网卡,硬盘,USB 设备等,都需要相关的设备驱动来进行管理。 - -### 设备驱动的类型 - -在 Linux 中,设备驱动分为静态驱动和动态驱动(也称为模块)两种。静态驱动是在内核编译时直接集成在内核镜像中的,这种驱动的主要优点是启动时就已经可用,但是不能在运行时卸载。动态驱动(模块)则是可以在系统运行时按需加载和卸载的,它提供了更大的灵活性,可以根据需要添加或删除设备驱动,而无需重新编译内核。 - -### 设备驱动的加载与卸载 - -设备驱动的加载和卸载主要通过 modprobe 命令进行。modprobe 是一种在 Linux 中管理模块的命令行工具。例如,通过输入 modprobe driver_name,就可以加载对应的设备驱动;而通过 modprobe -r driver_name 则可以卸载对应的设备驱动。 - -### 设备驱动的配置 - -设备驱动的配置通常在加载驱动时通过参数传递,或者在 /etc/modprobe.d 目录下的配置文件中设置。例如,你可以在加载网卡驱动时,通过参数来设置网络速度,全双工或半双工模式等。 - -### 设备驱动的问题诊断与解决 - -如果设备驱动出现问题,你可以通过以下几种方式进行诊断和解决: - -1. 使用 `dmesg` 命令查看内核消息:`dmesg` 命令可以显示内核的环形缓冲区中的消息,这些消息通常包含了设备驱动的加载、工作状态等信息。通过分析这些消息,可以找到问题的原因。 -2. 查看系统日志:系统日志通常位于 `/var/log` 目录下,例如 `syslog`,`kern.log` 等。这些日志文件通常会包含设备驱动的错误信息,可以帮助你诊断问题。 -3. 使用 `lsmod` 命令查看已加载的模块:`lsmod` 命令可以显示当前已经加载的所有设备驱动(模块)。如果你不确定一个驱动是否已经正确加载,可以使用 `lsmod | grep driver_name` 命令来检查。 - -在 Linux 中,设备驱动的管理是一个重要但复杂的任务,它需要你对 Linux 系统有一定的了解,同时也需要具备一定的问题诊断和解决能力。 - -## 内存管理 - -### 内存的组成 - -首先,我们要了解 Linux 系统中内存的主要组成部分,它们分别是物理内存、缓冲区、缓存和交换空间。 - -1. 物理内存:这是计算机实际拥有的 RAM,也是处理器可以直接访问的存储空间。Linux 内核会将物理内存分割成多个不同的区块,用于存储不同类型的数据。 -2. 缓冲区(Buffer):缓冲区是一个临时的数据存储区,主要用于存储正在读写的数据,如文件 I/O。缓冲区可以避免系统直接访问硬盘,从而增加了系统的性能。 -3. 缓存(Cache):缓存是存储经常使用或者最近使用的数据副本的内存区域。数据缓存的目的是提高数据读取速度,减少对硬盘的读写操作。这同样也是为了提高系统的性能。 -4. 交换空间(Swap Space):交换空间是硬盘上的一个区域,被用作当物理内存不足时的临时存储。交换空间可以被看作是物理内存的扩展,但因为硬盘的读写速度远慢于 RAM,所以使用交换空间会大大降低系统性能。 - -### 查看和管理内存使用 - -#### 查看内存使用情况 - -在 Linux 中,有许多命令可以帮助我们查看系统的内存使用情况,其中包括 `free`,`top` 和 `htop` 等命令。 - -`free` 命令可以显示系统的物理内存、交换空间和缓存的使用情况。例如,执行 `free -h` 命令,系统就会以人类可读的格式(如 KB,MB,GB)显示内存使用情况。 - -`top` 和 `htop` 命令可以实时显示系统的运行状态,包括内存使用情况,以及每个进程的 CPU 使用率,内存使用率等信息。这些信息可以帮助我们找出那些占用内存过多的进程,以便进行进一步的优化。 - -管理交换空间 - -在 Linux 中,我们可以使用 `swapon` 和 `swapoff` 这两个命令来管理交换空间。`swapon` 命令可以启用交换空间,例如执行 `swapon /dev/sda1` 命令就可以启用 `/dev/sda1` 分区作为交换空间。而 `swapoff` 命令则可以关闭交换空间,例如执行 `swapoff /dev/sda1` 命令就可以关闭 `/dev/sda1` 分区的交换空间。 - -#### 清理缓存 - -在 Linux 系统中,我们还可以使用一些命令来清理缓存,以便释放内存。例如,执行 `sync; echo 3 > /proc/sys/vm/drop_caches` 命令就会将所有待写入磁盘的数据写入磁盘,然后清理缓存。然而,清理缓存可能会暂时影响系统性能,因为系统需要重新从磁盘读取数据来填充缓存。因此,我们应在必要时才清理缓存,例如在系统内存非常紧张时。 - -### 内存优化 - -在 Linux 系统中,内存优化可能包括以下几个方面:调整内核参数,管理服务,以及设置合适的交换空间。 - -#### 调整内核参数 - -内核参数是 Linux 内核的配置选项,它们影响内核的行为和性能。例如,我们可以调整页面缓存的大小,影响系统对内存的使用。在 `/proc/sys/vm` 目录下,有许多可以调整的内核参数,例如 `swappiness`(影响系统使用交换空间的频率),`dirty_ratio`(影响系统写入磁盘的频率)等。 - -#### 管理服务 - -在 Linux 系统中,许多服务会在后台运行,占用系统资源。关闭不必要的服务可以减少内存使用,提高系统性能。我们可以使用 `systemctl` 命令来查看和管理服务,例如 `systemctl stop apache2` 命令就可以停止 Apache 服务。 - -#### 设置合适的交换空间 - -交换空间的大小和位置都会影响系统性能。一般来说,我们建议设置的交换空间大小为物理内存的 1.5 至 2 倍。而交换空间的位置,我们推荐设置在 SSD 上,因为 SSD 的读写速度快于传统的机械硬盘。