initrdinit进程

news/2024/11/20 15:16:04/文章来源:https://www.cnblogs.com/linhaostudy/p/18431660

initrd的全名是 init ramdisk,是一个启动时存在于内存的文件系统。

kernal 到 initrd的流程

在GRUB加载kernel时,kernel会先在内存中制造一个rootfs当做临时的空间供系统使用,接下来,kernel便会将initrd当做是一个系统,将其mount到rootfs上启动。

引入initrd的目的是为了把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中,这样就在启动过程中可以从initrd所mount的根文件系统中装载需要的模块。这样的一个好处就是在保持kernel不变的情况下,通过修改initrd中的内容就可以灵活的支持不同的硬件。在启动完成的最后阶段,根文件系统可以重新mount到其他设备上。

initrd文件结构

initrd文件在/boot目录中很容易找到,可以通过以下命令将期解压

## 将文件移至对应目录cp initrd.img-xxxx-generic  ~/initrd/initrd.img.gz## 老版本gunzip initrd.img.gz
cpio -idmv < ../initrd.img## 新版本lsinitramfs /boot/initrd.img-xxx-generic (可以通过些命令查询其文件)
binwalk -y gzip initrd.img.gz (定位压缩文件的开始偏移量)## 6938624 即是通过binwalk定位出来的值
dd if=initrd.img.gz   bs=6938624  skip=1 | zcat | cpio -id --no-absolute-filenames -v## 使用ls查看目录
bin  conf  etc  init  lib  lib64  run  sbin  scripts  usr  var

经解压发现initrd就是最简单的一个文件系统,唯一不同的是存在一个init脚本。

