Linux学习-69-Linux系统启动管理

news2024/12/27 11:41:40

16 Linux系统启动管理

  • Linux 系统的启动是不需要人为参与和控制的,只要选择开机,系统就会按照设定好的方式进行启动。不过,了解系统的启动有助于我们在系统出现问题时能够快速地修复 Linux 系统。在 CentOS 6.x 中,系统的启动过程和以前的系统相比变化较大,CentOS 6.x 系统使用 Upstart 启动服务取代了原先的 System V init 启动服务。Upstart 是事件驱动类型的,使用事件来启动和关闭系统服务;而 System V init 则基于运行级别的系统,使用运行级别和链接来启动和关闭系统服务。Upstart 启动方式比原先的 System V init 启动方式要更快速。因此,虽然 CentOS 6.x 比 CentOS 5.x 更加庞大,但是 CentOS 6.x 的启动速度却快于 CentOS 5.x。

16.1 系统启动流程(以CentOS 6为对象)

  • Linux 系统的启动,从计算机开机通电自检开始,一直到登陆系统,需要经历多个过程。学习 Linux 的启动过程,有助于了解 Linux 系统的结构,也对系统的排错有很大的帮助。CentOS 6.x 系统启动过程发生了较大的变化,使用 Upstart 启动服务取代了原先的 System V init 启动服务。Upstart 启动服务的效率更高,启动速度更快。

  • 目前,CentOS 6.x 的启动流程经历以下几步:

    1. 服务器加电,加载 BIOS 信息,BIOS 进行系统检测。依照 BIOS 设定,找到第一个可以启动的设备(一般是硬盘);
    2. 读取第一个启动设备的 MBR (主引导记录),加载 MBR 中的 Boot Loader(启动引导程序,最为常见的是 GRUB)。
    3. 依据 Boot Loader 的设置加载内核,内核会再进行一遍系统检测。系统一般会采用内核检测硬件的信息,而不一定采用 Bios 的自检信息。内核在检测硬件的同时,还会通过加载动态模块的形式加载硬件的驱动。
    4. 内核启动系统的第一个进程,也就是 /sbin/init。
    5. 由 /sbin/init 进程调用 /etc/init/rcS.conf 配置文件,通过这个配置文件调用 /etc/rc.d/rc.sysinit 配置文件。而 /etc/rc.d/rc.sysinit 配置文件是用来进行系统初始化的,主要用于配置计算机的初始环境。
    6. 还是通过 /etc/init/rcS.conf 配置文件调用 /etc/inittab 配置文件。通过 /etc/inittab 配置文件来确定系统的默认运行级别。
    7. 确定默认运行级别后,调用 /etc/init/rc.conf 配置文件。
    8. 通过 /etc/init/rc.conf 配置文件调用并执行 /etc/rc.d/rc 脚本,并传入运行级别参数。
    9. /etc/rc.d/rc 确定传入的运行级别,然后运行相应的运行级别目录 /etc/rc[0-6].d/ 中的脚本。
    10. /etc/rc[0-6].d/ 目录中的脚本依据设定好的优先级依次启动和关闭。
    11. 最后执行 /etc/rc.d/rc.local 中的程序。
  • 总的来说,Linux 系统的启动,要经历BIOS自检 -> 启动 GRUB -> 加载内核 -> 执行第一个进程 -> 配置系统初始环境。当然,本节仅是简单地看启动过程,接下来分别详解介绍每步启动过程。

