zoukankan      html  css  js  c++  java
  • 【转】linux启动流程

    文章出处:http://www.cnblogs.com/scnutiger/archive/2009/09/30/1576795.html#2389166

    linux启动流程

    [摘至鸟哥的linux私房菜] 今天看了linux启动相关的内容,把主要的部分记录如下。
    linux的基础启动流程
    1. 加载BIOS的硬件信息,并获取第一个启动设备的代号。
    2. 读取第一个启动设备的MBR的引导加载程序(即lilo、grub、spfdisk等)的启动信息。
    3. 加载操作系统的核心信息,核心开始解压,并尝试驱动所有的硬件设备。
    4. 核心执行init程序并获得运行信息。
    5. init执行/etc/rc.d/rc.sysinit文件。
    6. 启动核心的外挂模块(/etc/modprobe.conf)。
    7. init执行运行的各个批处理文件(Script)
    8. init执行/etc/rc.d/rc.local文件。
    9. 执行/bin/login程序,等待用户登录。
    10. 登录之后开始以shell控制主机。

    1. linux核心的引导
    操作系统的核心是放在文件系统中的,要想正确加载核心就必须提前识别文件系统。系统刚启动的时候,就需要通过引导加载程序(即lilo、grub、spfdisk等)来识别文件系统,引导核心。要想加载linux的核心就必须能识别linux的文件系统,要加载windows核心就必须能识别windows文件系统。而grub是同时支持linux和windows的。但windows的加载程序并不支持linux文件系统,所以在多重启动设置的时候,总是要先装windows而后装Linux。

    核心文件在哪里呢?一般来说,它会放在/boot里,并且取名为/boot/vmlinuz。

    在加载核心的过程中,必须知道,系统只会“载入根目录”,并且是以只读方式载入的。有时为了让某些功能可以用文件的方法来读取,有的系统在启动的时,会建立虚拟盘(ramdisk),这就需要使用initrd以及linuxrc了。在加载核心的时候,一起加载initrd的映像文件(boot/initrd-xxxx.img),并利用linuxrc(在initrd的映像文件内)程序来加载模块。在核心驱动外部硬件的工作完成之后,initrd所建立的虚拟盘就会被删除。

    2. 第一个程序init的加载和runlevel设置
    在核心加载完成之后,系统就准备好了,等待程序的执行。整个linux系统中,第一个执行的程序就是“/sbin/init”。init程序做的工作相当多,除了利用设置文件“/etc/inittab”来获取运行等级之外,还会通过运行等级的设置值启动不同的服务项目。运行等级是指linux通过设置不同等级来规定系统用不同的服务来启动,让linux的使用环境不同。

    "/etc/inittab"中有这么一句"si::sysinit:/etc/rc.d/rc.sysinit",表明系统需要主动使用"rc.sysinit"这个shell脚本来设置系统环境。但这个文件的文件名在各个版本中是不一样的,需要自行查看确认。
    Code
     [root@linux ~]#vi /etc/inittab
     # 设置系统启动默认的运行等级设置项目
     id:3:initdefault:
     
     # 开始启动运行等级的服务前,使用检测与初始化系统环境的设置文件:
     si::sysinit:/etc/rc.d/rc.sysinit
     
     # 7个不同运行等级需要启动的服务的脚本放置位置路径:
     10:0:wait:/etc/rc.d/rc 0
     11:1:wait:/etc/rc.d/rc 1
     12:2:wait:/etc/rc.d/rc 2
     13:3:wait:/etc/rc.d/rc 3
     14:4:wait:/etc/rc.d/rc 4
     15:5:wait:/etc/rc.d/rc 5
     16:6:wait:/etc/rc.d/rc 6
     
     # 是否运行按下[ctrl]+[alt]+[del]就重新启动的设置项目:
     ca::ctrlatdel:/sbin/shutdown -t3 -r now
     
     # 本机终端启动的个数:
     1:2345:respawn:/sbin/mingetty tty1
     2:2345:respawn:/sbin/mingetty tty2
     3:2345:respawn:/sbin/mingetty tty3
     4:2345:respawn:/sbin/mingetty tty4
     5:2345:respawn:/sbin/mingetty tty5
     6:2345:respawn:/sbin/mingetty tty6
     
     # 在X Window(运行级别5)环境下启动脚本设置项目
     x:5:once:/etc/X11/prefdm -nodaemon

    3. init处理系统的初始化流程(/etc/rc.d/rc.sysinit)
    (1)获取网络环境与主机类型。首先会读取网络环境设置文件"/etc/sysconfig/network",获取主机名称与默认网关等网络环境。
    (2)测试与载入内存设备/proc及usb设备/sys。除了/proc外,系统会主动检测是否有usb设备,并主动加载usb驱动,尝试载入usb文件系统。
    (3)决定是否启动SELinux。
    (4)接口设备的检测与即插即用(pnp)参数的测试。
    (5)用户自定义模块的加载。用户可以再"/etc/sysconfig/modules/*.modules"加入自定义的模块,此时会加载到系统中。
    (6)加载核心的相关设置。又一个文件"/etc/sysctl.conf",按这个文件的设置值配置功能。
    (7)设置系统时间(clock)。
    (8)设置终端的控制台的字形。
    (9)设置raid及LVM等硬盘功能。
    (10)以方式查看检验磁盘文件系统。
    (11)进行磁盘配额quota的转换。
    (12)重新以读取模式载入系统磁盘。
    (13)启动quota功能。
    (14)启动系统随机数设备(产生随机数功能)。
    (15)清楚启动过程中的临时文件。
    (16)将启动信息加载到"/var/log/dmesg"文件中。
    如果想知道启动过程中发生了什么事可以查看dmesg文件。

    4. 启动系统服务"/etc/rc.d/rc*.d"与启动设置文件"/etc/sysconfig"
    之前结束了inittab中的rc.sysinit之后,系统可以顺利工作了,只是还需要启动系统所需要的各种服务,这样主机才可以提供相关的网络和主机功能。因此根据之前设置的运行等级,会启动不同的服务项目。如果当时我们在inittab中选择了等级3,系统则会在"/etc/rc.d/rc3.d"目录中运行相应的服务内容,选择等级5,就在"/etc/rc.d/rc5.d"目录内。

    该目录下的内容全部都是以 S 或 K 开头的链接文件,都链接到"/etc/rc.d/init.d"目录下的各种shell脚本。S表示的是启动时需要start的服务内容,K表示关机时需要关闭的服务内容。如果我们需要自己增加启动的内容,可以再init.d目录中增加相关的shell脚本,然后在rc*.d目录中建立链接文件指向该shell脚本。这些shell脚本的启动或结束顺序是由S或K字母后面的数字决定,例如S01sysstat表示第一个执行sysstat脚本,S99local表示排在第99位执行rc.local脚本。

    5. 用户自定义引导程序(/etc/rc.d/rc.local)
    一般来说,自定义的程序不需要执行上面所说的繁琐的建立shell增加链接文件的步骤,只需要将命令放在rc.local里面就可以了,这个shell脚本就是保留给用户自定义启动内容的。

    6. 启动终端和X-Window界面
    完成了系统所有的启动任务后,linux会启动终端或X-Window来等待用户登录。
    tty1,tty2,tty3...这表示在运行等级1,2,3,4的时候,都会执行"/sbin/mingetty",而且执行了6个,所以linux会有6个纯文本终端,mingetty就是启动终端的命令。
    除了这6个之外还会执行"/etc/X11/prefdm -nodaemon"这个主要启动X-Window

    7. 有关变换运行等级
    当linux已经登录之后,有时候还希望更换运行等级,一种方法是改变"/etc/inittab"内的设置内容,将"id:3:initdefault:"中的数字改成相应等级,然后重启即可。

    如果只是想暂时地改变运行等级,下次启动还是按原等级登录,可以直接使用init [0-6]命令来改变运行等级。一般来说,运行等级的不同只是相关的启动服务内容的不同而已,因此使用命令改变等级会比较两个改变等级之间的服务内容,关闭一些新等级中不需要的服务项目,启动新等级需要的服务,而保量新等级和原等级中共有的服务内容。查询目前等级的命令也很简单,只需要输入runlevel即可。如:[root@linux ~]# runlevel  结果显示:N 3

  • 相关阅读:
    windows服务等获取文件路径文件目录方法
    推荐几款很棒的 JavaScript 表单美化和验证插件
    在网站制作中随时可用的10个 HTML5 代码片段
    SQLServer数据排序
    SQL Join的一些总结
    3.14(链表练习)
    链表
    基数排序
    hdu-1198(并查集)
    hdu-1207(规律推导)
  • 原文地址:https://www.cnblogs.com/woshitianma/p/2811787.html
Copyright © 2011-2022 走看看