「Linux系列」Linux 系统启动过程

文章目录

  • 一、Linux 系统启动过程
    • 1. BIOS/UEFI自检和初始化
    • 2. 引导加载程序阶段
    • 3. 内核启动阶段
    • 4. 用户空间初始化
    • 5. 运行级别/目标设置
    • 总结
  • 二、Linux系统启动过程中的一些常见错误
  • 三、如何解决Linux系统启动中的常见错误
    • 1. **无法启动操作系统**
    • 2. **硬件问题**
    • 3. **内核启动错误**
    • 4. **初始化进程失败**
    • 5. **配置文件错误**
    • 6. **使用恢复模式**
    • 7. **备份和恢复**
  • 四、相关链接

一、Linux 系统启动过程

Linux系统的启动过程是一个复杂且有序的流程,涉及多个组件和阶段的交互。下面是对Linux系统启动过程的详细介绍,并附上一些相关的案例代码。

1. BIOS/UEFI自检和初始化

  • 当计算机开机时,BIOS(基本输入输出系统)或UEFI(统一可扩展固件接口)会首先进行自检,确保硬件设备正常。
  • 然后,BIOS/UEFI会从预设的启动设备(如硬盘)中读取引导记录(如GRUB)。

2. 引导加载程序阶段

引导加载程序(如GRUB)负责加载操作系统的内核镜像到内存中,并设置相应的启动参数。

案例代码:GRUB配置文件片段

timeout 5
default 0
title Linuxroot (hd0,0)kernel /boot/vmlinuz-4.18.0-25-generic root=/dev/sda1initrd /boot/initrd.img-4.18.0-25-generic

在这个配置文件中:

  • timeout 5 表示等待用户选择操作系统的时间为5秒。
  • default 0 表示默认启动的操作系统标题是列表中的第一个。
  • title Linux 定义了一个操作系统标题。
  • root (hd0,0) 指定了根文件系统的位置。
  • kernelinitrd 行指定了内核镜像和初始RAM磁盘的位置。

3. 内核启动阶段

一旦引导加载程序将Linux内核镜像加载到内存中,内核开始执行。内核会进行一系列的初始化操作,包括设置硬件环境、启动内存管理、初始化设备驱动等。

4. 用户空间初始化

内核启动完成后,会挂载根文件系统,并启动init进程(或其替代品,如systemd)。init进程会进一步初始化用户空间环境,启动系统所需的基本服务和守护进程。

案例代码:systemd服务单元文件片段

systemd使用服务单元文件来定义服务的启动和管理。以下是一个简单的服务单元文件示例:

[Unit]
Description=My Custom Service
After=network.target[Service]
ExecStart=/usr/local/bin/my_service_script.sh
Restart=on-failure[Install]
WantedBy=multi-user.target

在这个服务单元文件中:

  • [Unit] 部分描述了服务的基本信息。
  • [Service] 部分定义了服务的启动命令和其他行为。
  • [Install] 部分指定了服务应该被哪个目标所依赖。

5. 运行级别/目标设置

在传统的init系统中,系统可以进入不同的运行级别。但在使用systemd的现代Linux发行版中,使用目标(target)来替代运行级别。

案例代码:切换运行目标

使用systemctl命令可以切换系统的运行目标:

sudo systemctl isolate graphical.target  # 进入图形界面模式
sudo systemctl isolate multi-user.target  # 进入多用户模式

总结

二、Linux系统启动过程中的一些常见错误

Linux系统的启动过程涉及多个阶段和组件,从BIOS/UEFI自检到用户空间初始化,每个阶段都有其特定的任务和作用。通过配置和引导加载程序、内核以及用户空间服务,可以定制和优化Linux系统的启动过程。上述案例代码只是启动过程中一小部分的示例,实际的配置和管理会涉及更多的细节和复杂性。

Linux系统启动过程中可能会遇到多种错误,这些错误可能源于硬件故障、配置错误、文件系统问题或是引导加载程序的问题。以下是一些常见的Linux系统启动错误:

  1. 无法启动操作系统:这通常是由于操作系统文件损坏引起的。这些文件可能已被误删、病毒破坏或磁盘故障所损坏,甚至可能是系统无法加载GRUB或LILO引导器。
  2. 安装的Linux系统无法启动:这可能是由于软件或系统配置错误导致的。这可以通过在单用户模式或紧急模式下启动系统来诊断和解决问题。
  3. 硬件问题:有时系统启动虽然没有错误报告出现,但可能出现了其他问题,如操作系统在加载时不能读取磁盘。这通常是由硬件故障引起的,如磁盘故障。
  4. 引导加载程序错误:如GRUB配置错误或损坏,可能导致系统无法正确加载内核或启动参数。
  5. 内核启动错误:内核在初始化过程中可能会遇到硬件识别问题、驱动程序错误或内存分配问题等,导致系统启动失败。
  6. 文件系统错误:如果根文件系统或关键的文件系统存在错误,可能会导致系统启动失败或无法正常运行。
  7. 初始化进程失败:init进程或systemd在启动用户空间环境时可能会遇到配置错误、服务依赖问题或权限问题等,导致系统启动失败。