16.2 BIOS开机自检

  • 前面提到,服务器通电后,会直接进入 BIOS,BIOS 全称 Basic Input/Output System,中文可译为基本输入/输出系统。简单地理解 BIOS,它就是固化在主板上一个 ROM(只读存储器)芯片上的程序,主要保存计算机的基本输入/输出信息、系统设置信息、开机自检程序和系统自启动程序,用来为计算机提供最底层和最直接的硬件设置与控制。也就是说,BIOS 是硬件与软件之间的接口,而且是非常基本的接口,BIOS 提供了一组基本的操作系统使用的指令,系统启动的成功与否,依赖于 BIOS。

  • BIOS 的初始化主要完成以下 3 项工作:

    1. 第一次检查计算机硬件和外围设备(第二次自检由内核进行),例如 CPU、内存、风扇灯。当 BIOS 一启动,就会做一个自我检测的工作,整个自检过程也被称为 POST(Power On Self Test)自检。
    2. 如果自检没有问题,BIOS 开始对硬件进行初始化,并规定当前可启动设备的先后顺序,选择由那个设备来开机。
    3. 选择好开启设备后,就会从该设备的 MBR(主引导目录)中读取 Boot Loader(启动引导程序)并执行。启动引导程序用于引导操作系统启动,Linux 系统中默认使用的启动引导程序是 GRUB。
  • 当 MBR 被加载到 RAM 之后,BIOS 就会将控制权交给 MBR,进入系统引导的第二阶段。

16.3 主引导目录(MBR)结构及作用

  • MBR 也就是主引导记录,位于硬盘的 0 磁道、0 柱面、1 扇区中,主要记录了启动引导程序和磁盘的分区表,MBR 中最主要的功能就是存储启动引导程序。MBR 的结构。
    在这里插入图片描述
  • MBR 共占用了一个扇区,也就是 512 Byte。其中 446 Byte 安装了启动引导程序,其后 64 Byte 描述分区表,最后的 2 Byte 是结束标记。我们已经知道,每块硬盘只能划分 4 个主分区,原因就是在 MBR 中描述分区表的空间只有 64 Byte。其中每个分区必须占用 16 Byte,那么 64 Byte 就只能划分 4 个主分区。每个分区的 16 字节的规划
存储字节数据内容及含义
第 1 字节引导标志
第 2 字节本分区的起始磁道号
第 3 字节本分区的起始扇区号
第 4 字节本分区的起始柱面号
第 5 字节分区类型,可以识别主分区和扩展分区
第 6 字节本分区的结束磁道号
第 7 字节本分区的结束扇区号
第 8 字节本分区的结束柱面号
第 9~12 字节本分区之前已经占用的扇区数
第 13~16 字节本分区的总扇区数
  • 启动引导程序的作用:BIOS 的作用就是自检,然后从 MBR 中读取出启动引导程序。那么,启动引导程序最主要的作用就是加载操作系统的内核。当然,每种操作系统的启动引导程序都是不同的。每种操作系统的文件格式不同,因此,每种操作系统的启动引导程序也不一样。不同的操作系统只有使用自己的启动引导程序才能加载自己的内核。如果我的服务器上只安装了一个操作系统,那么这个操作系统的启动引导程序就会安装在 MBR 中。BIOS 调用 MBR 时读取出启动引导程序,就可以加载内核了。但是在有些时候,我的服务器中安装了多个操作系统,而 MBR 只有一 个,那么在 MBR 中到底安装哪个操作系统的启动引导程序呢?

  • 很明显,一个 MBR 是不够用的。每块硬盘只能有一个 MBR 是不能更改的,所以不可能増加 MBR 的数量。系统只能在每个文件系统(可以看成分区)中单独划分出一个扇区,称作引导扇区(Boot Sector)。每个分区的引导扇区中也能安装启动引导程序,也就是说,在 MBR 和每个单独分区的引导扇区中都可以安装启动引导程序。这样多个操作系统才能安装在同一台服务器中(每个操作系统要安装在不同的分区中),而且每个操作系统都是可以启动的。

  • BIOS 只能找到 MBR 中的启动引导程序,而找不到在分区的引导扇区中的启动引导程序。那么,要想完成多系统启动,我们的方法是増加启动引导程序的功能,让安装到 MBR 中的启动引导程序(GRUB)可以调用在分区的引导扇区中的其他启动引导程序。

  • 因此,启动引导程序拥有以下功能:

    1. 加载操作系统的内核。这是启动引导程序最主要的功能。
    2. 拥有一个可以让用户选择的菜单,来选择到底启动哪个系统。大家如果在服务器上安装过双 Windows 系统,就应该见过类似的选择菜单,不过这个选择菜单是由 Windows 的启动引导程序提供的,而不是 GRUB。
    3. 可以调用其他的启动引导程序,这是多系统启动的关键。需要注意,Windows 的启动引导程序不能调用 Linux 的启动引导程序,所以我们一般建议先安装 Windows,后安装 Linux,是为了将 Linux 的启动引导程序安装到 MBR 中,覆盖 Windows 的启动引导程序。
  • 当然,这个安装顺序不是绝对的,就算最后安装了 Windows,我们也可以通过手工再安装 GRUB 的方法,来保证 MBR 中安装的还是 Linux 的启动引导程序。启动引导程序的作用。

