Linux系统的启动流程以及做个小小的Linux

内核的作用
    进程管理:进程间切换
    内存管理:内存空间分割为内核空间和用户空间
    IO管理:对底层硬件的使用必须由内来实现,不能由用户空间进程来实现
    文件系统管理
    驱动程序管理
    安全管理:包括netfilter模块和selinux模块等

内核的设计模式
    单内核:模块都是集成在内核内部(Linux是单内核)
    微内核:模块都是独立的,随用随加载(Windows是微内核)
    Ps:1.linux是单内核,但是广泛采用了微内核的设计思想
           2.内核模块是和内核紧密相关的,一旦换了内核,所有的模块都不能再使用

单线程:只有一个执行流
   多线程:有多个执行流
   
提升程序的执行速度
    1、必须寻多线程开发模式
    2、运行的主机必须有多个或者多核CPU

启动流程
1、POST(Power On and Self Test):加电自检
    检查硬件是否工作正常
    将CMOS中的BIOS程序加载到CPU中,依此来检测硬件工作,然后根据设定的启动次序去指定的设备上找 系统内核
   
    BIOS的基本功能(很重要)
    1、检查硬件
    2、获取硬件信息
    3、指定启动次序(bootsquence)
   
2、查找内核
    【此时因为没有内核,所无法直接使用文件系统,因此就找不到文件系统删的内核文件】
    MBR
        446:bootloader,在文件系统上找内核【bootloader指定了加载内核的方式】
          64:分区表
            2:幻数
    加载内核步骤(重要)
    1)找指定设备的上的MBR(bootloader)
    2)根据bootloader的指引去加载内核文件(vmlinuz-xxx)
    3)然后会将boot分区当做根分区来使用,来获取系统的基本信息(硬件、软件)
    PS:因为bootloader可以执行系统加载内核,因此,内核所在的分区的一定是一个特殊分区,此分区没有文件系统也可以访问,分区名称是:/boot
系统中的分区(第一个分区必须是boot)

/:根分区 (5G以上)
/boot:开机引导分区
【在手动分区的时候,第一个分必须是boot分区】
/proc:

/sys:伪文件系统分区

/swap:交换分区

内核(kernel)
        源码:kernel.org
        二进制:/boot/vmlinuz-xxx(压缩存放,支持自解压)
    二进制的好处:
            节省内存和存储空间    
            提高IO

3、启动用户空间进程

启动用户空间进程:/sbin/init
    1)由内核中的文件系统功能找到并执行/sbin/init,会产生一个ID为1的进程,进程名就是init
    2)init生成用户空间
   
加载驱动
    【不可能就将全部的驱动都加载到内核中】
    在安装linux的时候,最后一步会执行一个脚本,此脚本会收集系统的基本信息,硬件,软件,驱动,将这些信息打包压缩成一个文件,此文件在centos5.x 叫做initrd-版本号.img;Centos6.x 叫做 initramfs-版本号.img
   
    因此在加载内核到内存的是,会连同initrd/initramfs一起加载到内存中,而且initrd会在内存中展开,将内存中的内核空间当做根分区来使用,在这个根分区中就有了当前系统索要使用的驱动程序。
   
    由initrd所展开生成的根也是一个虚根,在启动完成用户空间以后,会切换到真实根

chroot命令
    作用:切换根

PS:总结启动流程
POST-->BIOS(BootSequence)-->MBR(Bootlader)-->vmlnuz,initrd(initramfs)-->/sbin/init(/etc/inittab)

关于/etc/inittab的相关介绍

程序:/sbin/init
配置文件:/etc/inittab(vim /etc/inittab)
linux的运行级别(模式)
    0 - halt (Do NOT set initdefault to this)(关机)
    1 - Single user mode(通常用来修复系统)
    2 - Multiuser, without NFS (The same as 3, if you do not have networking)  (为了解决网络不通导致系统启动异常)
    3 - Full multiuser mode(字符级别的多用户模式)
    4 - unused(系统保留功能)
    5 - X11(图形界面,前提必须安装图形界面)
    6 - reboot (Do NOT set initdefault to this)   (重启) 
 
*查看级别
    # runlevel
   返回: N 3
    N:表示没有切换过级别
   切换级别
    # init N

inittab详解
    格式:
        id:level:action:process

