Linux开机启动流程

转载:https://www.cnblogs.com/tcicy/p/8462040.htmlhtml

linux开机启动详细流程图:
Linux开机启动流程linux

1、BIOS 加电自检
当你按电源开关开机时,电脑会首先去启动BIOS(基本输入输出系统),BIOS通常是集成在主板上的.
BIOS 的工做
1.检测链接硬件,好比显卡,内存,磁盘等等,检测的目的是之后把这些设备信息提供给操做系统
2.寻找启动磁盘,每一种BIOS都会有开机启动菜单,能够在菜单里设置以哪一个设备启动系统
好比:光驱,硬盘,网络等等,这个菜单能够设置多个选项,依照设置次序在设备上寻找启动信息
3.找到了启动硬盘,接着BIOS就会在磁盘上找启动扇区,找到内核启动系统.
1)先试着寻找第一个扇区,也就是主引导记录MBR(Master Boot Record)
2)若是第一个扇区上没有没有存在操做系统,再去寻找标记为BOOT的分区.
不管是MBR仍是BOOT分区,存储操做系统的空间都只有446字节;
若是没有在上面提到的位置找到操做系统的内核,那么BIOS就没法继续启动工做.
而咱们的内核每每会大于446个字节,存放在磁盘的其余位置上,既然446装不下内核,又为了能顺利的找到放在其余位置上的内核,
人们想出了一个办法就在446字节里写了一个小程序,当BIOS试着启动操做系统时就会执行这个小程序,而后再由小程序来载入其余位置的内核.这个小程序就是启动载入器(boot loader)
2、BOOT Loader
linux的boot loader(上文提到的小程序) 常见的有两种:lilo grub
由于lilo存在着一个1024柱面的限制,而且更改了磁盘上的启动信息文件后须要从新启动系统才能同步446字节的内容,由于lilo的缺陷,已经被grub所取代.如今的绝大多数类linux系统都采用grub作boot loader;
grub则没有了lilo各类限制,并且方便到能修改系统文件的启动内容就能够马上与446内容同步.
那么咱们就看看grub的内容 它存在于 /boot/grub中
GRUB有几个重要的文件,STAGE一、STAGE1.五、STAGE2
STAGE1:它只有512字节,一般放在MBR中,它的做用很简单,就是在系统启动时用于装载STAGE2并将控制权交给它。
STAGE2:GRUB的核心,全部的功能都是由它实现。
STAGE1.5:介于STAGE1和STAGE2之间,是它们的桥梁,由于STAGE2较大,一般都是放在一个文件系统当中的,可是STAGE1并不能识别文件系统格式,
因此才须要STAGE1.5来引导位于某个文件系统当中的STAGE2。根据文件系统格式的不一样,STAGE1.5也须要相应的文件,如:e2fs_stage1_5,fat_stage1_5,分别用于识别ext和fat的文件系统格式。它存放于1-63的柱面之间.
引导顺序以下:STAGE1->;STAGE1.5->;STAGE2,
主要的配置文件时 grub.conf
里面选项含义:
title:一个操做系统引动的标头,可使多个
root :指明所需文件存在于哪一个磁盘哪一个分区上 (hd0,0)表示第一个硬盘,第一个分区,可参考/boot/grub/device.map
kernel:内核文件的名字,而且会有一些加载内核时的参数 or表明以只读方式加载
initrd:包含一些附加的驱动程序ios

3、内核启动
内核启动后会向bios查询电脑的全部硬件信息,而后本身接手下来管理这些设备,以便提供给linux使用
内核会试着驱动这些设备,这些设备的驱动一部分包含在内核中,叫作静态驱动,一部分以模块的方式(动态)存放文件系统中,由
于此时还未挂载任何文件系统,所以还不能使用文件系统中的模块,这里只能驱动在内核中存在的硬件驱动程序的对应设备.想驱动内核中未包含的硬件驱动就须要加载文件系统.
内核会尝试挂载根文件系统,根文件系统至少包含 /etc /bin /sbin /lib /dev 这5大目录
他们5个缺一不可.都会致使系统没法启动
根文件系统挂载是以只读方式挂载的,由于这时linux还在启动阶段,并不稳定,避免破坏系统资料
4、启动INIT服务
顺利的挂载了根文件系统后,就会启动init服务
内核会按 /sbin/init /etc/init /bin/init 顺序寻找init程序,
若是找不到则内核报错 这里存在一个参数 init=/bin/sh 若是启动时指定了则最后执行/bin/sh
而不会产生内核报错.也被称为快速启动,由于它忽略了不少启动初始化工做.
启动init的目的就是为了初始化系统环境,启动了init就证实了内核已经顺利启动,接下来就由init服务来创建linux使用环境
init作了什么?它会读取 /etc/inittab 文件,根据这个文件的信息来进行初始化工做.
会执行三个脚本 /etc/rc.d/rc.sysinit /etc/rc.d/rc /etc/rc.d/rc.local
rc.sysinit 主要的功能用来创建系统的基本环境
启动udev selinux子系统
udev负责产生 /dev中的文件,selinux负责加强系统的安全性
设定核心参数 sysctl -p 加载 /etc/sysctl.conf
设定系统时间 将硬件时间设定为系统时间
加载键盘和交换分区 swapon -a -e
设置主机名,挂载文件系统,并将根从新挂载为可读写的.
加载动态驱动模块
USB设备与RAID & LVM
卸载 /initrd/ 目录shell