在这里插入图片描述

16.4 内核(内核模块)的加载过程

  • GRUB 加载了内核之后,内核首先会再进行二次系统的自检,而不一定使用 BIOS 检测的硬件信息。这时内核终于开始替代 BIOS 接管 Linux 的启动过程了。内核完成再次系统自检之后,开始采用动态的方式加载每个硬件的模块,这个动态模块大家可以想象成硬件的驱动(默认 Linux 硬件的驱动是不需要手工安装的,如果是重要的功能,则会直接编译到内核当中;如果是非重要的功能,比如硬件驱动会编译为模块,则在需要时由内核调用。不过,如果没有被内核加载,要想驱动,就需要手工安装个硬件的硬块了)。

  • Linux 的内核在 /boot 的启动目录中:

[root@CncLucZK httpd]# ls /boot/
config-4.18.0-80.el8.x86_64									#内核的配置文件,内核编译时选择的功能与模块
efi															#可扩展固件接口,为英特尔为全新PC固件的体系结构、接口和服务提出的建议标准						
grub2														#启动引导程序GTUB的数据目录
initramfs-0-rescue-33790f3e0323419f9a055840e9d10b13.img		#虚拟文件系统(从CentOS 6.x 开始用initramfs替代了initrd,但功能是一样的)
initramfs-4.18.0-80.el8.x86_64.img
initramfs-4.18.0-80.el8.x86_64kdump.img
loader
System.map-4.18.0-80.el8.x86_64								#内核功能和内存地址的对应列表
vmlinuz-0-rescue-33790f3e0323419f9a055840e9d10b13	
vmlinuz-4.18.0-80.el8.x86_64								#用于启动的Linux内核。这个文件是一个压缩的内核镜像


lost+found
#boot分区的备份目录
symvers-2_6.32-279.el6.i686.gz
#模块符号信息
  • Linux 会把不重要的功能编译成内核模块,在需要时再调用,从而保证了内核不会过大。在多数 Linux 中,都会把硬件的驱动程序编译为模块, 这些模块保存在 /lib/modules 目录中。常见的 USB、SATA 和 SCSI 等硬盘设备的驱动,还有一些特殊的文件系统(如 LVM、RAID 等)的驱动,都是以模块的方式来保存的。

  • 如果 Linux 安装在 IDE 硬盘之上,并且采用的是默认的 ext3/4 文件系统,那么内核启动后加载根分区和模块的加载都没有什么问题,系统会顺利启动。但是,如果 Linux 安装在 SCSI 硬盘之上,或者采用的是 LVM 文件系统,那么内核(内核载入内存是启动引导程序 GRUB 调用的,并不存在硬盘驱动不识别的问题)在加载根目录之前是需要加载 SCSI 硬盘或 LVM 文件系统的驱动的。

  • SCSI 硬盘和 LVM 文件系统的驱动都放在硬盘的 /lib/modules 目录中,既然内核没有办法识别 SCSI 硬盘或 LVM 文件系统,那怎么可能读取 /lib/modules 目录中的驱动呢?Linux 给出的解决办法是使用 initramfs 这个虚拟文件系统来处理这个问题。

  • initramfe虚拟文件系统:从CentOS 6.x 开始使用 initramfs 虚拟文件系统取代了 CentOS 5.x 中的 initrd RAM Disk。它们的作用类似,可以通过启动引导程序加载到内存中,然后会解压缩并在内存中仿真成一个根目录,并且这个仿真的文件系统能够提供一个可执行程序,通过该程序来加载启动过程中所需的内核模块,比如 USB、SATA. SCSI 硬盘的驱动和 LVM、RAID 文件系统的驱动。也就是说,通过 initramfs 虚拟文件系统在内存中模拟出一个根目录,然后在这个模拟根目录中加载 SCSI 等硬件的驱动,就可以加载真正的根目录了,之后才能调用 Linux 的第一个进程 /sbin/init。

  • Initramfs 虚拟文件系统主要有以下优点:

    • initramfs 随着其中数据的増减自动増减容量。
    • 在 initramfs 和页面缓存之间没有重复数据。
    • initramfs 重复利用了 Linux caching 的代码,因此几乎没有増加内核尺寸,而 caching 的代码已经经过良好测试,所以 initramfs 的代码质量也有保证。
    • 不需要额外的文件系统驱动。
  • 只需要知道 initramfs 是为了在内核中建立一个模拟根目录,这个模拟根目录是为了可以调用 USB、SATA、SCSI、LVM、RAID 等硬盘接口或文件系统的驱动模块,加载了驱动模块后才可以加载真正的系统根目录。
    在这里插入图片描述

  • 既然 initramfs 是一个仿真根目录,可以看看这个仿真根目录中的文件情况:

