Linux系统启动流程及系统裁剪

2023-05-16

一、内核管理简要理论

1、内核的功能
(1)进程管理
(2)内存管理(内核管理代码中代码量最大的部分)
(3)I/O管理:中断及中断处理
(4)文件系统:ext3,ext4,reiserfs,xfs等。。
(5)驱动程序
(6)安全相关:SELinux

2、内核设计流派
(1)单内核:单一体系结构(Linux)
<1>特点:
①模块化设计:核心+外围功能性模块组成
②内核支持动态装卸载模块

(2)微内核:内核子系统,更容易用于多线程编程(Windows、Solaris)

二、Linux系统的初始化流程

1、系统启动流程总结
(1)
POST(Power on self Testing)
–>BIOS(boot sequence)
–>GRUB(bootloader),分两阶段{stage1:在MBR中。stage2:在grub目录中}
–>Kernel(找到initrd,被打包的模块)
–>SHELL

2、POST(Power on self testing)的作用
(1)打开电源后,检测硬件设备是否正常工作。

3、BIOS的作用
(1)若电脑有多个存储设备,BIOS就会按照中的Boot Sequence(启动队列)来选择MBR所在的存储设备。

4、GRUB(Grand Unified Bootloader)
(1)1st stage(第一阶段):位于MBR中,为引导2nd stage。
(2)1.5 stage:位于boot基本磁盘分区中,为识别内核文件所在的文件系统提供文件识别扩展。
(3)位于boot基本磁盘分区中,GRUB的引导程序。

5、启动kernel
(1)启动vmlinuz,vmlinuz是一段压缩存放的代码,分为两端,一个解压代码,一个为内核代码。
(2)vmlinuz一般在boot目录下。
(3)vmlinuz完成对内核的初始化

(4)内核初始化时候需要启动用户进程:/sbin/ini,需要/lib/modules中的内核模块,但内核模块在根分区上,vmlinuz识别/分区又需要内核模块。(鸡和蛋问题)
<1>解决方案:安装操作系统的时候,安装程序能识别内核模块所在磁盘,并将内核模块打包为initrd供vmlinuz识别使用。

6、用户空间进程/sbin/init启动以后的工作
(1)执行/etc/rc.d/rc.ssysinit脚本完成系统初始化工作

三、系统裁剪流程详解

1、系统裁剪要求:有GRUB引导系统,并且使用init脚本实现网卡驱动的装载,以及IP地址的配置,添加tserver服务,并在系统启动时启动此服务并显示。

2、操作环境的目标
(1)在vmware12中操作,系统为Centos6.5
(2)基于宿主机(Host)制作一个简单可启动的Linux

3、流程概括
(1)为虚拟机添加一块新硬盘,并为其分区,安装GRUB
(2)复制内核文件(vmllinuz)和initrd文件至新硬盘中。
(3)移植bash,网络相关命令ifconfig、ip、ping命令,文件列表命令ls,服务管理命令chkconfig,模块装载卸载命令insmod、rmmod,挂载卸载命令mount、umount,文件查看命令cat至目标主机(Target)的/文件系统中。
(4)为grub提供配置文件。
(5)为目标主机配置/sbin/init文件启动网络服务和其他服务。
(6)将目标主机的硬盘装载其他电脑上。

4、添加新硬盘并分区、格式化和挂载
(1)在虚拟机上添加一块20G的硬盘,名为TinyLinux。
这里写图片描述

(2)为硬盘分区{一个为500M(boot分区),一个为1G(/分区)}

 # fidk /dev/sdb

这里写图片描述

(3)检查分区是否成功

# partprobe /dev/sdb
# cat /proc/partitions

这里写图片描述

(4)分区格式化

# mke2fs -t ext4 /dev/sdb1
# mke2fs -t ext4 /dev/sdb2

这里写图片描述

(5)在/mnt目录下创建boot目录以及sysroot目录,并将上面两个文件系统进行挂载。

# mkdir /mnt/{boot,sysroot}
# mount /dev/sdb1 /mnt/boot
# mount /dev/sdb2 /mnt/sysroot
# mount

这里写图片描述