rc 脚本设置启动级别 linux中有许多不一样的启动级别,不一样的启动级别会制定不一样的服务
根据指定rc的参数会对应执行 /etc/rc.d/rc[0-6].d/ 中的链接脚本文件 以S开头的则启动
rc.local 前两个脚本都是系统相当重要的脚本,若是咱们想在启动过程当中放置一些其余程序
应该使用rc.local脚本中 由于S99local存在于rc[2-5].d中
三个RC脚本执行完毕后,就会创建虚拟主控制台 执行 /bin/login 就提供了用户登录界面了
若是是图形 L5级别的话,会启动X window登陆界面
全部的启动就都已经完毕
用户环境初始化
输入用户名和密码系统验证,而后会执行
/etc/profile
/etc/profile.d/*.sh $HOME/.bash_profile
/etc/bashrc
$HOME/.bashrc小程序

启动级别
0 关机
1 单用户
2 多用户模式但带网络但不能远程登陆
3 不受限多用户模式 TUI
4 保留
5 图形模式
6 从新启动
查看启动级别
*# runlevel**
N 3
N是上次的级别,3是当前级别 也就是说机器开机就是3级别
切换级别
init 5安全

挂载文件系统
/etc/fstab
第一项 是要mount的存储装置的实体位置或者用卷标
第二项 要挂到哪一个目录位置
第三项 指定要挂载的系统格式
第四项 mount时要设定的状态,只读或defauls
第五项 提供DUMP功能,在系统DUMP时须要BACKUP的标志位,其内定位置是 0
第六项 设定开机时文件系统是否要check
除了root的文件系统其必要的check为1 其余视须要而定 默认是0
LABEL=/boot /boot ext3 defaults 1 2bash

用户登陆网络

开机启动程序加载完毕之后,就要让用户登陆了。session

Linux开机启动流程
通常来讲,用户的登陆方式有三种:ssh

(1)命令行登陆
(2)ssh登陆
(3)图形界面登陆

这三种状况,都有本身的方式对用户进行认证。

(1)命令行登陆:init进程调用getty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,核对密码(Debian还会再多运行一个身份核对程序/etc/pam.d/login)。若是密码正确,就从文件 /etc/passwd 读取该用户指定的shell,而后启动这个shell。

(2)ssh登陆:这时系统调用sshd程序(Debian还会再运行/etc/pam.d/ssh ),取代getty和login,而后启动shell。

(3)图形界面登陆:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm(GNOME Display Manager),而后用户输入用户名和密码。若是密码正确,就读取/etc/gdm3/Xsession,启动用户的会话。

进入login shell

所谓shell,简单说就是命令行界面,让用户能够直接与操做系统对话。用户登陆时打开的shell,就叫作login shell。
Linux开机启动流程

Debian默认的shell是Bash,它会读入一系列的配置文件。上一步的三种状况,在这一步的处理,也存在差别。

(1)命令行登陆:首先读入 /etc/profile,这是对全部用户都有效的配置;而后依次寻找下面三个文件,这是针对当前用户的配置。

  ~/.bash_profile
  ~/.bash_login
  ~/.profile  

须要注意的是,这三个文件只要有一个存在,就再也不读入后面的文件了。好比,要是 ~/.bash_profile 存在,就不会再读入后面两个文件了。

(2)ssh登陆:与第一种状况彻底相同。

(3)图形界面登陆:只加载 /etc/profile 和 ~/.profile。也就是说,~/.bash_profile 无论有没有,都不会运行。

打开non-login shell

老实说,上一步完成之后,Linux的启动过程就算结束了,用户已经能够看到命令行提示符或者图形界面了。可是,为了内容的完整,必须再介绍一下这一步。

用户进入操做系统之后,经常会再手动开启一个shell。这个shell就叫作 non-login shell,意思是它不一样于登陆时出现的那个shell,不读取/etc/profile和.profile等配置文件。
Linux开机启动流程

non-login shell的重要性,不只在于它是用户最常接触的那个shell,还在于它会读入用户本身的bash配置文件 ~/.bashrc。大多数时候,咱们对于bash的定制,都是写在这个文件里面的。

你也许会问,要是不进入 non-login shell,岂不是.bashrc就不会运行了,所以bash 也就不能完成定制了?事实上,Debian已经考虑到这个问题了,请打开文件 ~/.profile,能够看到下面的代码:

  if [ -n "$BASH_VERSION" ]; then    
   if [ -f "$HOME/.bashrc" ]; then      
   . "$HOME/.bashrc"    
   fi  
  fi  

上面代码先判断变量 $BASH_VERSION 是否有值,而后判断主目录下是否存在 .bashrc 文件,若是存在就运行该文件。第三行开头的那个点,是source命令的简写形式,表示运行某个文件,写成"source ~/.bashrc"也是能够的。

所以,只要运行~/.profile文件,~/.bashrc文件就会连带运行。可是上一节的第一种状况提到过,若是存在~/.bash_profile文件,那么有可能不会运行~/.profile文件。解决这个问题很简单,把下面代码写入.bash_profile就好了。

  if [ -f ~/.profile ]; then    
   . ~/.profile
  fi 
 
这样一来,不论是哪一种状况,.bashrc都会执行,用户的设置能够放心地都写入这个文件了。

Bash的设置之因此如此繁琐,是因为历史缘由形成的。早期的时候,计算机运行速度很慢,载入配置文件须要很长时间,Bash的做者只好把配置文件分红了几个部分,阶段性载入。系统的通用设置放在 /etc/profile,用户我的的、须要被全部子进程继承的设置放在.profile,不须要被继承的设置放在.bashrc。

顺便提一下,除了Linux之外, Mac OS X 使用的shell也是Bash。可是,它只加载.bash_profile,而后在.bash_profile里面调用.bashrc。并且,不论是ssh登陆,仍是在图形界面里启动shell窗口,都是如此。

相关文章
相关标签/搜索