当前位置: 首页 > news >正文

Linux内核移植:内核的启动过程分析、启动配置与rootfs必要文件

Linux内核移植:内核的启动过程、启动配置与rootfs必要文件

  • 一、启动过程
  • 二、启动配置
    • (一)SysV初始化
    • (二)systemd初始化
  • 三、rootfs中的启动配置文件
    • 1、inittab
    • 2、/etc/init.d/rcS 脚本
    • 3、fstab
    • 4、profile 文件
    • 5、其他文件

一、启动过程

 内核启动通常包括4个阶段:

  1. iROM代码启动(BIOS启动)。开发板上电后,先执行内部iROM中的固化代码,类似于BIOS,执行通电自检和初始化过程,包括初始化CPU、存储器、时钟、总线等一些必要的硬件资源。
  2. 启动引导加载程序BootLoader。根据启动引脚的电平,读取相应的存储介质上的Uboot到RAM。接着,启动Uboot。U-Boot再根据用户传的参数加载内核、设备树、根文件系统。
  3. 装载内核。Linux内核镜像文件uImage被载入内存后,首先将自身解压,然后进行系统的一系列初始化工作,包括初始化存储器、中断表、必要的设备驱动,设定分页机制、任务调度机制,接着根据bootargs环境变量载入根文件系统。
  4. 系统初始化。根文件系统加载成功后,根据bootargs尝试执行/init命令。如果是RAMDisk,就尝试执行/init命令,否则,就尝试执行/sbin/init、 /etc/init、 /bin/init、 /bin/sh。如果其中任意一个能成功执行,就进人下一阶段,否则,内核启动失败。

二、启动配置

Linux通常有3中系统初始化方式:SysV、systemd、UpStart。

(一)SysV初始化

init是系统的1号进程,可以是可执行脚本,或sysvinit,或者busybox的二进制程序。ramdisk常用可执行程序脚本程序的init,二进制程序常依照/etc/inittab文件执行初始化任务。管理员可以定制/etc/inittab 配置文件来建立所需的系统运行环境。所以,/etc/inittab是rootfs中的重要文件。验证如下:

~$ ls /sbin/init -l
lrwxrwxrwx  1  1000  1000  14 Jan 25  2023 sbin/init -> ../bin/busybox

System V initialization是基于运行级别(Runlevel)来启动系统,用来设置不同环境下所运行的程序和服务。使用运行级别和对应的链接文件(位于etc/rcn.d 目录中,n为运行级别,分别链接到/etc/init.d中的init 脚本)来启动和关闭系统服务。假设当前inittab 中设置的默认运行级别是2,则init 进程会运行/etc/init.d/rc2命令,该命令会依据系统服务的依赖关系遍历执行/etc/rc2.d中的脚本或程序。/etc/rc2.d目录中的文件实际都是指向/etc/init.d/下对应的脚本或程序的软链接。
init 进程根据/etc/inittab中的配置初始化系统,设置系统运行级别及进入各运行级别对应的要执行的命令。inittab 提供了0~6的运行级别选项,runlevels是运行级别列表(如下)。其中,1级(单用户模式)和5级(多用户标准模式)比较常用。系统工作不正常时使用单用户模式维护,工作正常时使用多用户标准模式。在资源受限时(如没有网络环境或没有图形终端)可选择2级。以S开头的表示启动,以K开头的表示停止,并且S或K后面的两位数数字代表了服务的启动顺序,具体由服务依赖关系决定

# Runlevel 0:Halt.
# Runlevel 1:Single-user mode without networking,only for root.
# Runlevel 2:Multi-user mode without networking and daemons.
# Runlevel 3:Multi-user mode with networking.
# Runlevel 4:Not used or user-defined.
# Runlevel 5:Runlevel3+X-window,full functionally.
# Runlevel 6:Reboot.

(二)systemd初始化

新版本的Ubuntu使用systemd来初始化系统,验证如下:

~$ ls /sbin/init -l
lrwxrwxrwx I root root 20 330 00:40 /sbin/init -> /lib/systemd/systemd

systemd最主要的功能包括系统的主机名称、网络设置定、语言处理、文件系统格式及其他系统服务和应用服务的启动等。所有的这些任务都会通过systemd的默认启动目标(/etc/systemd/system/default.target)来配置。
systemd依次执行相应的各项任务来完成系统的最终启动。例如,systemd 首先执行initrd.target所有单元,包括挂载/etc/fstab,最后执行 graphical所需的服务以启动图形界面来让用户以图形界面登录。如果系统的defaulttarget 指向multi-user.target,那么此步骤就不会执行。