解决这些错误通常需要一定的Linux系统知识和经验。你可以尝试使用启动时的紧急模式或单用户模式来诊断和修复问题。此外,查看系统日志(如/var/log/syslogjournalctl命令的输出)可以提供有关错误原因的线索。如果问题依然存在,你可能需要使用Linux的救援模式或安装媒体来恢复系统。

预防这些错误的一些措施包括:

  • 定期备份关键数据和配置文件。
  • 使用可靠的硬件,并定期检查和维护。
  • 谨慎地进行系统配置和软件安装,避免不必要的更改。
  • 及时更新系统和软件,以修复已知的安全漏洞和错误。

三、如何解决Linux系统启动中的常见错误

解决Linux系统启动中的常见错误需要针对具体的错误类型进行诊断和处理。以下是一些常见的错误及其解决方法:

1. 无法启动操作系统

  • 检查磁盘和文件系统:使用df命令检查磁盘空间使用情况,确保根目录和/boot分区有足够的空间。使用fsck命令检查和修复文件系统问题(确保在系统未挂载或只读模式下进行)。
  • 验证引导文件:确保/boot目录下的引导文件(如vmlinuzinitrd.img)存在且未损坏。
  • 修复GRUB:如果GRUB配置错误或损坏,可以使用grub-install命令重新安装GRUB,并使用update-grub命令重新生成配置文件。

2. 硬件问题

  • 检查硬件状态:检查所有硬件设备是否连接正确并正常工作。
  • 查看系统日志:检查/var/log/syslogjournalctl输出,寻找与硬件相关的错误。

3. 内核启动错误

  • 检查内核日志:在启动过程中查看内核日志,了解是否有硬件识别、驱动程序或内存问题。
  • 尝试不同内核版本:如果怀疑是内核问题,可以尝试安装或回滚到不同的内核版本。

4. 初始化进程失败

  • 检查系统服务:使用systemctl命令检查系统服务的状态,确保关键服务已正确启动。
  • 查看服务日志:检查服务日志文件,了解服务启动失败的原因。

5. 配置文件错误

  • 检查配置文件:仔细检查相关的配置文件,如GRUB配置文件、网络配置文件等,确保没有语法错误或配置错误。

6. 使用恢复模式

  • 进入恢复模式:如果上述方法都不能解决问题,可以尝试进入Linux的恢复模式进行进一步的诊断和修复。

7. 备份和恢复

  • 备份数据:在进行任何重大修复操作之前,确保备份所有重要数据。
  • 使用备份恢复:如果系统无法修复,可以考虑使用备份来恢复系统。

四、相关链接

  1. Linux官网
  2. Linux常用命令
  3. CentOS官网下载地址
  4. 「Linux系列」Linux简介及常见的Linux系统

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

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

相关文章

NCDA大赛中哪些HTML5设计作品展现出色?

与传统的HTML网页设计相比,HTML5网页设计主要是对网页内容的加强。HTML5已成为目前最流行的标记语言,拥有成熟的社区和广泛的浏览器支持,HTML5完整的功能和强大的扩展性使设计师和开发者能够点铁成金。HTML5可以一手控制更多可控元素&#xf…

js:nginx反向代理nuxt服务器端渲染请求接口获取用户真实ip

