|簡體中文

比思論壇

 找回密碼
 按這成為會員
搜索



查看: 887|回復: 1
打印 上一主題 下一主題

linux引导过程

[複製鏈接]

989

主題

1

好友

5295

積分

教授

Rank: 8Rank: 8

  • TA的每日心情

    2024-11-3 15:50
  • 簽到天數: 1258 天

    [LV.10]以壇為家III

    推廣值
    2
    貢獻值
    378
    金錢
    1523
    威望
    5295
    主題
    989

    回文勇士 文明人 中學生 高中生 簽到勳章 簽到達人 男生勳章 大學生 文章勇士 附件高人 附件達人 文章達人 教授

    樓主
    發表於 2012-9-3 23:00:36
    从打开计算机的电源开始启动redhat linux 系统到用户可以登录为止,共经历了
    1.初始化bios
    2.执行启动加载程序
    3.载入内核
    4.启动init服务(rc.sysinit->rc->rc.local->建立使用环境)

    计算机在接通电源之后首先由bios进行post自检,然后依据BIOS内设置的引导顺序从硬盘,软硬或cdrom中读入引导块

    BIOS的第一个步骤是加电post自检,post的工作是对硬件进行检测,BIos的第二个步骤是进行本地设备的枚举和初始化。BIOS

    由2部分组成:POST代码和运行时的服务,当POST完成之后,它被从内存中清理出来,但是BIOS运行时服务依然保留在内存中,目标操作系统可以使用这些服务

    BIOS运行时会按照CMOS的设置定义的顺序来搜索处于活动状态并且可以引导的设备,引导设备可以是软盘,CD-ROM,硬盘上的某个分区,
    网络上的某个设备甚至是USB闪存。
    通常,linux都是从硬盘上引导的,其中主引导记录(MBR)中包含主引导加载程序,
    MBR是一个512字节大小的扇区,位于磁盘上的第一个扇区,(0道0柱面1扇区).当MBR被加载到RAM中之后,BIOS就会将控制权交给
    MBR

    启动加载程序
    在RED HAT linux 中,默认的加载程序是GRUB.引导加载程序用于引导操作系统启动,当机器引导它的操作系统时,BIOS会读取引导介质上最前面的512字节
    (主引导记录)。在单一的MBR中只能存储一个操作系统的引导记录,所以当需要启动多个操作系统的时就会出现问题,需要更加灵活的引导加载程序
    所有的引导加载程序都以类似的方式工作,linux系统支持常用的引导加载程序:LILO和grub

    载入内核
    接一下的步骤就是加载内核映像到内存中,内存映像并不是一个可执行的内核,而是一个压缩过的内存映像,通常它是一个zImage(压缩映像,小于512KB)
    或是一个bzImage(较大的压缩映像,大于512KB),它是提前使用zlib压缩过的,在这个内核映像前面是一个例程,它实现少量硬件设置,
    并对内核映像中包含的内核进行解压缩,然后将其高端的内存中。如果有初始化RAM磁盘映像,系统就会将它移动到内存中,并标明以后使用。
    然后该例程会调用内核,并开始启动内核引导的过程

    linu内核启动后,会执行以下几项工作
    1.检测所有的硬件设备
    linux内核首先会向BIOS查询计算机的所有的硬件设备的信息,然后自己接手管理这些硬件设备,以便提供给red hat linux系统使用

    2。驱动硬件设备
    接着linux内核便会驱动计算机的硬件设备,要驱动硬件设备,redhat linux就必须加载硬件的驱动程序,redhat linux的驱动程序可分为
    编译在内核镜像文件中的静态驱动程序与内核模块(kernel module)的动态驱动程序2种,其中的内核模块全部都存储在系统中
    由于此时的Linux系统尚未挂载任何文件系统,因而无法使用存储于文件系统上的内核模块,redhat linux 自然借助这些动态驱动程序来驱动硬件设备,因此,
    启动Linux内核的阶段只会使用静态驱动程序,驱动必要的硬件设备
    如果没有提供驱动程序的硬件设备,redhat linux会等到挂载根目录文件系统后,在逐一尝试尚未安装驱动程序的设备的驱动程序

    3.以只读的方式挂载根文件系统
    接着linux内核会试着去挂载根文件系统(root file system).安装适当的内核模块,一便驱动某些硬件设备或启用某些功能,
    启动于存储于根文件系统中的 init服务,以便让Init接手后续的启动工作

    要特别注意的是:此时,根文件系统是采用只读(read-only)的方式进行挂载的,也就是说,到目前为止,linux内核只能读取根文件系统,无法改变其中的内容
    这主要是因为此时的Linux内核仍在启动阶段,还不是很稳定,如果使用可读可写的方式挂载根文件系统,万一 系统不小心当机了,一来可能会破坏根文件系统
    上的数据,再者,redhat linux下次开机得花上很长的时间检查并修复根文件系统,为了避免这些问题的发生,redhat linux系统会以只读的方式来挂载根文件系统

    4.启动Init服务
    redhat linux内核启动后的最后一个动作,就是从根文件系统上找出并执行init服务,redhatlinux 内核会依照下列的顺序寻找init服务,
    1)找/sbin/是否有Init服务
    2)/etc/init
    3)/bin/init

    4)都找不到,就会执行/bin/sh

    在这个过程中,只要有某一个步骤找到Init,linux就会去执行该目录下中的init,如果到最后内核还是找不到init服务,redhat linux内核就会显示 “kernel
    panic not syncing:Attempted to kill init!"的错误信息

    找到Init服务,redhat linux 就会让init服务负责后续初始化使用的环境的工作。

    接下来是执行init进程

    初始化系统环境
    启动 init服务时,init服务会读取/etc/initab 文件,根据/etc/inittab中的设置数据进行初始化系统环境的工作,/etc/inittab 定义
    init服务在red hat linux启动过程中必须依序执行以下几个script.
    /etc/rc.d/rc.sysinit
    /etc/rc.d/rc
    /etc/rc.d/rc.local

    由于这些script文件名都是以rc开头的,所以习惯上我们称这些script为 "RC script".每一个RC Script负责的工作都不一样
    1./etc/rc.d/rc.sysinit
    这个文件主要的功能是设置系统的基本环境,当Init服务执行rc.sysinit时,会执行以下面几项工作
    a.启动udev与selinux子系统
    udev负责管理/dev/中的所有设备文件,而selinux则可以增强 red hat linux系统的安全性。当rc.sysinit执行时,必须启动这2个子系统,才能进行其他的初始化
    系统环境的工作
    b.设置内核参数
    rc.sysinit会执行sysctl -p ,以便从/etc/sysctl.conf设置redhat linux的内核参数
    c.设置系统时间
    rc.sysinit会将硬件时间设置成redhat linux的系统时间
    d.加载键盘对应表
    为了可以使用各式各样的键盘,rc.sysinit也会加载键盘对应表,以便可以正确的输入文字,符号。
    e.启用交换内存空间
    rc.sysinit会执行swapon -a 命令,以便根据/etc/fstab的设置启用所有的交换内存空间
    f.设置主机名
    rc.sysinit会根据/etc/sysconfig/network的Hostname参数设置redhat linux的主机名
    g,检查并挂载所有的文件系统
    rc.sysinit会检查所有需要挂载的文件系统,以确保这些文件系统的完整性,检查完毕后,rc.sysinit就会挂载所有的文件系统
    并且将根文件系统的挂载参数修改为可读可写,以便让我们可以在根文件系统上写入数据。
    h.初始化硬件设备
    red hat linux 除了在启动内核时以静态驱动程序部分的硬件外,在执行rc.sysinit时,也会试着驱动剩余的硬件设备
    i.启动软件磁盘阵列与Lvm
    rc.sysinit也会启用所有的软件磁盘阵列,以及lvm的磁盘设备
    j,如有必要,卸载/initrd/
    /initrd/用来挂载内核的初始化内存磁盘的数据,redhat linux可以通过初始化内存磁盘来加载必须的驱动程序,这样才能让red hat linux能在开机前驱动所需的
    设备,进而顺利的进行启动的工作

    因此初始化内存磁盘只有在启用前有用,因此当redhat linux进入这个阶段时,初始化内存磁盘已经没有存在的价值了,所以rc.sysinit会视情况卸除初始化
    内存磁盘,以节省更多的内存空间

    k,初始化串行端口设备
    l,清除过期的锁定文件与IPC文件
    m,重新设置磁盘参数


    /etc/rc.d/rc
    这个脚本是用来建立runlevel的环境

    /etc/rc.d/rc.local
    如果需要在系统启动的过程中执行某些工作,可以通过rc.sysinit,rc这2个脚本文件来定义要执行的工作内容,但这2个文件是启动过程中非常重要的
    启动文件,如果,rc.sysinit 或rc有错误的内容,轻则导致系统启动时出现无法预期的错误,严重则可能会造成redhat linux系统根本无法启动。
    所以,通常不能对这2个文件进行修改
    既然不能修改rc.sysinit,rc,那该如何让redhat linux的系统在启动时执行某些工作呢?此时请使用rc.local

    rc.local是整个启动过程中唯一可以修改的脚本文件,如果希望在red hat linux启动过程中执行某些命令,或者执行某些工作的话,那么就可以
    把这些工作的命令定义在这个文件里,当redhat linux开机并执行到rc.local时,就可以依照所定义的内容,完成系统的初始化工作。
    重要聲明:本論壇是以即時上載留言的方式運作,比思論壇對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,讀者及用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,讀者及用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本論壇受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者及用戶發現有留言出現問題,請聯絡我們比思論壇有權刪除任何留言及拒絕任何人士上載留言 (刪除前或不會作事先警告及通知 ),同時亦有不刪除留言的權利,如有任何爭議,管理員擁有最終的詮釋權。用戶切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。

    手機版| 廣告聯繫

    GMT+8, 2024-11-13 23:01 , Processed in 0.012268 second(s), 16 queries , Gzip On, Memcache On.

    Powered by Discuz! X2.5

    © 2001-2012 Comsenz Inc.

    回頂部