三、rootfs中的启动配置文件

1、inittab

基本的ininttab内容如下:

#this is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh
# stuff to do when restarting the init process
::restart:/sbin/init
# stuff to do before rebooting
::ctrlaltdel:/sbin/reboot

inittab 文件中的每一项按下面的格式设置:

id: runlevels: action: process

每一项有四个字段,字段之间用冒号隔开。每个字段的含义如下。
(1)起d由1~4个字符组成,作为inittab项的唯一标识。
(2)runlevedls 是运行级别列表。
(3)action指明执行什么动作
(4)process字段包含init执行的进程。
与系统启动相关的文件和目录如下:

|--/etc/
|    |-- inittab	(init脚本)
|    |-- init.d/
|        |-- rc	(启动脚本)
|        |-- rcS	(启动脚本)
|        |-- rc.local(附加启动脚本)
|        |-- ....	(其他系统服务脚本)
|    |--rcS.d/		(S级服务管理目录)
|        |-- ....	(init.d服务脚本链接)
|    |-- rc0.d/		(0级服务管理目录)
|        |-- ....	(init.d服务脚本链接)

2、/etc/init.d/rcS 脚本

   #!/bin/sh## rcS           Call all S??* scripts in /etc/rcS.d in#               numerical/alphabetical order.## Version:      @(#)/etc/init.d/rcS  2.76  19-Apr-1999  miquels@cistron.nl#PATH=/sbin:/bin:/usr/sbin:/usr/binrunlevel=Sprevlevel=Numask 022export PATH runlevel prevlevel#    Make sure proc is mounted#[ -d "/proc/1" ] || mount /proc##       Source defaults.# 设置环境变量#./etc/default/rcS##       Trap CTRL-C &c only in this shell so we can interrupt subprocesses.#trap ":" INT QUIT TSTP##   Call all parts in order.# # exec /etc/init.d/rc S/bin/mount -a

不要忘记为 rcS 添加可执行权限:

$ chmod +x init.d/rcS

3、fstab

/etc/init.d/rcS中的mount -a。意思是将/etc/fstab的所有内容重新加载。
/etc/fstab 文件负责配置Linux开机时自动挂载的分区。

  • fstab中的文件挂载操作如下:
      <file system> <mount point> <type> <options> <dump> <pass>
       <file system>:描述要挂载的特殊的块设备或远程文件系统,如/dev/cdrom /dev/sdb等,远程文件系统使用<host>:<dir>.
       <mount point>:描述文件系统的挂载点;如果是一个交换分区(swap partitions),这个域应写为‘none’.
       <type>:描述文件系统的类型,Linux支持许多文件系统类型,如adfs, affs, autofs, coda, coherent, cramfs,devpts, efs, ext2, ext3, hfs, hpfs, iso9660, jfs, minix, msdos, ncpfs, nfs,ntfs, proc, qnx4, reiserfs, romfs, smbfs, sysv, tmpfs, udf, ufs, umsdos,vfat, xenix, xfs,等。
       <options>:描述关于这个文件系统的挂载选项,基本的选项如下:
         default:使用默认选项,rw, suid, dev, exec, auto, nouser, and async
         noauto:当启动时给出“mount -a”命令时并不挂载。
         user:允许用户挂载
         owner:允许设备自己挂载
         comment:供fstab维护程序使用
         nofail:如果这个设备不存在,不报告错误信息
       <dump>:当其值设置为1时将允许dump备份程序备份;设置为0时忽略备份操作;如果文件系统需不需要被dump,则设置为0即可
       <pass>:该字段由fsck程序用于确定在重新启动时文件系统检查完成的顺序,启动用的文件系统需要制定为1,其他文件系统需要指定为2,如果没有此域或设置为0表示不检查。其值是一个顺序。当其值为0时,永远不检查;而 / 根目录分区永远都为1。其它分区从2开始,数字越小越先检查,如果两个分区的数字相同,则同时检查

参考博文: 根文件系统(linuxrc、inittab、fstab)
例1:

#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0

例2:

none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
nonc /dev/shm tmpfs defaults 0 0
/dev/hda4 swap swap dcfaults o 0
/dev/edrom /mntcdrom iso9660 noauto,owner,kudzu,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
/dev/hdal /mnt/c vfat exec,dev,suid,rw,umask=0, iocharset=gb2312,codepage=936 0 0

