《Linux从小白到高手》理论篇(七):Linux的时间管理运行级别启动过程原理详解

  1. List item
    本篇将介绍Linux的时间管理&运行级别相关知识,并将深入介绍Linux的启动过程及原理。

Linux的时间管理

Linux 时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称 RTC)时钟。系统时钟是指当前 Linux Kernel 中的时钟,而硬件时钟则是主板上由电池供电的时钟,这个硬件时钟可以在BIOS 中进行设置。当 Linux 启动时,硬件时钟会去读取系统时钟的 设置,然后系统时钟就会独立于硬件运作。
Linux 中的所有命令(包括函数)都是采用的系统时钟设置。在 Linux 中,用于时钟查看和设置的命令主要有date、hwclock 和 clock。其中,clock 和 hwclock 用法相近,只用一个就行,只不过 clock 命令除了支持 x86 硬 件体系外,还支持 Alpha 硬件体系。

1、查看时间

查看系统时间:
使用 date 命令可以显示当前系统的日期和时间。例如:date,输出格式通常为“星期几 月份 日期 小时:分钟:秒 时区 年份”。

date +"%Y-%m-%d %H:%M:%S" 

可以以特定格式显示时间,如“2024-09-30 12:30:00”。
查看硬件时钟时间:

`sudo hwclock --show:`

显示硬件时钟时间。硬件时钟通常是计算机主板上的时钟芯片所保存的时间。

2、设置时间

设置系统时间:

sudo date -s "YYYY-MM-DD HH:MM:SS",

将系统时间设置为指定的时间格式,其中“YYYY-MM-DD HH:MM:SS”是具体的时间值。
例如:sudo date -s “2024-10-01 10:30:00”。
设置硬件时钟时间:

sudo hwclock --set --date="YYYY-MM-DD HH:MM:SS"

例如:sudo hwclock --set --date=“2024-10-01 10:30:00”。
同步系统时间和硬件时钟:
将系统时间写入硬件时钟:

sudo hwclock --systohc

将硬件时钟时间读取到系统时间:sudo hwclock --hctosys。

3、时区设置

查看当前时区:

`timedatectl | grep "Time zone"`

可以查看当前系统的时区设置。
cat /etc/timezone:在某些系统上也可以通过查看这个文件来确定时区。
设置时区:
使用 timedatectl 命令:

sudo timedatectl set-timezone timezone_name,

其中“timezone_name”是你想要设置的时区名称,如“Asia/Shanghai”。
直接修改配置文件:
对于基于 Debian 的系统,修改 /etc/timezone 文件,将其内容改为所需的时区名称,然后执行

sudo dpkg-reconfigure --frontend noninteractive tzdata 

使更改生效。
对于基于 Red Hat 的系统,修改 /etc/sysconfig/clock 文件,设置 ZONE 变量为所需的时区名称,如 ZONE=“Asia/Shanghai”,然后执行 sudo hwclock --systohc 同步硬件时钟。
4、时间同步服务
NTP(Network Time Protocol)服务:
安装:
在 Ubuntu 系统:sudo apt install ntp。
在 CentOS 系统:sudo yum install ntp。
配置:
主要配置文件通常是 /etc/ntp.conf。可以在这个文件中添加或修改时间服务器地址。例如:server ntp_server_address,其中 ntp_server_address 可以是公共的 NTP 服务器地址,如 pool.ntp.org、time.windows.com 等。
启动和管理:
启动服务:(不同系统服务名称可能略有不同)。

sudo systemctl start ntpd

停止服务:

sudo systemctl stop ntpd。

重启服务:

sudo systemctl restart ntpd。

设置服务在系统启动时自动启动:

sudo systemctl enable ntpd。

检查状态:

sudo systemctl status ntpd,

可以查看服务的运行状态、上次同步时间等信息。
chrony 时间同步服务:
安装:
在 Ubuntu 上可以使用 sudo apt install chrony,在 CentOS 上可以使用 sudo yum install chrony。
配置:
通常需要修改 /etc/chrony.conf 文件,添加或修改时间服务器地址。
启动和管理:
启动服务:

sudo systemctl start chronyd。

停止服务:

sudo systemctl stop chronyd。

重启服务:

sudo systemctl restart chronyd。

设置服务在系统启动时自动启动:

sudo systemctl enable chronyd。

检查状态:

sudo systemctl status chronyd。

Linux的运行级别

在 Linux 系统中,运行级别(runlevel)用于定义系统的不同运行状态。不同的运行级别会启动不同的服务集合,以满足特定的系统需求。

1. 运行级别的原理

