当前位置: 首页 > 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 帐号

http://www.lryc.cn/news/6240.html

相关文章:

  • 【代码随想录训练营】【Day14】第六章|二叉树|理论基础|递归遍历|迭代遍历|统一迭代
  • AXI-Stream 学习笔记
  • 【Linux】程序进程地址空间
  • 电压放大器在液滴微流控芯片的功能研究中的应用
  • Linux操作系统学习(进程地址空间)
  • 【排序】快速排序实现
  • YOLOv5/v7 Flask Web 车牌识别 | YOLOv7 + EasyOCR 实现车牌识别
  • 【Opencv实战】几十年前的Vlog火了:黑白老照片如何上色?这黑科技操作一定要知道,复原度超高,竟美的出奇~(图像修复神级代码)
  • React源码分析(一)Fiber
  • 小樽 C++指针—— (壹) 指针变量
  • java 代码块 万字详解
  • 杂项-图片隐写
  • 【高性价比】初学者入门吉他值得推荐购买的民谣单板吉他品牌—VEAZEN费森吉他
  • 2023年浙江交安安全员考试题库及答案
  • 【新】华为OD机试 - 跳格子(Python)
  • 乡村能做社区团购吗?怎么做?我走访调查后发现机会很大
  • 态路小课堂丨下一代数据中心100G接口第二篇——SFP-DD封装
  • 状态栏和导航栏高度获取
  • 插曲:第一桶金 1w 的来由
  • 中国甲基异丁基甲醇行业头部企业市场占有率及排名调研报告
  • streamlit自定义组件教程和组件开发环境配置
  • Windows CMD常用命令
  • ChIP-seq 分析:数据比对(3)
  • 并非从0开始的c++之旅 day2
  • Linux进阶(Shell编程学习一)
  • sql 优化
  • 第7篇:Java的学习路径
  • 对抗生成网络GAN系列——Spectral Normalization原理详解及源码解析
  • Solon2 开发之插件,一、插件
  • 使用nvm管理node