zoukankan      html  css  js  c++  java
  • 计算机的启动和Linux的启动

    计算机的启动和Linux的启动

     


     

    一 计算机的启动
    =========
    计算机的启动过程分为四个阶段,分别是:BIOS、MBR、启动管理程序、加载操作系统内核、操作系统启动。

     

    1.1 BIOS
    ----------
    计算机加电后,第一件事就去加载BIOS进入内存,之后系统的控制权交给BIOS。BIOS首先会加载存储在CMOS中的各各硬件的配置参数,之后进行开机硬件自检(Power-On Self-Test POST)。

     

    1.2 MBR
    ----------
    硬件自检完成之后,BIOS会根据CMOS中记录的存储设备的启动顺序,来读取第一个可启动设备的第一个扇区,这个扇区也叫主引导扇区MBR(Master Boot Record)。
    (MBR一般是512字节,分为三部分,前边的446个字节里存放启动管理程序grub,后边的64个字节存放存储设备的分区表,最后的两个字节的值是0x55和0xAA,表明这个设备可以用于启动。)

     

    1.3 Grub
    ----------
    BIOS把MBR中的grub读取到内存之后,就把计算机的控制权交给grub。grub给用户显示一个可启动操作系统的选单,由用户来选择要启动哪一个操作系统。

     

    1.4 加载操作系统内核
    ----------------------
    选定要启动的操作系统之后,grub负责读取磁盘中的操作系统入内存。接下来系统的控制权会交给操作系统的核心kernel。

     

    二 操作系统的启动
    ==========
    操作系统的启动过程是在grub把kernel加载进入内存之后,控制权交给kernel之后开始的。比较复杂,包括以下步骤:kernel重新检测硬件并驱动外围设备、启动初始化程序/sbin/init、确定运行级别/etc/inittab、处理系统初始化、加载开机启动服务程序、加载用户自定义开机启动程序、用户登录(/sbin/mingetty,/bin/login)、进入login shell(bash)、打开non login shell。

     

    2.1 kernel重新检测硬件并驱动外围设备
    --------------------------------------
    kernel在内存中开始运行之后,它首先会重新检测一遍硬件,然后kernel会加载各个外围设备的驱动程序,驱动各个外围设备。
    此时,主机的硬件就已经全部准备就绪了。

     

    2.2 kernel运行/sbin/init程序
    -------------------------------
    主机硬件准备就绪后,kernel会运行/sbin/init程序,它是kernel之外的第一个进程,所以它的PID是1,其他进程都是它的子进程。
    /sbin/init的主要功能是准备软件执行的环境,包括系统的主机名、网络设定、语言处理、文件系统格式和其他系统服务的启动。
    这些功能都是由它的配置文件/etc/inittab来确定的。

     

    2.3 确定运行级别
    -------------------
    init进程会根据它的配置文件/etc/inittab文件来确定系统的运行级别。系统有7个运行级别,但是一般只有一个默认运行级别,init接下来会根据这个默认的运行级别,运行一些列的脚本来完成它的各项功能。
    运行级别是记录在/etc/inittab文件中的,它一般包括7个级别,分别是0-6号:
    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)
    id:3:initdefault: #这就是默认的运行级别
     
    每个运行级别在/etc/rc.d目录下面,都有一个对应的子目录,指定要加载的程序。
    rc0.d
    rc1.d
    rc2.d
    rc3.d
    rc4.d
    rc5.d
    rc6.d

     

    2.4 init处理系统初始化(/etc/rc.d/rc.sysinit)
    ---------------------------------------------------
    在init运行各个系统服务的启动脚本之前,得先用rc.sysinit脚本来准备好系统环境,

     

    2.5 加载开机启动的系统服务程序
    --------------------------------
    一般各个运行级别在/etc/rc.d/都有一个目录rcN.d,这个目录中存放了这个级别需要启动的服务的启动脚本。
    比如/etc/rc.d/rc3.d/下
    ...
    K92pppoe-server
    K95firstboot
    K95rdma
    K99rngd
    S01sysstat
    S02lvm2-monitor
    ...
    这些脚本的名字是这样的:字母S或K+两位数字+程序名。根据S开头或K开头,脚本分为两类:一类以S开头,表示在这个运行级别下要启动的服务,另一类以K开头,表示在这个运行级别下坚决要关闭的服务,尤其是如果从其他运行级别切换过来,需要关闭的程序。
    后面的两位数字表示处理顺序,数字越小越早处理,数字相同时,则按照程序名的字母顺序启动。
    运行这些启动脚本之后,各项随着开机而启动的服务程序就都启动起来了。

     

    2.6 自定义开机启动程序
    ------------------------
    开机的时候不仅可以启动一些必须的系统服务程序,用户还可以自己指定一些想要在开机时启动的程序,这些程序一般放在/etc/rc.d/rc.local文件中。
    在完成了系统的各项服务之后,就可以运行rc.local来启动用户自定义的开机启动程序了。

     

    2.7 用户登录
    -------------
    系统开机启动程序和用户开机启动程序都启动完成后,就可以让用户登录了。
    一般会有三种用户登录方式:
    (1)命令行登录
    (2)ssh登录
    (3)图形界面登录
    这三种方式的用户名和密码的验证方式不一样。
    (1)命令行登录:init进程调用mingetty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,核对密码。如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell。
    (2)ssh登录:这时系统调用sshd程序,取代mingetty和login,然后启动shell。
    (3)图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm(GNOME Display Manager),然后用户输入用户名和密码。如果密码正确,就读取/etc/gdm/Xsession,启动用户的会话。

     

    2.8 login shell 与 non login shell
    -------------------------------------
    上面的用户登录之后启动的shell,就是login shell。
    login shell会读取/etc/profile、~/.bash_profile或~/.bash_login或~/.profile等配置文件,而在~/.bash_profile中又会执行~/.bashrc文件,这些配置文件会做设置环境变量等其他的工作。
    在login shell下启动的其他的shell都是non login shell。non login shell在启动之前只会读取~/.bashrc文件。
     
     
    以上就是计算机的启动过程和操作系统的启动过程,之后系统就进入了shell控制过程中了。
     
    参考资料:
    计算机是如何启动的?(http://www.ruanyifeng.com/blog/2013/02/booting.html)
    Linux的启动流程(http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html)
    《鸟哥的Linux私房菜基础篇第三版》第21章 
  • 相关阅读:
    域控制器的常规卸载,Active Directory系列之十三
    理解域信任关系,Active Directory系列之十六
    什么是站点,Active Directory系列之十一
    域控制器的强制卸载,Active Directory系列之十四
    详解操作主机角色,Active Directory系列之九
    【转】MapControl和PageLayoutControl的同步
    AE的一些接口小记
    【转】centos linux 上flv/swf视频服务器架设
    lnmp配置超精简免费flv流媒体服务器笔记
    Flash game 遊戲修改 Cheat Engine 5.4 使用教學
  • 原文地址:https://www.cnblogs.com/zhangzl419/p/6819373.html
Copyright © 2011-2022 走看看