在目录 /etc/rc.d/init.d 下有许多服务器脚本程序,一般称为服务(service), 在 /etc/rc.d 下有 7 个名为 rcN.d 的目录,其中 N=0-6,对应于系统的 7 个运行级别, rcN.d 目录下,都是一些符号链接文件,这些链接文件都指向 init.d 目录下的 service 脚本文件,这些链接文件的命名规则是 “K+nn+服务名” 或 “S+nn+服务名”,其中 nn 为 2 位数字:
例: rc3.d 目录下的链接文件 S80sendmail 就指向 service 脚本文件 …/init.d/sendmail系统会根据指定的 runlevel 进入对应的 rcN.d 目录,并按照文件名顺序检索目录下的链接文件:
• 对于以 K 为开头的链接文件,系统将终止对应的服务
• 对于以 S 为开头的链接文件,系统将启动对应的服务
通过这种方式来实现 “不同的运行级别运行不同的程序和服务”

2、运行级别的概念

传统的运行级别定义:
0:关机。
1:单用户模式,主要用于系统维护,如重置密码等。
2:多用户模式,没有网络服务。
3:多用户模式,有网络服务,通常是服务器的常用运行级别。
4:用户自定义运行级别,一般很少使用。
5:图形化多用户模式,类似于运行级别 3 但带有图形界面。
6:重启。
现代系统的变化:
许多现代 Linux 发行版,如 Systemd 主导的系统,运行级别的概念有所变化,但仍然保留了一些类似的功能划分。例如,Systemd 使用 “target” 来替代传统的运行级别,但其功能和目的在一定程度上与传统运行级别相似。

3、查看当前运行级别

使用 runlevel 命令可以查看系统当前的运行级别和上一次的运行级别。例如:输出可能是 “N 5”,其中 “N” 表示上一次运行级别未知,“5” 表示当前运行级别为图形化多用户模式。在 Systemd 系统中,可以使用以下命令查看当前的目标(类似于运行级别):systemctl get-default,它将显示当前系统的默认启动目标,例如 “graphical.target” 对应传统的运行级别 5。

4、切换运行级别

在传统的 init 系统中,可以使用 init 命令来切换运行级别。例如:sudo init 3 将系统切换到多用户模式(有网络服务)。在 Systemd 系统中,切换目标(类似运行级别)的方法如下:

sudo systemctl isolate multi-user.target 

相当于切换到传统的运行级别 3。

sudo systemctl isolate graphical.target 

相当于切换到传统的运行级别 5。

5、配置默认运行级别

对于传统的 init 系统:
编辑 /etc/inittab 文件可以配置系统的默认运行级别。例如,将 “id:5:initdefault:” 改为 “id:3:initdefault:” 可以将系统默认启动到多用户模式(有网络服务)。
在 Systemd 系统中:
使用 systemctl set-default 命令来设置默认启动目标。例如:

sudo systemctl set-default multi-user.target 

设置系统默认启动到类似于传统运行级别 3 的状态。

sudo systemctl set-default graphical.target 

设置系统默认启动到类似于传统运行级别 5 的状态。
了解和正确管理运行级别对于系统的稳定运行和满足特定需求非常重要。在进行运行级别切换或配置时,要谨慎操作,确保不会影响系统的正常运行和关键服务。

Linux的启动

1、Linux的启动流程

在这里插入图片描述
在这里插入图片描述
1.加载BIOS
计算机电源加电质检,首先加载基本输入输出系统(Basic Input Output System,BIOS),BIOS中包含硬件CPU、内存、硬盘等相关信息,包含设备启动顺序信息、硬盘信息、内存信息、时钟信息、即插即用(Plug-and-Play,PNP)特性等。加载完BIOS信息,计算机将根据顺序进行启动。
2.读取MBR
读取完BIOS信息,计算机将会查找BIOS所指定的硬盘MBR引导扇区,将其内容复制到0x7c00地址所在的物理内存中。被复制到物理内存的内容是Boot Loader,然后进行引导。
3.GRUB引导
GRUB启动引导器是计算机启动过程中运行的第一个软件程序,当计算机读取内存中的GRUB配置信息后,会根据其配置信息来启动硬盘中不同的操作系统。
4.加载Kernel
计算机读取内存映像,并进行解压缩操作,屏幕一般会输出“Uncompressing Linux”的提示,当解压缩内核完成后,屏幕输出“OK, booting the kernel”。系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。
5.设定Inittab运行等级
内核加载完毕,会启动Linux操作系统第一个守护进程init,然后通过该进程读取/etc/inittab文件,/etc/inittab文件的作用是设定Linux的运行等级。
6.加载rc.sysinit
读取完运行级别,Linux系统执行的第一个用户层文件/etc/rc.d/rc.sysinit,该文件功能包括:设定PATH运行变量、设定网络配置、启动swap分区、设定/proc、系统函数、配置Selinux等。
7.加载内核模块
读取/etc/modules.conf文件及/etc/modules.d目录下的文件来加载系统内核模块。该模块文件,可以后期添加或者修改及删除。
8.启动运行级别程序
根据之前读取的运行级别,操作系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。
9.读取rc.local文件
操作系统启动完相应服务之后,会读取执行/etc/rc.d/rc.local文件,可以将需要开机启动的任务加入到该文件末尾,系统会逐行去执行并启动相应命令。
10.执行/bin/login程序
执行/bin/login程序,启动到系统登录界面,操作系统等待用户输入用户名和密码,即可登录到Shell终端,如图3-7所示,输入用户名、密码即可登录Linux操作系统,至此Linux操作系统完整流程启动完毕。,