配置nginx并重启生效 location / {proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://127.0.0.1:3000/; }获取客户端ip async asyncData({ app, params, req, error, re…

C++/CLI学习笔记9(快速打通c++与c#相互调用的桥梁)

3:判断与循环 所有高级语言都提供了判断和循环语句,C++也不例外。C++提供了if语句和 switch语句来执行判断,提供了while,for和 do-while 语句来执行循环。除此之外,C++还提供了break语句立即退出循环,以及 continue 语句立即开始下一次循环迭代。 所有高级语言都提供了判…

【AI+应用】一步步搭建聊天机器人搭配多种国内外大模型以及api接口调用

如果你看过我之前写的一篇文章 【AI应用】怎么快速制作一个类chatGPT套壳网站, 你可能顺利地使用chatGPT、Gemini, 用得很happy。 突然有一天,你发现一些网站,除了chatGPT、Gemini ,还可以切换使用国内外其他的大模型…

使用vue3编写一个插件

创建插件文件:例如 myPlugin.js编写插件:插件应该导出一个对象,这个对象可以包含一个 install 方法。Vue 会调用这个 install 方法来安装插件。在这个方法中,你可以添加全局资源。 // myPlugin.js export default {install(app, o…

python】jupyter notebook导出pdf和pdf不显示中文问题

安装nbconvert 首先安装nbconvert才能将.ipynb文件转化为pdf、latex、html等。 conda install nbconvert安装Pandoc Pandoc官网下载地址: https://pandoc.org/installing.html 下载安装包github地址:https://github.com/jgm/pandoc/releases/tag/3.1.6.2 安装MiKTex 下载…

SpringBoot使用log4j2将日志记录到文件及自定义数据库

目录 一、环境说明 二、进行配置 1、pom.xml 2、log4j2.xml 3、CustomDataSourceProperties 4、ConfigReader 5、ConnectionFactory 连接工厂类,用于管理数据库连接 三、进行简单测试配置 1、LogUtils 2、LoginUserInfoHelper 3、LoginLogUtils 4、…

【Numpy】(1)创建数组

NumPy 是 Python 的一个开源数值计算扩展库,用于高性能的科学计算和数据分析。它提供了一个强大的N维数组对象ndarray,以及用于对这些数组进行操作的各种函数。 通过pip安装: pip install numpy创建数组 从列表创建 numpy.array可以通过多种方式创建,最直接的方式是使用…

Pulsar 社区周报 | No.2024.03.15 LTS 3.0.3 新版发布

“ 各位热爱 Pulsar 的小伙伴们,Pulsar 社区周报更新啦!这里将记录 Pulsar 社区每周的重要更新,周五发布。 ” 本期主题:LTS 3.0.3 发布 Apache Pulsar 新版发布: LTS(稳定性长期支持版)新版&am…

mysql统计数据库大小

ps:亲测可行,时间2024-03-15 15:18 mysql统计数据库大小 要统计MySQL数据库的大小,你可以使用以下SQL查询: SELECT table_schema AS "Database",ROUND(SUM(data_length index_length) / 1024 / 1024, 2) AS "Size (MB)"FROM info…

SpringMVC基础之工作流程

文章目录 SpringMVC 的工作流程1. 总图2. DispatcherServlet3. 必需的配置4. 加载配置文件的两个时机5. 定义控制器6. 创建 JSP 视图 SpringMVC 的工作流程 1. 总图 如上图,Spring MVC 程序的完整执行流程如下: 用户通过浏览器发送请求,请求…

Docker 系列2【docker安装mysql】【开启远程连接】

文章目录 前言开始步骤1.增加mysql挂载目录2.下载镜像2.启动容器具体步骤4.无法连接5.测试连接 总结 前言 本文开始,默认已经安装docker,如果你还没有完成这个步骤,请查看这一篇文章【docker安装与使用】 开始步骤 1.增加mysql挂载目录 m…

【Unity】进度条和血条的三种做法

前言 在使用Unity开发的时候,进度条和血条是必不可少的,本篇文章将简单介绍一下几种血条的制作方法。 1.使用Slider Slider组件由两部分组成:滑动区域和滑块。滑动区域用于显示滑动条的背景,而滑块则表示当前的数值位置。用户可…

HQL 55 题【持续更新】

前言 今天开始为期一个多月的 HQL 练习,共 55 道 HQL 题,大概每天两道,从初级函数到中级函数。这次的练习不再是基础的 join 那种通用 SQL 语法了,而是引入了更多 Hive 的函数(单行函数、窗口函数等)。 我…

双线性插值缩放算法原理以及matlab与verilog的实现(二)

系列文章目录 双线性插值缩放算法原理以及matlab与verilog的实现(一) 文章目录 系列文章目录前言一、前提回顾二、FPGA实现步骤2.1 找到源图像四个像素点求目标像素点2.2 FPGA实现步骤2.3 总体框架2.4 ROM缓存模块2.5 VGA模块2.6 双线性算法模块 三、下…

mysql实战开发之 mysql 删除一张表某个字段的sql语句

有一张表, 我需要删除这张表其中的某一个或者某几个字段, 相信大家在日常开发中应该会遇到这种情况, 然后刚好自己接触的项目安装的mysql关闭了允许远程连接的设置, 也就是说不允许使用类似于navicat 等可视化工具连接, 那么就没办法通过可视化工具直接去通过鼠标操作就可以 完…

Lua 学习

参照 注释 -- 这是单行注释--[[这是多行注释--]]if语句 if true thenprint(true) endif else语句 nil是false if nil thenprint("nil被当作true处理") elseprint("nil被当作false处理") end运算符 % 取余 ^ 乘幂 A10,A^2100 // 整除运算符&#xff0…

【 JS 】闭包

“在黑暗的时刻,不要忘记你内心的光芒,它将指引你找到前进的方向,迈向胜利的辉煌。” 定义 MDN 对闭包的定义为: 闭包是指那些能够访问自由变量的函数。 那什么是自由变量呢? 自由变量是指在函数中使用的,…

linux系统docker容器的容器卷

容器卷 容器卷宿主机和容器之间映射添加容器卷读写规则映射添加卷的继承和共享 容器卷 挂载容器卷加上--privileged参数避免权限原因报错 --privilegedturn //开启权限Docker挂载主机目录访问如果出现cannot open directory .: Permission denied 解决办法&#xf…

【MySQL 系列】MySQL 语句篇_DDL 语句

DDL( Data Definition Language,数据定义语言)用在定义或改变表的结构数据类型、表之间的链接和约束等初始化工作上。常用的语句关键字包括 CREATE、 DROP、 ALTER 等。 文章目录 1、MySQL 中的 DQL 语句2、MySQL 中库表的 DQL 语句详解2.1、…