例3:fstab中添加了mount nfs的配置:

192.168.1.7:/CBT-SuperIOT/ /mnt/nfs/ nfs nolock 0 0

4、profile 文件

#!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH

5、其他文件

service,inetd.conf,passwd文件,可以配置telnet服务器的配置和开启:
确保fstab 文件中存在none /dev/pts devpts mode=0622 0 0这一行
确保services文件中存在 telnet 23/tcp这一行
确保 inetd.conf中存在telnet stream tcp nowait root /sbin/telnetd telnetd
确保passwd 文件中存在 root::0:0:root:/:/bin/sh ,表示没有密码的root 帐号

相关文章:

Linux内核移植:内核的启动过程分析、启动配置与rootfs必要文件

Linux内核移植&#xff1a;内核的启动过程、启动配置与rootfs必要文件一、启动过程二、启动配置&#xff08;一&#xff09;SysV初始化&#xff08;二&#xff09;systemd初始化三、rootfs中的启动配置文件1、inittab2、/etc/init.d/rcS 脚本3、fstab4、profile 文件5、其他文件…...

【代码随想录训练营】【Day14】第六章|二叉树|理论基础|递归遍历|迭代遍历|统一迭代

理论基础 二叉树的定义形式有&#xff1a;节点指针和数组 在数组中&#xff0c;父节点的下标为i&#xff0c;那么其左孩子的下标即i*21&#xff0c;右孩子的下标即为i*22 二叉树的常见遍历形式有&#xff1a;前序遍历、后序遍历、中序遍历和层序遍历 前序遍历&#xff1a;二…...

AXI-Stream 学习笔记

参考 https://wuzhikai.blog.csdn.net/article/details/121326701 https://zhuanlan.zhihu.com/p/152283168 AXI4 介绍 AXI4 是ARM公司提出的一种片内总线&#xff0c;描述了主从设备之间的数据传输方式。主要有AXI4_LITE、AXI4_FULL、AXI4_STREAM三种。 AXI4_LITE&#xff1…...

【Linux】程序进程地址空间

文章目录程序地址空间进程地址空间程序地址空间 在Linux下,这种地址叫做 虚拟地址, 我们在用C/C语言所看到的地址,全部都是虚拟地址&#xff01;物理地址,用户一概看不到,由OS统一管理 问:C/C程序地址空间是内存吗? -> 根本就不是内存&#xff01; 是进程虚拟地址空间 堆栈…...

电压放大器在液滴微流控芯片的功能研究中的应用

实验名称&#xff1a;电压放大器在液滴微流控芯片的功能研究中的应用研究方向&#xff1a;微流控生物芯片测试目的&#xff1a;液滴微流控技术能够在微通道内实现液滴生成&#xff0c;精准控制生成液滴的尺寸以及生成频率。结合芯片结构设计和外部控制条件&#xff0c;可以对液…...

Linux操作系统学习(进程地址空间)

文章目录进程地址空间奇怪的现象什么是进程地址空间&#xff1f;&#xff1f;&#xff1f;虚拟地址是如何与物理内存联系的&#xff1f;页表是什么呢&#xff1f;为什么要有页表和地址空间&#xff0c;让进程直接访问内存不行吗&#xff1f;现象解释进程地址空间 在我们学习其…...

【排序】快速排序实现

目录 一、快速排序是什么&#xff1f; 二、左右指针法 1.实现原理 2.代码如下&#xff1a; 三、挖坑法 1.实现原理 2.代码如下&#xff1a; 四、前后指针法 1.实现原理 2.代码如下&#xff1a; 五、三数取中 1.实现思想 2.代码如下&#xff1a; 3.使用方法 总结…...

YOLOv5/v7 Flask Web 车牌识别 | YOLOv7 + EasyOCR 实现车牌识别

YOLOv7 Flask Web 车牌识别图片效果展示 本篇博文只包含源码以及使用方式,目前不同提供详细开发教程。 YOLOv7 Flask Web 车牌识别视频效果展示 YOLOv7 + EasyOCR 实现车牌识别 什么是Flask? 简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更…...

【Opencv实战】几十年前的Vlog火了:黑白老照片如何上色?这黑科技操作一定要知道,复原度超高,竟美的出奇~(图像修复神级代码)

导语 哈喽大家好呀&#xff01;我是每天疯狂赶代码的木木子吖&#xff5e;情人节快乐呀&#xff01; 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 我们都知道&#xff0c;有很多经典的老照片…...