5、安装GRUB
(1)安装命令grub格式:
# grub-install –root-directory=(boot所在目录) /dev/sd[a-z]
(2)例:

# grub-install --root-directory=/mnt /dev/sdb

这里写图片描述

6、复制内核文件和initrd文件至目标主机磁盘
(1)内核文件为宿主机中的/boot/vmlinuz-VERSION
(2)initrd文件为宿主机的/boot/initramfs-VERSION.img
(3)复制示例:

# cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/boot/vmlinuz
# cp /boot/initramfs-2.6.32-431.el6.x86_64.img /mnt/boot/initramfs.img
# ls /mnt/boot

这里写图片描述

7、创建目标主机的根文件系统
(1)根文件系统一般包含的目录:
etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,root
(2)示例:

# mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,root}

这里写图片描述

8、移植bash等命令至目标主机根文件系统
(1)移植的时候需要把命令的可执行文件以及所依赖的库文件复制,命令才能被执行。
(2)可执行文件位于/bin目录下,库文件在/lib目录 或者/lib64目录下。
(3)用which COMMAND 命令可查看命令的执行文件在哪个位置
ldd `which COMMAND`命令可查看命令所依赖的库文件在哪个位置。

(4)用一个脚本实现将命令的可执行文件以及其所依赖的库文件复制到目标主机根文件系统中

#!/bin/bash
#
target=/mnt/sysroot

clearCmd(){
if which $cmd &> /dev/null;then
cmdPath=`which --skip-alias $cmd`
        else
             echo "No such command"
            return 5
        fi

}

 cmdCopy(){
         cmdDir=`dirname $1`
        [ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir}
        [ -f ${target}${1} ] && echo -e "\033[31mThe ${1} exist!\033[0m" && return 5
        [ -f ${target}${1} ] || cp $1 ${target}${cmdDir}
        echo -e "\033[32mCopy ${1} success.\033[0m"
}