2,Linux中常用的启动引导工具:

1、GRUB(Grand Unified Bootloader)
功能特点:
–是最常见的 Linux 启动引导程序之一。
–支持多操作系统启动,可以在一台计算机上引导多个不同的操作系统,如 Linux、Windows 等。
–提供菜单界面,用户可以在启动时选择要启动的操作系统或内核版本。
–可以通过编辑配置文件来定制启动选项,如设置默认启动项、调整内核参数等。
使用方法:
配置文件通常是 /boot/grub/grub.cfg,但不建议直接编辑这个文件,而是通过修改 /etc/default/grub 和运行 sudo update-grub 命令来更新 GRUB 配置。在 GRUB 菜单界面,可以使用键盘方向键选择启动项,按回车键启动。还可以按 e 键编辑启动项的内核参数等。
2、LILO(Linux Loader)
功能特点:
–早期的 Linux 启动引导程序。
–相对简单,占用空间小。
–可以直接安装在主引导记录(MBR)中。
使用方法:
–配置文件是 /etc/lilo.conf,修改配置后需要运行 sudo lilo 命令使配置生效。
–在启动时,LILO 会显示一个简单的启动菜单,用户选择启动项即可。
3、Systemd-boot
功能特点:
–是一种相对较新的启动引导程序,通常与 Systemd 初始化系统配合使用。
–简洁高效,快速启动。
–支持 UEFI 系统,并且可以自动检测和加载内核及初始 RAM 磁盘。
使用方法:
–配置文件通常位于 /boot/loader/entries/ 目录下,以 .conf 为后缀的文件。
–系统会根据配置文件自动生成启动菜单,用户在启动时选择相应的启动项。
这些启动引导工具在不同的 Linux 发行版和场景中可能会有不同的使用和配置方法。在选择启动引导工具时,需要考虑系统的需求、硬件环境和个人偏好等因素。

本篇完结。
码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者。

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

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

相关文章

Linux驱动开发(速记版)--设备树插件