action的相关介绍
        initdefault: 设置默认级别
        sysinit:指定系统初始化过程中,要执行的脚本
        wait:等待,监控一旦处于指定级别就执行的操作
        ctrlaltdel:设置当用户按下 ctrl + alt + del时候所触发的操作
        powerfail:设置当发生断电的情况下,所执行的操作
        respawn:指定终端
 
linux系统启动过程中,会将指定级别下的程序启动或关闭
    程序的存放位置:/etc/init.d
    程序加入到系统服务以后,会自动生成连接文件
    # chkconfig --add 脚本名
    程序的链接文件位置: /etc/rc.d/rcN.d
        /etc/rc0.d 
        /etc/rc1.d
        /etc/rc2.d
        /etc/rc3.d
        /etc/rc6.d
     分别对应系统的七个运行级别
            
    系统启动的时候,会首先判断级别(假设判断级别为3)
    判断级别以后,会在/etc/rcN.d下,将所有S开头的程序启动,所有K开头的程序关闭
 
注意:
    一旦将一个程序添加到系统服务,那么会自动在/etc/rcN.d下创建链接文件
grub引导系统启动,分为三个阶段
    stage1:其实就是使用MBR中的bootloader完成内核检索
    stage1.5:在boot分区中,用来识别文件系统,此阶段只有在分区的时候才有用
    stage2:使用 /boot/grub/grub.conf 中的程序完成系统的最终启动

grub.conf详解(vim /boot/grub/grub.conf)

default=0  #指定默认使用哪个内核文件,零表示第一个
timeout=5 #设置开机等待时间(可以自己改了玩着试试)
splashimage=(hd0,0)/grub/splash.xpm.gz  #开机背景图片,也可修改但是照片的格式必须和系 统相同
hiddenmenu #隐藏菜单
title CentOS (2.6.32-431.el6.x86_64)   #开机提示信息
    root (hd0,0)     #指定内核文件所在分区,这里表示第一个磁盘第一个分区
    kernel /vmlinuz-2.6.32-431.el6.x86_64(指定内核) ro root=/dev/mapper/vg_chenxiaoxu-lv_root rd_LVM_LV=vg_chenxiaoxu/lv_swap rd_NO_LUKS rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 (指定语言)rd_LVM_LV=vg_chenxiaoxu/lv_root(指定根分区位置)  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
    initrd /initramfs-2.6.32-431.el6.x86_64.img

Grub的基本使用(忘了Linux密码可以修改)
    1、进入grub界面:在等待时间内按回车键
        可用的命令
        e:进入编辑界面(其实编辑/boot/grub/grub.conf)
        a:编辑内核功能
        c:进入命令行模式
    2、进入编辑模式
        e:进入编辑模式       
        c:同上
        b:引导开始进入系统   
        o:新添加一行
        d:删除
    3、编辑kernel行
        【修改此行可以设置系统的运行模式】
        在原有内容后写上一个 1 ,进入单用户模式,然后回车,返回到grub.conf的编辑界面
        按 b 开始引导进入系统
    4、给grub设置密码
        修改grub.conf,添加一个字段passwd
        方式是:
            在title 上面添加一行内容
            password 123
     注意:添加是的明文密码,不安全,所以看下边啦

5、给grub设置加密的密码
        1)生成加密密码

2)将密码添加到/boot/grub/grub.conf中
            password --md5 $1$4ixMm$UXtaHOHwyyQtdtDlk/9no/

--md5:是指定的加密方式大名叫MD5加密
在新的磁盘上安装grub

(前提:添加一个新的磁盘大小为1G,必须使用单个文件作为磁盘文件,将此文件存到一个容易找到的地方,

1)这个新磁盘必须提前进行分区
        2)这个新磁盘必须挂载到系统的某个目录之上

)   
有两种安装方式
    第一种方式:grub-install 进行安装
    第二种方式:进入grub模式进行安装