libCopy(){
        for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`;do
                libDir=`dirname $lib`
                [ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
                [ -f ${target}${lib} ] && echo -e "\033[31mThe ${lib} exist!\033[0m" && continue
                [ -f ${target}${lib} ] || cp $lib ${target}${libDir}
                echo -e "\033[32mCopy ${lib} success.\033[0m"
        done

}

while true;do
        read -p "Enter a command: " cmd
        if [ "$cmd" == "quit" ];then
                echo "quit"
                exit 0
        fi
        clearCmd $cmd
        [ $? -eq 5 ]&& continue

        cmdCopy $cmdPath
        libCopy $cmdPath
done

(5)复制示例:

# bash /root/scripts/cpcmd.sh

bash
ls
cat
insmod
rmmod
mount
umount
ifconfig
ip
ping
chkconfig

这里写图片描述
这里写图片描述
复制成功。

9、为提供配置文件
(1)示例:

# vim /mnt/boot/grub/grub.conf
内容为:
default=0
timeout=5
title Tiny Linux
        root (hd0,0)
        kernel /vmlinuz ro root=/dev/sda2  quiet selinux=0 init=/bin/bash
        initrd /initramfs.img

(2)字段解释:
<1>default =# :指定默认启动的内核或者OS(Operating System)
<2>timeout=# :等待用户选择要启动的内核或OS的时长,单位为秒。
<3>splashimage=/path/to/splashimage_file :指定使用的背景图片
<4>hiddenmenu:隐藏菜单
<5>tittle

    root (Device(磁盘设备),Part(磁盘分区) )
        ①Device表示方式:在grub中,统统以hd开头,并紧跟一个数字做各磁盘设备的标志,从0开始编号。
        ②Part表示方式:代表分区,从0开始编号

    kernel 
        ①指定内核文件及传递给内核的参数,常用参数:ro root=/path/to/device,
        表示把该设备文件所表示的设备当作内核去挂载时的根使用的真正根分区所在的设备。(只读挂载) 
        参数格式:ro root=/path/to/device quiet
        quiet为静默模式

    initrd
        ①文件通常为cpio归档,并使用gzip压缩;通常以.img作为文件后缀名(映像文件)

10、将目标主机的硬盘装载其他电脑上。

切记在装载前先把宿主机挂起,再装载在其他电脑上,以免数据被损坏。
(1)在vmware12中创建一个新的虚拟机,内核为64位即可,一下是我自己的配置:
这里写图片描述

(2)为该虚拟机提供硬盘,在Centos6.5目录下找到TinyLinux.vmdk文件即可
这里写图片描述
这里写图片描述

(3)启动该虚拟机,若有grub引导并出现如下界面,并且命令正确,证明TinyLinux小系统能成功运行。

这里写图片描述

这里写图片描述

11、复制网卡模块至目标主机的
(1)网卡模块所在路径:
/lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
(2)创建/mnt/sysroot/lib/modules目录

# mkdir /mnt/sysroot/lib/modules

(3)复制网卡模块至/mnt/sysroot/lib/modules目录下

# cp /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/modules/

这里写图片描述

12、为目标主机配置/sbin/init文件启动网络服务和其他服务
(1)将上面步骤中开启的新的虚拟机关机,重新打开挂起的Centos6.5
(2)编辑/mnt/sysroot/sbin/init文件

# vim /mnt/sysroot/sbin/init

编辑内容:
#!/bin/bash
#
echo -e "\tWelcome to \033[34mKingOlie Tiny \033[0mLinux"
mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
insmod /lib/modules/e1000.ko
[ $? -eq 0 ] && echo -e "Loaded e1000 module \033[60G[ \033[32mOK\033[0m ]"
ifconfig lo 127.0.0.0/8
ifconfig eth0 172.17.45.243/24
mount -n -o remount,rw /dev/sda2 /
/bin/bash
# chmod  +x /mnt/sysroot/sbin/init
谨记必须给init脚本加上执行权限,否则系统启动的时候并不会执行init,会出现kernel panic错误。
# sync
使用sync将内存写入的数据同步到磁盘中去。可以使用多次,以确保文件数据已经被同步到磁盘中。

(3)编辑/mnt/boot/grub/grub.conf文件,将init指定为sbin目录下的init

(4)如果目标主机启动时候显示绿色OK字样,证明网卡模块已经被装载。
这里写图片描述

(5)用ping命令检验网络模块能否正常工作

# ping 172.17.45.243
此时,ctrl+c按键并不能中断ping命令,因为该小系统并没有配置ctrl+c热键。
建议使用以下命令限定ping次数和时间检测:
# ping -w 5 -c 5 172.17.45.243

这里写图片描述

===================================================

以上是我的个人总结,如有错误,欢迎大家指出,谢谢大家。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux系统启动流程及系统裁剪 的相关文章

随机推荐

  • linux中如何查看进程启动时间,持续时长

    root 64 gasdb2 Transsoft ps eo pid lstart etime grep 5359 5359 Tue Sep 16 14 47 22 2014 00 43 其中5359为进程号 xff0c 方便做过滤用的 T
  • 错误: 程序包org.apache.log4j不存在问题处理

    将maven中依赖修改如下 xff1a lt dependency gt lt groupId gt log4j lt groupId gt lt artifactId gt log4j lt artifactId gt lt versio
  • 构建maven项目失败解决办法

    通过eclipse的maven插件新建maven项目时 xff0c 出现如下错误 Unable to create project from archetype org apache maven archetypes maven arche
  • 关于java中的非静态代码块和静态代码块

    非静态代码块如 xff1a System out println 34 2 34 以上代码块就是非静态的代码块 xff0c 请注意这里的方法名 作用域 返回值 参数一概没有 xff0c 非静态代码块会在每次类被调用或者被实例化时就会被执行
  • jsoninclude.include.non_null 不起作用问题

    在开发过程中 xff0c 遇到在属性上加jsoninclude include non null注解 xff0c 有些属性起了作用 xff0c 有些却没有起作用 xff0c 下面使用代码简要说明一下 xff1a 64 Data public
  • 再次认识java的序列化

    首先是我们为什么要序列化 xff1f 我们可以来想想游戏的场景 xff0c 一个游戏有很多关卡 xff0c 并不是一次性能够打完的 如果我们打完一关 xff0c 这时候需要退出游戏休息了 当我们再次进入游戏之后发现这个游戏竟然需要重新打起
  • 控制actionbar中的向上键

    android中会给配置了 android parentActivityName 的activity默认加入一个向上返回键 xff0c 如下 xff1a 当点击向上返回后 xff0c 默认的行为是finish自身 xff0c startac
  • Android Studio快捷键

    Alt 43 回车 导入包 自动修正 Ctrl 43 N 查找类 Ctrl 43 Shift 43 N 查找文件 Ctrl 43 Alt 43 L 格式化代码 Ctrl 43 Alt 43 O 优化导入的类和包 Alt 43 Insert
  • Ubuntu 16.04 出现E: Problem executing scripts E: Sub-process returned an error code处理办法

    E Problem executing scripts APT Update Post Invoke Success 39 if usr bin test w var cache app info a e usr bin appstream
  • android studio “leaked window“ 错误

    昨天玩我做的app 发现app运行没问题 xff0c 但log里面出现下面的错误 xff1a Activity com example thirdversionclock MainActivity welcome has leaked wi
  • Archlinux 安装桌面环境 dwm + polybar

    Archlinux 安装桌面环境 dwm 43 polybar 关于git一 安装一些必要软件1 壁纸 状态栏等软件2 安装dwm和st 三 安装Polybar四 Fish Shell五 登录管理器六 一些个人使用的工具 2023 1 31
  • Arch Linux 安装和配置(陆续更新)

    Arch Linux 安装和配置 陆续更新 南国一年一度的回南天到来 xff0c 周末百无聊赖 xff0c 研究一下Arch Linux xff0c 整理此文 xff0c 其他使用笔记陆续补充 一 在Vmware中安装Arch Linux
  • ASP.NET Core MemoryCache 缓存

    ASP NET Core 中的缓存内存 xff08 MemoryCache xff09 ASP NET Core 中的缓存内存 ASP NET Core 中的分布式缓存 xff08 SQL Server 和 Redis 分布式缓存 xff0
  • FFmpeg In Android - 多媒体文件解封装/解码/保存Yuv

    FFMPEG视音频编解码零基础学习方法 100行代码实现最简单的基于FFMPEG 43 SDL的视频播放器 本文例子的源码 demuxing decoding cpp 修改自源码自带的例子ffmpeg源码 doc example demux
  • 【Java篇】多线程详解

    Java 多线程基础详解 文章目录 Java 多线程基础详解线程的相关概念一 创建线程的几种方式1 继承Thread类2 实现Runnable接口3 实现Callable接口4 推荐使用Runnable接口 二 线程安全1 线程安全问题引入
  • NotePad++ XMLTools 插件离线安装

    在使用NotePad 43 43 时 xff0c 在某些情形下 xff0c 需要格式化Xml格式内容 xff0c 可以使用Xml Tools插件 xff0c 注意下载安装包时 xff0c 需下载与NotePad 43 43 像匹配版本的插件
  • 【Windows逆向】【Qt】日志信息打印

    目录 x1f6eb 导读需求开发环境 1 示例程序Demo2 编写功能 xff08 QtCreator版本 xff09 3 编写功能 xff08 VS版本 xff09 x1f6ec 文章小结 x1f4d6 参考资料 x1f6eb 导读 需求
  • Ubuntu 18.04 安装ROS melodic文件错误问题broken packages

    反复多次尝试安装ros melodic xff0c 一直报错 xff0c 有文件损坏或者安装依赖问题 直接进入安装阶段 xff0c 前面的请看其他详细帖子 sudo apt span class token operator span ge
  • 在虚拟机安装Archlinux

    最近花了挺长一段时间练习在虚拟机安装archlinux的 xff0c 在这里跟大家分享一下经验 xff0c 如有错误 xff0c 欢迎大家指出 xff0c 谢谢大家 准备工作 archlinux镜像 43 vmware workstatio
  • Linux系统启动流程及系统裁剪

    一 内核管理简要理论 1 内核的功能 xff08 1 xff09 进程管理 xff08 2 xff09 内存管理 xff08 内核管理代码中代码量最大的部分 xff09 xff08 3 xff09 I O管理 xff1a 中断及中断处理 x