React源码分析(一)Fiber

前言 本次React源码参考版本为17.0.3。 React架构前世今生 查阅文档了解到&#xff0c; React16.x是个分水岭。 React15及之前 在16之前&#xff0c;React架构大致可以分为两层&#xff1a; Reconciler&#xff1a; 主要职责是对比查找更新前后的变化的组件&#xff1b;R…...

小樽 C++指针—— (壹) 指针变量

(壹) 指针变量 一、指针的概念与定义 二、给指针变量p赋值 三、指针变量的的、-运算 四、无类型指针 五、多重指针 C (壹) 指针变量 小明想把从李华家借来的书——《CCF中学生计算机程序设计》还给李华&#xff0c;但李华不在家&#xff0c;于是把书放到书架第3层的最右边…...

java 代码块 万字详解

概述 : 特点 : 格式 : 情景 : 细节 : 演示 : 英文 : //v&#xff0c;新版编辑器无手动添加目录的功能&#xff0c;PC端阅读建议通过侧边栏进行目录跳转&#xff1b;移动端建议用PC端阅读。&#x1f602;一、概述 :代码块&#xff0c;也称为初始化块&#xff0c;属于类中的成员&…...

杂项-图片隐写

图片隐写的常见隐写方法&#xff1a; 三基色&#xff1a;RGB&#xff08;Red Green Blue&#xff09; 图片文件隐写 1.Firework 使用winhex打开文件时会看到文件头部中包含firework的标识&#xff0c;通过firework可以找到隐藏图片。 使用场景&#xff1a;查看隐写的图片文件…...

【高性价比】初学者入门吉他值得推荐购买的民谣单板吉他品牌—VEAZEN费森吉他

“在未知的世界里&#xff0c;我们是一群不疲不倦的行者&#xff0c;执念于真善美&#xff0c;热衷于事物的极致。我们抽丝剥茧&#xff0c;不断地打败自己&#xff0c;超越自己&#xff0c;我们无所畏惧终将成为巨人。”这是VEAZEN吉他官网首页上很明显的一段话&#xff0c;也…...

2023年浙江交安安全员考试题库及答案

百分百题库提供交安安全员考试试题、交安安全员考试真题、交安安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 50.根据《建设工程安全生产管理条例》第65条规定&#xff0c;施工单位有下列&#xff08;&#xff09;行…...

【新】华为OD机试 - 跳格子(Python)

跳格子 题目 地上共有 N 个格子,你需要跳完地上所有的格子, 但是格子间是有强依赖关系的,跳完前一个格子后, 后续的格子才会被开启,格子间的依赖关系由多组 steps 数组给出, steps[0] 表示前一个格子, steps[1] 表示 steps[0] 可以开启的格子: 比如 [0,1] 表示从跳完第…...

乡村能做社区团购吗?怎么做?我走访调查后发现机会很大

乡村能做社区团购吗&#xff1f;怎么做&#xff1f;我走访调查后发现机会很大#深度触网 #社区团购 #乡村振兴##乡村旅游##县域经济##市场经济##农文旅产业振兴研究院#乡村旅游能带动农产品加工业、服务业、商贸业等相关联产业的发展 乡村能做社区团购吗&#xff1f;怎么做&…...

态路小课堂丨下一代数据中心100G接口第二篇——SFP-DD封装

100G光模块根据封装模式可分为QSFP28、CXP、CFP、CFP2、FCP4、DSFP和SFP-DD等。态路小课堂之前已经大量介绍了相关内容&#xff08;。 态路小课堂丨下一代数据中心100G接口——DSFP态路小课堂丨100G解决方案-425G NRZ光模块态路小课堂丨什么是100G QSFP28单波光模块&#xff1f…...

状态栏和导航栏高度获取

/*** 获取导航栏高度*/public static int getNavigationBarHeight(Context context){int navigationBarHeight 0;int resourceId context.getResources().getIdentifier("navigation_bar_height", "dimen", "android")if (resourceId > 0) {…...

插曲:第一桶金 1w 的来由

因为前天跟同事聊天&#xff0c;发现有个比较严重的认知&#xff0c;就是关于赚钱思维。 同事反馈说工作十来年&#xff0c;却没有接过私活&#xff0c;这里话分两头&#xff0c;有可能私 活钱少&#xff0c;但他给我的理由是&#xff1a;私活太麻烦&#xff0c;有时候不敢接&a…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...