方式二:grub模式安装    
   # grub
        grub >
       破坏grub的第一阶段
        bootloader(MBR-446)
        # dd if=/dev/zero of=/dev/sda bs=1 count=1(泡泡机)
        修复grub的第一阶段
        1)进入grub模式
            # grub
        2)测试根分区的编号
            # root  (hd#,#)  PS:这里的hd#是磁盘编号,#是分区编号
            出现信息:filesystem type unkown 表示不是boot所在分区
        3)在根分区所在的磁盘上安装grub(bootloader)
            安装grub的格式:
                grub > setup (hd#)  PS:hd# 表示在指定的磁盘上来安装grub

方式一:grub-install方式安装
    格式:grub-install --root-directory=路径
        注意:这个路径指的是boot所在分区
    1)分区操作
        分区
        格式化
        挂载
            # mount /dev/sdb1 /media
    2)安装grub
        # gurb-install --root-directory=/media /dev/sdb
   
模块相关的命令
    lsmod
        已经加载的模块名称以及依赖的模块
    modinfo
        格式:modinfo 模块名称
        作用:显示一个莫得详细信息
        depends:该模块所依赖的模块
        filename:模块的保存位置
        description:模块的描述信息
    modprobe
        格式:modprobe 模块名称
        作用:动态加载模块
       
    modprobe -r 模块名称:卸载模块

insmod
        格式:insmod /patt/to/模块名称
        作用: 加载模块
   
    rmmod
        格式:rmmod 模块名称
        作用:卸载模块

例子:查看显示floppy模块信息
           
    查看模块的相信信息
    # modinfo floppy
       
    查看该模块是否已经被加载
    # lsmod | grep floppy
    floppy                 61447  0
       
    卸载此模块
    # modprobe -r floppy
    # lsmod | grep floppy   
       
    重新加载此模块
    # modprobe floppy
    # lsmod | grep floppy
        floppy                 61447  0        
       
       
       
准备一个新磁盘
安装grub
编写一个grub.conf
向这个磁盘移植几个常用命令ls cd mkdir。。。
       
       
       
制作简单的linux
1、添加硬盘,创建两个分区
    1)创建分区
        /dev/sdb1->200M
        /deb/sdb2->xx
    2)挂载分区
        sdb1 --> /media/boot
        sdb2 --> /media/sysroot
       
2、在该硬盘上安装grub
    # grub-install --root-directory=/media/boot /dev/sdb

3、移植kernel和initrd

4、创建系统的必要目录
    bin
    sbin
    etc/rc.d
    var
    usr
    tmp
    home
    root
    proc
    sys
    meida
    mnt
    lib
    lib64
   
5、移植系统命令
    bash
    mount
    cd
    ls
    cp
    mkdir
    rm
    touch
   
6、给bash创建软件链接sh

7、生成grub的配置文件
    default=0
    timeout=10
    title my mini linux
        root (hd0,0)
        kernel /vmlinuz ro root=/dev/sda2 quiet selinux=0 init=/bin/bash
        initrd /initramfs.img

8、创建一个init程序,来完成系统初始化
    1)创建init
        #!/bin/bash
        echo -e "wellcome to linux \033[32m zxhk \033[0m"
        # mount -n -t proc proc /proc
        mount -n -t sysfs sysfs /sys
        mount -n -o remount,rw /dev/sda2 /
        /bin/bash
    2)赋予执行权限

3)修改grub.conf

9、导入网络功能模块
    1)导入命令
   
    2)移植网卡模块
        # cp `modinfo e1000 | head -n1 | awk ‘{print $2}‘` /media/sysroot/lib/

3)修改init,加载网卡模块
        #!/bin/bash
        echo -e "wellcome to linux \033[32m zxhk \033[0m"
        # mount -n -t proc proc /proc
        mount -n -t sysfs sysfs /sys
        insmod /lib/e1000.ko
        ifconfig eth0 10.100.0.112 netmask 255.255.0.0
        ifconfig lo 127.0.0.1 netmask 255.0.0.0
        mount -n -o remount,rw /dev/sda2 /
        /bin/bash

Author:潇湘雨错

时间: 2024-10-06 17:54:54

Linux系统的启动流程以及做个小小的Linux的相关文章

0923------APUE 学习笔记----------Linux系统的启动流程

前言: 前天在看APUE的时候突然想到了这个问题,于是给自己科普一下Linux系统的启动流程. 1.加载BIOS 接通电源后,计算机首先加载BIOS(即Basic Input-Output System,该程序被固化在主板上的一个ROM芯片中,包括最基本的输入输出程序.系统设置程序.开机硬件自检程序和系统自举程序等),进行硬件自检(即Power On Self Test)检查计算机硬件是否满足运行的基本条件(对于非严重故障,会发出一些声音,严重故障则会直接退出),硬件自检完成以后,BIOS根据C