[root@CncLucZK httpd]# mkdir /tmp/initramfs
[root@CncLucZK httpd]# cp /boot/initramfs-4.18.0-80.el8.x86_64.img /tmp/initramfs
[root@CncLucZK httpd]# cd /tmp/initramfs
[root@CncLucZK initramfs]# file initramfs-4.18.0-80.el8.x86_64.img	#查看文件类型,发现这个文件是一个使用gzip命令打包的压缩包
initramfs-4.18.0-80.el8.x86_64.img: gzip compressed data, max compression, from Unix, original size 57591808
#修改文件的扩展名为.gz
[root@CncLucZK initramfs]# mv initramfs-4.18.0-80.el8.x86_64.img initramfs-4.18.0-80.el8.x86_64.img.gz
[root@CncLucZK initramfs]# gunzip initramfs-4.18.0-80.el8.x86_64.img.gz
[root@CncLucZK initramfs]# ll
total 56244
-rw------- 1 root root 57591808 Oct 31 00:28 initramfs-4.18.0-80.el8.x86_64.img
[root@CncLucZK initramfs]# file initramfs-4.18.0-80.el8.x86_64.img			#查看文件类型,使用cpio命令的压缩文件
initramfs-4.18.0-80.el8.x86_64.img: ASCII cpio archive (SVR4 with no CRC)
[root@CncLucZK initramfs]# cpio -ivcdu<initramfs-4.18.0-80.el8.x86_64.img
...
usr/share/unimaps
var
var/lib
var/lib/iscsi
var/lock
var/run
var/tmp
112484 blocks
[root@CncLucZK initramfs]# ll
total 56288
lrwxrwxrwx  1 root root        7 Oct 31 00:36 bin -> usr/bin
drwxr-xr-x  2 root root     4096 Oct 31 00:36 dev
drwxr-xr-x 12 root root     4096 Oct 31 00:36 etc
lrwxrwxrwx  1 root root       23 Oct 31 00:36 init -> usr/lib/systemd/systemd
-rw-------  1 root root 57591808 Oct 31 00:28 initramfs-4.18.0-80.el8.x86_64.img
lrwxrwxrwx  1 root root        7 Oct 31 00:36 lib -> usr/lib
lrwxrwxrwx  1 root root        9 Oct 31 00:36 lib64 -> usr/lib64
drwxr-xr-x  2 root root     4096 Oct 31 00:36 proc
drwxr-xr-x  2 root root     4096 Oct 31 00:36 root
drwxr-xr-x  2 root root     4096 Oct 31 00:36 run
lrwxrwxrwx  1 root root        8 Oct 31 00:36 sbin -> usr/sbin
-rwxr-xr-x  1 root root     3126 Oct 31 00:36 shutdown
drwxr-xr-x  2 root root     4096 Oct 31 00:36 sys
drwxr-xr-x  2 root root     4096 Oct 31 00:36 sysroot
drwxr-xr-x  2 root root     4096 Oct 31 00:36 tmp
drwxr-xr-x  7 root root     4096 Oct 31 00:36 usr
drwxr-xr-x  4 root root     4096 Oct 31 00:36 var
#initramfs虚拟文件系统中的内容,和根目录很像