第六十八章 设备树插件介绍 Linux 4.4之后引入了动态设备树,其中的设备树插件(Device Tree Overlay)是一种扩展机制,允许在运行时动态添加、修改或删除设备节点和属性。 设备树插件机制通过DTS(设备树源文件&#xff0…

Qt C++设计模式->命令模式

命令模式(Command Pattern)是一种行为型设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求对客户端进行参数化,对请求排队或记录请求日志,并支持可撤销的操作。命令模式通过将请求的发送者与执…

protobuf 讲解

一、序列化概念回顾 二、什么是PB 将结构化数据进行序列化的一种方式 三、PB的特点 语言无关、平台无关:即PB支持Java,C、Python等多种语言。支持多个平台 高效:即比XML更小,更快,更为简单。 扩展性、兼容性好&am…

rabbitMq------客户端模块

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言消费者模块信道管理模块管理的字段提供的接口 信道内存管理连接管理类 前言 在RabbitMQ中,提供服务的是信道,因此在客⼾端的实现中&…

WPF之UI进阶--控件样式与样式模板及词典

WPF的优势之一就是能够更加容易快捷的对窗体和控件的外面进行改造,换句话说,那就是UI设计个性化更加容易。主要是借助了样式、模板及词典来实现的。那么本篇博文就一一对他们进行介绍。 文章目录 一、样式1: 定义样式2: 使用Setter设置属性关于Property和…

Python知识点:如何使用Edge Impulse与Python进行机器学习模型部署

开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 使用Edge Impulse与Python进行机器学习模型部署 在物联网和边缘计算领域&#x…

java线程池参数设置原则

线程池参数设置原则 1 如何为线程池设置合适的线程参数? 目前根据一些开源框架,设置多少个线程数量通常是根据应用的类型**:I/O 密集型、CPU 密集型。** I/O密集型 I/O密集型的场景在开发中比较常见,比如像 MySQL数据库读写、文…

C或C++判断指针是否指向同一块内存

有时需要判断指针是否指同一块内存,例如设计字符串时: (1)insert函数 (2) replace函数 (3)assign函数 难点是迭代器,判断是否同一个迭代器时,需要你在设计迭代器时加…

Kubernetes-环境篇-01-mac开发环境搭建

1、brew安装 参考知乎文章:https://zhuanlan.zhihu.com/p/111014448 苹果电脑 常规安装脚本(推荐 完全体 几分钟安装完成) /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"苹果电脑 极…

Rstudio:强大的R语言集成开发环境(IDE)

Rstudio 应该是 R 语言使用的标配,尽管 Rstudio 的母公司 Posit 推出了新一代的集成开发环境 Positron,但其还处于开发阶段。作为用户不妨让其成熟后再使用,现阶段还是 Rstudio 更稳定。 如果你在生物信息学或统计学领域工作,R语言…

Python | Leetcode Python题解之第455题分发饼干

题目&#xff1a; 题解&#xff1a; class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:g.sort()s.sort()m, n len(g), len(s)i j count 0while i < m and j < n:while j < n and g[i] > s[j]:j 1if j < n:count 1i …

uni-app - - - - -vue3使用i18n配置国际化语言

uni-app - - - - -使用i18n配置国际化语言 1. 安装vue-i18n2. 配置文件2.1 创建如下文件2.2 文件配置2.3 main文件导入i18n 3. 页面内使用3.1 template内直接使用3.2 变量接收使用 1. 安装vue-i18n npm install vue-i18n --save2. 配置文件 2.1 创建如下文件 locales文件夹里…

水泵模块(5V STM32)

目录 一、介绍 二、传感器原理 1.尺寸介绍 2.继电器控制水泵电路原理图 三、程序设计 main.c文件 bump.h文件 bump.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 水泵模块(bump)通常是指用于液体输送系统的组件&#xff0c;它负责将水或其他流体从低处提…

PHP常用的超全局变量(8个)

在PHP中&#xff0c;超全局变量是一种特殊的变量类型&#xff0c;它们在全部作用域中始终可用&#xff0c;无需使用global关键字来访问。这些变量提供了在PHP脚本中访问和操作各种数据和环境信息的便捷方式。以下是PHP中常用的8个超全局变量的详细介绍&#xff1a; 1. $GLOBAL…

四.网络层(上)

目录 4.1网络层功能概述 4.2 SDN基本概念 4.3 路由算法与路由协议 4.3.1什么是路由协议&#xff1f; 4.3.2什么是路由算法&#xff1f; 4.3.3路由算法分类 (1)静态路由算法 (2)动态路由算法 ①全局性 OSPF协议与链路状态算法 ②分散性 RIP协议与距离向量算法 4.3.…

【C语言】内存函数的使用和模拟实现

文章目录 一、memcpy的使用和模拟实现二、memmove的使用和模拟实现三、memset的使用四、memcmp的使用 一、memcpy的使用和模拟实现 在之前我们学习了使用和模拟实现strncpy函数&#xff0c;它是一个字符串函数&#xff0c;用来按照给定的字节个数来拷贝字符串&#xff0c;那么问…

Javascript数组研究03_手写实现_fill_filter_find_findIndex_findLast_findLastIndex

6 Array.fill() 6.1 基本介绍 fill() 方法用一个固定值填充一个数组中从起始索引&#xff08;默认为 0&#xff09;到终止索引&#xff08;默认为 array.length&#xff09;内的全部元素。它返回修改后的数组。 fill(value) fill(value, start) fill(value, start, end)输入…

【本地免费】SimpleTex 图像识别latex公式

文章目录 相关教程相关文献安装教程 由于mathpix开始收费了&#xff0c;于是本文将介绍一款目前本地免费的SimpleTex工具 相关教程 【超详细安装教程】LaTeX-OCR 图像识别latex公式&#xff08;开源免费&#xff09;_latex图片识别-CSDN博客 相关文献 SimpleTex主页——致力…

如何在微信小程序中实现分包加载和预下载

如何在微信小程序中实现分包加载和预下载 概述 微信小程序提供了分包加载和预下载功能&#xff0c;这有助于优化应用的加载时间&#xff0c;提升用户体验。本文将详细介绍如何在微信小程序中配置分包加载和预下载。 步骤一&#xff1a;配置分包加载 修改app.json文件&#x…

Dijkstra算法,动态规划和滑动窗口

一&#xff1a;最小花费 题目链接&#xff1a;1928. 规定时间内到达终点的最小花费 - 力扣&#xff08;LeetCode&#xff09; &#xff08;1&#xff09;Dijkstra算法 理解问题&#xff1a;首先&#xff0c;我们需要理解问题的核心是找到一条从城市 0 到城市 n-1 的路径&…