LINUX系统开机启动流程全解

1,linux系统6.0系列和7.0系列系统开机启动流程:简述:1,开机BIOS自检2,MBR引导(磁盘上的一个引导扇区512K)3,grub引导菜单(可进入单用户模式或者救援模式)4,加载Kernel内核5,启动init进程(6系列的第一个进程7系列的第一个进程是systemd6,读取initab启动文件执行rc.sysinit等开机启动脚本文件7,启动mingetty,启动系统登录界面 原文地址:https://blog.51cto.com/13858002/2429553

[转] 浅谈Linux系统的启动流程

原文:http://blog.csdn.net/justdb/article/details/9621271 版权声明:本文为博主原创文章. Linux系统的启动时通过读取不同的配置文件,执行相应的Shell脚本完成的.当然本文只是简单的从文件的角度分析,更深层次的本文没涉及. 主要读取了以下文件: 1 /boot/grub/grub.conf 2 /etc/inittab 3 /etc/rc5.d(rc.d) 0-99 Seq 4 /etc/passwd (Login,input userna

Linux系统开机启动流程介绍

一.linux系统进程启动流程图: 二.简单概括描述linux系统从开机到登陆界面的启动过程 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核 5.启动init进程 6.读取inittab文件执行rc.sysinit.rc等脚本 7.启动mingetty进入系统登录界面 三.详细剖析linux系统启动过程 1.POST开机自检 电脑主机打开电源的时候随后会听到滴的一声响系统启动开始了开机自检POST-power on self Test自检开始这个过程中主要是检测计算机硬

Linux系统详细启动流程

第一阶段:BOIS(Basic Input Output System)初始化,如图1 首先加载的是BIOS ,通过bios程序去加载CMOS(用来保存BIOS的硬件配置和用户对某些参数的设定(如日期.时间.启动设置等)的芯片,是主板上的一块可读写的并行或串行FLASH芯片,是)的信息.取得cmos中的信息后,BIOS开始开机自检(POST),然后执行硬件的初始化,并设定Pnp(即插即用,U盘等)设备,再定义可以开机的设备顺序,接下来就是读取开机设备的数据(就是第一个开机设备内的第0个扇区内的M

Linux系统之启动流程

开机自检(bios) MBR引导 GRUB菜单 加载内核(kernel) init 进程初始化 ·由linux内核加载运行/sbin/init ·是系统的第一个进程 ·PID永远为1 init进程的配置文件 参数 说明 /etc/inittab 配置默认运行级别 /etc/sysconfig/init 控制tty终端的开启数量.终端颜色方案 /etc/init/rcS.conf 加载rc.sysinit脚本,完成初始化任务 /etc/init/rc.conf 兼容脚本,负责各运行级别的调用处理

Linux系统的启动流程

本来打算写一篇关于Linux系统启动步骤的博客,发现很多博客写的都特别好,这里就不在写了. 先上一张特别详尽系统启动流程图: 系统启动的详细说明另见: http://blog.chinaunix.net/uid-26495963-id-3066282.html http://roclinux.cn/?p=1301

linux系统开机启动流程

1.加载BIOS,获取启动顺序,找到第一个启动设备 2.读取第一个启动设备MBR区域的信息,里面有GRUB引到程序 3.加载内核.驱动硬件,并且分配硬件资源 4.启动init进程 5.启动内核外的模块以及库,/etc/modeprobe.conf 6.init执行相应运行级别的scripts,并且加载rc.local 7.执行/bin/login程序,等待登录

Linux之Centos系统的启动流程

概述 了解系统的启动流程,有助于我们了解Linux系统上的一些工作原理,有助于我们深入的理解一个系统的运作方式,那么本篇就以CentOS6系统为例,介绍一下有关Linux系统启动相关的内容,分为一下几个部分 1.Linux系统的一些基础概念 2.CentOS6上的启动流程概述 第一章 Linux系统的一些基础概念 Linux系统的组成部分:内核(kernel)+根文件系统(rootfs) rootfs:程序和glibc(GNU发布的libc库)   库:   函数集合,function,调用接口