16.5 /sbin/init初始化系统环境

  • 在内核加载完毕,并完成硬件检测与驱动程序加载后,此时主机硬件已经准备完毕,内核会主动呼叫第一个进程,也就是 /sbin/init,此配置文件最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设定、语言、文件系统格式及其他服务的启动等。

  • 这里和 CentOS 5.x 系统相比也有较大变化。在 CentOS 5.x 系统中,主要通过 init 进程的配置文件 /etc/inittab 来设定系统,并启动 Linux。但是在 CentOS 6.x 系统中,由于用 Upstart 启动服务来替换以前的 init,所以在 /etc/inittab 配置文件中只能定义系统的默认运行级别,而其他的功能是靠 /etc/init/ 目录中的其他配置文件实现的。可以把 /etc/init/ 目录中的配置文件看成以前 /etc/inittab 这个文件功能的分拆。

  • 之前提到由 /sbin/init 进程可通过 /etc/init/rcS.conf 配置文件,分别找到 /etc/rc.d/rc.sysinit 配置文件和 /etc/inittab 配置文件,前者用于初始化系统,配置计算机的初始环境;后者用于确定系统的默认运行级别。

  • 接下来,先介绍 /etc/rc.d/rc.sysinit 配置文件。如果我们使用 Vim 查看 /etc/rc.d/rc.sysinit 配置文件,就会发现这个这个配置文件主要进行了以下几项工作:

    • 获得网络环境和主机类型;
    • 测试设备:除了挂载内存设备 /proc 之外,还会主动侦测系统上是否具有 usb 设备,如果有,则会主动加载 usb 的驱动程序,并尝试挂载 usb 文件系统;
    • 开机启动画面 Plymouth(代替了以往的 RHGB);
    • 判断是否启用 SELinux;
    • 显示开机过程中的欢迎画面;
    • 初始化硬件;
    • 用户自定义模块的加载,用户可以在 /etc/sysconfig/modules/*.modules 加入自订的模块,则此时会被加载到系统当中;
    • 配置内核的参数,系统会主动去读取 /etc/sysctl.conf 这个文件的配置参数,使内核的功能成为我们想要的样子。
    • 设置主机名。
    • 同步存储器。
    • 设备映射器及相关的初始化。
    • 初始化软件磁盘阵列 (RAID)。
    • 初始化 LVM 的文件系统功能。
    • 检验磁盘文件系统 (fsck)。
    • 设置磁盘配额 (quota)。
    • 重新以可读写模式挂载系统磁盘。
    • 更新 quota (非必要)。
    • 启动系统虚拟随机数生成器。
    • 配置机器(非必要)。
    • 清除开机过程中的临时文件。
    • 创建 ICE 目录。
    • 启动交换分区(swap)。
    • 将开机信息写入 /var/log/dmesg 文件中。
  • 在以上过程中,比较值得注意的是自定模块的加载。在 CentOS 中,如果我们想要加载核心模块的话,就可以将整个模块写入到 /etc/sysconfig/modules/*.modules 中。当然,此过程并不是必须的,通常我们的默认模块已经够用,除非对硬件太新,不得不自己加载模块,否则无需刻意添加任何模块。

  • 可以看到,/etc/rc.d/rc.sysinit 配置文件已经将基本的系统配置数据都写好了,我们可以查询 /var/log/dmesg 文件或使用 dmesg 命令查看系统在启动时到底发生了什么。当然,我们也可以通过这个命令来看看 Linux 服务器的硬件信息。

16.6 /etc/inittab:设置(修改)系统默认运行级别

  • 从CentOS 6.x 开始,/etc/inittab 配置文件只能用来设置系统的默认运行级别。其实 Linux 是通过运行级别来确定系统启动时到底启动哪些服务的。Linux 默认有 7 个运行级别:
运行级别含 义
0关机
1单用户模式,可以想象为 Windows 的安全模式,主要用于系统修复
2不完全的命令行模式,不含 NFS 服务
3完全的命令行模式,就是标准字符界面
4系统保留
5图形模式
6重新启动
  • 在 Linux 系统中可以使用 runlevel 命令来查看系统的运行级别,命令如下:
[root@CncLucZK ~]# runlevel
N 3
#N代表在进入这个级别前,上一个级别是什么;3代表当前级别
  • 在这个命令的结果中,"N 3"中的N代表在进入这个级别前,上一个级别是什么;3 代表当前级别。“N” 就是 None 的意思,也就是说,系统是开机直接进入 3 运行级别的,没有上一个运行级别。那如果从图形界面切换到字符界面,再查看运行级别,就应该是这样的:
[root@CncLucZK ~]# runlevel
5 3
#代表由5级别进入3级别
  • 使用 init 命令(注意这不是 init 进程)改变当前的运行级别
[root@CncLucZK ~]# init 5
#进入图形界面,当然要已经安装了图形界面才可以
[root@CncLucZK ~]# init 0
#关机
[root@CncLucZK ~]# init 6
#重新启动

不过要注意,使用 init 命令关机和重启并不是太安全,容易造成数据丟失。所以推荐大家使用 shutdown 命令进行关机和重启。

  • 系统默认运行级别:/etc/inittab 配置文件的功能就是确定系统的默认运行级别,也就是系统开机后会进入那个运行级别。此文件的内容如下:
[root@CncLucZK ~]# cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#系统会先调用/etc/init/rcS.conf
# Individual runlevels are started by /etc/init/rc.conf
#在调用/etc/init/rc.conf,在不同的运行级别启动不同的服务
# Ctrl-Alt-Delete is handled by/etc/init/control-alt-delete.conf
#通过这个配置文件判断Ctri+Alt+Delete热启动键是否可用
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#判断系统可以启动的本地终端数量及终端的基本设置(如颜色)
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5-X11
# 6 - reboot (Do NOT set initdefault to this)
#就是刚刚的 0~6运行级别的说明
id:3:initdefault:
#这就是系统的默认运行级别,也就是系统开机后直接进入哪个运行级别
  • 注意,这里的默认运行级别只能写 3 或 5,其他的级别要么是关机重启,要么是保留或单用户,都不能作为系统默认运行级别。

16.7 /etc/rc.d/rc.local配置文件用法

  • 在 /etc/rc[06].d/ 目录中的程序启动之后,系统的启动就已经完成。不过,我们总有一些程序是需要在系统启动之后随着系统一起启动的。这时我们并不需要自己把需要启动的服务链接到 /etc/rc3.d/ 目录中,因为系统给我们准备了 /etc/rc.d/rc.local 配置文件。这个配置文件会在用户登陆之前读取,这个文件中写入了什么命令,在每次系统启动时都会执行一次。也就是说,如果有任何需要在系统启动时运行的工作,则只需写入 /etc/rc.d/rc.local 配置文件即可。这个文件的内容如下:
[root@CncLucZK ~]# ll /etc/rc.local
lrwxrwxrwx 1 root root 13 Jul 21  2020 /etc/rc.local -> rc.d/rc.local	#有一个链接文件,两个文件修改哪一个都可以
[root@CncLucZK ~]# cat /etc/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local		#默认会touch这个文件,每次系统启动时都会touch这个文件,这个文件的修改时间就是系统的启动时间
/etc/rc.d/init.d/bt start			#如果写入RPM包安装的bt服务的启动命令,bt服务就会在开机时自动启动
  • Linux 的启动过程基本上就是这样的,我们把启动流程图补充完整,
    在这里插入图片描述

  • 系统的启动过程就是这样的,最终我们就能登录字符界面的 Linux 了。不过,如果需要启动图形界面的 Linux,则还需要调用 X Window 接口。在启动过程中还有一个配置文件会生效,就是 /etc/init/start-ttys.conf,这个文件主要定义了 Linux 支持的 1~6 个本地终端(tty[1-6])。如果在本机,则可以使用快捷键 Alt+F1~F6 来切换这 6 个本地终端;如果安装并启动了图形界面,则可以使用快捷键 Ctrl+Alt+F7 来切换图形终端。

  • 字符界面的启动过程只需了解,不需要彻底掌握。但是掌握了 Linux 系统的启动过程,会更加了解 Linux 的结构。当然,如果非常自信,则可以尝试安装 gentoo Linux 这个版本,因为这个 Linux 版本到目前为止还是纯源码安装的,如果能够安装成功,就会对 Linux 系统的结构及启动过程有更深入的理解。

参考文献:
Linux内核(内核模块)的加载过程

下一篇:Linux学习-70-启动引导程序(GRUB)加载内核的过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NoSQLBooster for MongoDB 7.1.X

最智能的 MongoDB IDE NoSQLBooster 是 MongoDB v2.6-6.0 的跨平台 GUI 工具&#xff0c;它提供了内置的 MongoDB 脚本调试器MongoDB 脚本调试器、全面的服务器监控工具、链接流畅查询、SQL 查询、查询代码生成器、任务调度、ES2020 支持和高级智能感知体验。 嵌入式 MongoDB 外…

网络面试-0x17如何立即诶OSI模型和TCP/IP协议

OSI(Open System Interconnect) 开放式通信系统互连参考模型。 每一层实现各自的功能和协议&#xff0c;并完成与相邻层的接口通信。即每一层扮演固定的角色&#xff0c;互不打扰。 应用层 ⑦ 作用&#xff1a;通过应用程序间的交互来完成特定的网络应用。 定义了应用程序之间…

【ONE·R || R与C++混合编程简单介绍 】

总言 课堂演讲&#xff1a;R语言与CPP混合编程课后学习汇报。    文章目录总言1、汇报目的&#xff12;、RCPP2.1、简单介绍&#xff1a;2.2、简单使用演示&#xff1a;2.1.1、Rcpp包与RTools2.2.2、上手尝试1.0&#xff1a;一个hello world小程序。2.2.3、上手尝试2.0&#…

STC 51单片机57——矩阵键盘 基本原理演示

51单片机 矩阵键盘 基本原理演示 #include "reg51.h" sbit P11P1^1; sbit P14P1^4; sbit P20P2^0; sbit P21P2^1; void main(void) { P111;// Hight P140; //Low if(P111) P200; else P210; while(1); }

刷爆力扣之较大分组的位置

刷爆力扣之较大分组的位置 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 工作原因拖更些时日&#xff0c;今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照…

Java项目:SSM农业信息管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 管理员角色包含以下功能&#xff1a; 管理员登陆,用户管理,新闻管理,留言列表查看等功能。 用户角色包含以下功能&#xff1a; 查看所有新闻,市…

免费分享20套微信小程序源码 源码免费下载【强烈推荐】

淘源码&#xff1a;国内知名的源码免费下载平台 微信小程序源码包括&#xff1a;商城系统、点餐外卖、垃圾分类、预约洗车、物业管理、校园跑腿、驾考学习、会议预约、图书管理、智能停车、在线答题等小程序源码。 源码分享&#xff0c;文末获取源码&#xff01; 1、JAVA微信…

微信API接口、微信二次开发API调用

微信API接口、微信二次开发API调用 微信协议接口调用-加微信好友及通过好友请求 加微信好友 /** * 微信自动添加好友 * author wechatno:tangjinjinwx * blog http://www.wlkankan.cn */ Async public void handleMsg(ChannelHandlerContext c…

代码随线录刷题|LeetCode 392.判断子序列 115.不同的子序列

目录 392.判断子序列 思路 1、确定dp数组 2、确定递推公式 3、初始化dp数组 4、遍历顺序 判断子序列 动态规划 双指针 115.不同的子序列 思路 1、确定dp数组 2、确定递推公式 3、初始化dp数组 4、遍历顺序 不同的子序列 392.判断子序列 题目链接&#xff1a;力扣 思路 比较简单…

【Exception】 Java Lambda List转换Map报错 触发异常 IllegalStateException: Duplicate key

【Exception】 Java Lambda List转换Map报错 触发异常 IllegalStateException: Duplicate key 一、问题描述 在使用Java8 lambda 将List转换为Map时&#xff0c;遇到报错&#xff1a;IllegalStateException- Duplicate key .... 具体报错信息如下&#xff1a; java.lang.Illega…

基于Dockerfile创建镜像

目录 一、Docker镜像的创建 1 基于现有镜像创建 2 基于本地模板创建 3 基于Dockerfile 创建 3.1 联合文件系统(UnionFS ) 3.2 镜像加载原理 二、Dockerfile 操作命令的指令 1 FROM 镜像 2 MAINTAINER 名字 3 RUN 命令 4 ENTRYPOINT 5 CMD ENTRYPOINT和CMD的区别&…

HTML网页设计【足球科普】学生DW静态网页设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【openWrt】设置执行定时任务

遇到一个问题&#xff0c;使用openWrt软路由搭建服务器&#xff0c;在docker装了一个maccmsV10&#xff0c;需要每天执行cj信息定时任务&#xff0c;但是maccmsV10本身不支持执行定时任务的配置的。 看了下&#xff0c;openWrt是支持本身是linux系统&#xff0c;所以是可以设…

糟糕,数据库异常不可用怎么办?

摘要&#xff1a;糟糕&#xff0c;数据库异常不可用怎么办&#xff1f;挺着急的&#xff0c;在线等。本文分享自华为云社区《糟糕&#xff0c;数据库异常不可用怎么办&#xff1f;》&#xff0c;作者&#xff1a;GaussDB 数据库。 随着数字化转型的加速&#xff0c;数据量爆发…

获取鼠标在画布中的位置

获取鼠标在画布中的位置 效果展示 概述 本文讲解如何实现我们平时用的画布软件中&#xff0c;怎么获取的我们鼠标时刻在画布中的位置。 构建HTML框架 <body><div class"box"></div> </body>CSS样式 <style>.box {/* 设置盒子…

IDEA 2022.3 发布,终于支持 redis 了

IntelliJ IDEA 发布了最新2022.3版本&#xff0c;本次更新&#xff1a;可以通过设置切换到新 UI&#xff0c;即可预览焕然一新的 IDE 外观。引入了一个新的 Settings Sync&#xff08;设置同步&#xff09;解决方案&#xff0c;用于同步和备份自定义用户设置。此外&#xff0c;…

私域运营对于企业的重要性

企业进行私域流量的精细化运营&#xff0c;不仅可以打造属于企业自己的社群王国&#xff0c;还可以挖掘存量客户的价值&#xff0c;实现更智能的客户管理和个性化运营方案。 前言 相信每个人都对瑞幸咖啡略有耳闻&#xff0c;这个国产咖啡品牌曾一度被封神&#xff0c;但随着财…

【leetcode】2404. 出现最频繁的偶数元素(js实现)

1. 题目 2404. 出现最频繁的偶数元素 2. 思路 创建哈希表&#xff0c;统计偶数的出现次数将哈希表转换成数组&#xff0c;遍历哈希表&#xff0c;设置res的初始值为[-1&#xff0c;0]&#xff0c;第一个值为偶数值&#xff0c;第二个值为这个偶数出现的次数&#xff1b;如果…

探花交友_第3章_完善个人信息(新版)

探花交友_第3章_完善个人信息(新版) 文章目录探花交友_第3章_完善个人信息(新版)课程介绍1. 完善用户信息1.1 阿里云OSS1.1.1 概述1.1.2 账号申请购买服务创建Bucket1.1.3 抽取模板工具OssPropertiesOssTemplateTanhuaAutoConfiguration1.1.4 测试1.2 百度人脸识别1.2.1 概述1.…

PyCharm+PyQT5之四第二个QT程序

前面程序实现了逻辑分离&#xff0c;第二个QT程序将建立控件之间的关联&#xff0c;并自行撰写&#xff0c;事件。 首先&#xff0c;建立只有一个按钮的界面 点击工具栏编辑信号与槽&#xff0c;按钮带有红框并拖拽&#xff0c;这样间建立了按钮与dialog的槽信号。 按钮一般是…