export PATH=/sbin:/usr/sbin:/bin:/usr/bin
[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir -m 0700 /root
[ -d /sys ] || mkdir /sys
[ -d /proc ] || mkdir /proc
[ -d /tmp ] || mkdir /tmp
mkdir -p /var/lock
mount -t sysfs -o nodev,noexec,nosuid sysfs /sys
mount -t proc -o nodev,noexec,nosuid proc /proc

在init文件中要执行的第一件事情,就是创建几个重要的目录。其中/sys,/proc作为kernel使用的主要目录,init必须将其挂载。

  • /proc 这目录其实是加载kernel后,在内存里面建立的一个虚拟目录,主要提供系统运行的实时信息

  • /proc/PID 这目录表示,系统一进程运行时信息

  • /proc/paritions 表示系统检测到的硬盘分区情况,其使用major和mintor 两字段来标识唯一

  • /sys/block

  • /sys/bus

在收集完设备信息后,就要开始玩设备文件了

mount -t devtmpfs -o nosuid,mode=0755 udev /dev
mkdir /dev/pts
mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true
  • /dev  是以tmpfs的文件系统存放的devfs系统架构的文件
  • tmpfs 内存中的文件系统
  • devfs 将所有的设备信息以文件的方式存储
  • udev 补充devfs的问题,udev 会自动从/sys目录找到所需要的硬盘信息装置。
  • /dev/pts 主机虚拟终端,当ssh连接进来后,就出来一文件

在initrd建立好相关的文件系统配置后,就要开始转移到实体操作系统

  1. 建立默认使用的设备文件
  2. 加载moule
  3. 建立系统使用目录 并 /proc, /sys /dev 转移过去

initrd最后工作就是要通过init脚本文件,将所有一切交给存在硬盘中的实体操作系统。

exec run-init ${drop_caps} ${rootmnt} ${init} "$@" ${recovery:+--startup-event=recovery} <${rootmnt}/dev/console >${rootmnt}/dev/console 2>&1

重新调用/sbin/init来开始后续的正常启动流程.当然也可以 内核启动参数 init={所要执行的程序}来替换

init启动流程

说白init进程就是内核自动启动第一个用户级程序,所以其进程编号始终为1。

1. 以initdefault值判断系统以那level运行

0 - 停机(千万不能把initdefault 设置为0 )
       1 - 单用户模式
       2 - 多用户,没有 NFS
       3 - 完全多用户模式(标准的运行级)

4 - 没有用到
       5 - X11 (xwindow)
       6 - 重新启动 (千万不要把initdefault 设置为6 )

2. 执行/etc/rc.d/rc.sysinit

其过程相当很杂,大部份和系统环境相关

3. 执行/etc/rc.d/rcX.d

X 表示其运行级别,我们以3为例

  1. 里面有好多文件都以"S" 或 “K” 开头,"S" 为可会执行的脚本,“K”是死的。
  2. “SK”后面跟着数字,即脚本执行的顺序
  3. 通过改名字就可以调整服务
  4. 其中S99local连接到/etc/rc.d/rc.local专门给用户使用

4. 通过登录程序进入shell

initab的最后阶段扫运行minttyt程序,让用户输入密码登录,进行shell

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

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

相关文章

如何部署北斗定位应用,基于国产自主架构LS2K1000LA-i处理器平台

北斗卫星导航系统(以下简称北斗系统)是着眼于国内经济社会发展需要,自主建设、独立运行的卫星导航系统。经过多年发展,北斗系统已成为面向全球用户提供全天候、全天时、高精度定位、导航与授时服务的重要新型基础设施。图 1 北斗定位系统的应用优势 强可控:北斗系统是国内…

ChatGPT 向更多用户推出高级语音模式:支持 50 种语言;字节发布两款新视频生成大模型丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点…

题解:CF573D Bear and Cavalry

CF因为这是远古题目,所以根据现在的评测机速度,用 \(O(nq)\) 的做法也是可以过的。 也就是说,我们可以每次操作直接修改对应位置上的数字,然后设计一种 \(O(n)\) 的算法求解答案。 这道题类似资源分配型动态规划,所以我们可以设 \(dp_i\) 表示分配前 \(i\) 个人的答案。 直…

题解:AT_abc204_e [ABC204E] Rush Hour 2

LG变形的 dijkstra。 先思考什么情况下需要等待以及等待多长时间最优。我们把题目上的计算方法按照当前的时间 \(t\) 和通过所需的时间 \(f(t)\) 列个函数关系: \[f(t)=t+c+\lfloor \frac{d}{t+1}\rfloor \]然后用 Desmos 画个图可以得到图像(其实就是对勾函数):因为 \(c,d…

Rust字符串类型全解析

字符串是每种编程语言都绕不开的类型, 不过,在Rust中,你会看到远比其他语言更加丰富多样的字符串类型。 如下图:为什么Rust中需要这么多种表示字符串的类型呢? 初学Rust时,可能无法理解为什么要这样设计?为什么要给使用字符串带来这么多不必要的复杂性? 其实,Rust中对…

AI自动生成代码注释

在vscode 中安装 TONGYI Lingma

通过 Tampermonkey 实现学习通全自动刷课

本文介绍了如何使用 Tampermonkey 这一流行的用户脚本管理器,通过其脚本库实现学习通的全自动刷课。文章详细讲解了 Tampermonkey 的安装步骤、OCS 脚本的配置方法,以及题库的使用流程,帮助读者高效完成学习任务。在学习过程中,自动化工具能大大提升学习效率。Tampermonkey…

KBU1010-ASEMI单向整流桥KBU1010

KBU1010-ASEMI单向整流桥KBU1010编辑:ll KBU1010-ASEMI单向整流桥KBU1010 型号:KBU1010 品牌:ASEMI 封装:KBU-4 批号:2024+ 类型:单向整流桥 电流(ID):10A 电压(VF):1000V 安装方式:直插式封装 特性:大功率、整流扁桥 产品引线数量:4 产品内部芯片个数:4 产品内部…

Kubernetes中Ingress的原理和配置

Ingress的概念和作用 Ingress是Kubernetes集群中的一个对象,用于将外部流量路由到集群内部的服务。它充当了进入Kubernetes集群的API网关,负责接收外部请求,并将其转发到正确的目标服务上。 Ingress通常通过HTTP和HTTPS提供对服务的访问,并支持基于主机名、路径以及其他HTT…

《如 何 速 通 一 套 题》4.0

A sprial 找规律。直接做。 #include <bits/stdc++.h> #define int long long using namespace std;int t, n;int sqrtll(int n) {int l = 1, r = 1000000, ans = 0;for(; l <= r; ) {int mid = (l + r) >> 1;if(mid * mid >= n) {ans = mid, r = mid - 1;}e…

自定义表格样式

HTML:<div class="table-container"><table style="width: 90%; margin-left: 5%"><tr class="table-title"><th style="width: 33%">科室名称</th><th style="width: 33%">当日登录次…