linux启动流程梳理【转】

接触linux系统运维已经好几年了,常常被问到linux系统启动流程问题,刚好今天有空来梳理下这个过程:
一般来说,所有的操作系统的启动流程基本就是:

总的来说,linux系统启动流程可以简单总结为以下几步:
1)开机BIOS自检,加载硬盘。
2)读取MBR,进行MBR引导。
3)grub引导菜单(Boot Loader)。
4)加载内核kernel。
5)启动init进程,依据inittab文件设定运行级别
6)init进程,执行rc.sysinit文件。
7)启动内核模块,执行不同级别的脚本程序。
8)执行/etc/rc.d/rc.local
9)启动mingetty,进入系统登陆界面。

linux系统安装时,如果要想设置开启启动项,可以:
开机到BIOS提醒界面,按键F11(Dell服务器的做法)进入BIOS设置BOOT MENU,继而设置启动项:硬盘HD启动,光盘CD/DVD启动,还是U盘USB启动。

下面就linux操作系统的启动过程做一详细解析记录:

加载内核
操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。


1

2

3

4

5

6

7

8

9

10

[[email protected] ~]# ll /boot/

total 21668

-rw-r--r--. 1 root root   105195 Nov 22  2013 config-2.6.32-431.el6.x86_64

drwxr-xr-x. 3 root root     1024 Aug 22 16:31 efi

drwxr-xr-x. 2 root root     1024 Aug 22 16:32 grub

-rw-------. 1 root root 15217153 Aug 22 16:32 initramfs-2.6.32-431.el6.x86_64.img

drwx------. 2 root root    12288 Aug 22 16:24 lost+found

-rw-r--r--. 1 root root   193758 Nov 22  2013 symvers-2.6.32-431.el6.x86_64.gz

-rw-r--r--. 1 root root  2518236 Nov 22  2013 System.map-2.6.32-431.el6.x86_64

-rwxr-xr-x. 1 root root  4128368 Nov 22  2013 vmlinuz-2.6.32-431.el6.x86_64

启动初始化进程
内核文件加载以后,就开始运行第一个程序 /sbin/init,它的作用是初始化系统环境。

由于init是第一个运行的程序,它的进程编号(pid)就是1。其他所有进程都从它衍生,都是它的子进程。

确定运行级别
许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。
init进程的一大任务,就是去运行这些开机启动的程序。但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。

Linux预置七种init运行级别(0-6):
0:关机模式    (相当于poweroff)
1:单用户模式(破解root密码的方法:linux系统root密码遗忘的情况下的解决办法
2:无网络支持的多用户模式
3:有网络支持的多用户模式(也就是文本模式,工作中最常用的模式)
4:保留,未使用
5:有网络支持的X-windows支持多用户模式(也就是桌面图形模式)
6: 重新引导系统,即重启    (相当于reboot)

init进程首先读取文件 /etc/inittab,它是运行级别的设置文件。
如果打开它,可以看到第一行是这样的:
[[email protected] ~]# cat /etc/inittab 
....
id:3:initdefault:

initdefault的值是3,表明系统启动时的运行级别为3。如果需要指定其他级别,可以手动修改这个值。
那么,运行级别3有哪些什么程序呢,系统怎么知道每个级别应该加载哪些程序呢?
答案是每个运行级别在/etc目录下面,都有一个对应的子目录,指定要加载的程序。

  /etc/rc0.d
  /etc/rc1.d
  /etc/rc2.d
  /etc/rc3.d
  /etc/rc4.d
  /etc/rc5.d
  /etc/rc6.d

上面目录名中的"rc",表示run command(运行程序),最后的d表示directory(目录)。下面让我们看看 /etc/rc3.d 目录中到底指定了哪些程序。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

[[email protected] ~]# ll /etc/rc3.d/

total 0

lrwxrwxrwx. 1 root root 19 Aug 22 16:30 K10saslauthd -> ../init.d/saslauthd

lrwxrwxrwx. 1 root root 18 Aug 22 16:47 K15svnserve -> ../init.d/svnserve

lrwxrwxrwx. 1 root root 15 Aug 23 16:21 K25squid -> ../init.d/squid

lrwxrwxrwx. 1 root root 19 Dec 23 13:14 K45memcached -> ../init.d/memcached

lrwxrwxrwx. 1 root root 20 Aug 22 16:30 K50netconsole -> ../init.d/netconsole

lrwxrwxrwx. 1 root root 13 Dec 21 17:45 K60nfs -> ../init.d/nfs

lrwxrwxrwx. 1 root root 20 Dec 21 17:45 K69rpcsvcgssd -> ../init.d/rpcsvcgssd

lrwxrwxrwx. 1 root root 17 Nov 24 14:45 K75ntpdate -> ../init.d/ntpdate

lrwxrwxrwx. 1 root root 20 Aug 22 16:31 K87multipathd -> ../init.d/multipathd

lrwxrwxrwx. 1 root root 21 Aug 22 16:30 K87restorecond -> ../init.d/restorecond

lrwxrwxrwx. 1 root root 15 Aug 22 16:30 K89rdisc -> ../init.d/rdisc

lrwxrwxrwx. 1 root root 22 Aug 22 16:31 S02lvm2-monitor -> ../init.d/lvm2-monitor

lrwxrwxrwx. 1 root root 16 Aug 22 16:31 S07iscsid -> ../init.d/iscsid

lrwxrwxrwx. 1 root root 19 Aug 22 16:30 S08ip6tables -> ../init.d/ip6tables

lrwxrwxrwx. 1 root root 18 Aug 22 16:30 S08iptables -> ../init.d/iptables

lrwxrwxrwx. 1 root root 17 Aug 22 16:30 S10network -> ../init.d/network

lrwxrwxrwx. 1 root root 16 Aug 22 16:31 S11auditd -> ../init.d/auditd

lrwxrwxrwx. 1 root root 17 Aug 22 16:30 S12rsyslog -> ../init.d/rsyslog

lrwxrwxrwx. 1 root root 15 Dec 21 17:45 S13iscsi -> ../init.d/iscsi

lrwxrwxrwx. 1 root root 17 Dec 21 17:45 S13rpcbind -> ../init.d/rpcbind

lrwxrwxrwx. 1 root root 17 Dec 21 17:45 S14nfslock -> ../init.d/nfslock

lrwxrwxrwx. 1 root root 19 Aug 22 16:31 S15mdmonitor -> ../init.d/mdmonitor

lrwxrwxrwx. 1 root root 17 Dec 21 17:45 S19rpcgssd -> ../init.d/rpcgssd

lrwxrwxrwx. 1 root root 26 Aug 22 16:31 S25blk-availability -> ../init.d/blk-availability

lrwxrwxrwx. 1 root root 15 Aug 22 16:30 S25netfs -> ../init.d/netfs

lrwxrwxrwx. 1 root root 19 Aug 22 16:30 S26udev-post -> ../init.d/udev-post

lrwxrwxrwx. 1 root root 18 Oct 25 11:49 S50onealert -> ../init.d/onealert

lrwxrwxrwx. 1 root root 14 Aug 22 16:31 S55sshd -> ../init.d/sshd

lrwxrwxrwx. 1 root root 16 Oct 26 09:47 S56xinetd -> ../init.d/xinetd

lrwxrwxrwx. 1 root root 17 Aug 22 16:30 S80postfix -> ../init.d/postfix

lrwxrwxrwx. 1 root root 15 Aug 22 16:30 S90crond -> ../init.d/crond

lrwxrwxrwx. 1 root root 11 Aug 22 16:30 S99local -> ../rc.local

可以看到:
字母S表示Start,也就是启动的意思(启动脚本的运行参数为start)
如果这个位置是字母K,就代表Kill(关闭),即如果从其他运行级别切换过来,需要关闭的程序(启动脚本的运行参数为stop)。
后面的两位数字表示处理顺序,数字越小越早处理,所以第一个启动的程序是motd,然后是rpcbing、nfs......数字相同时,则按照程序名的字母顺序启动,所以rsyslog会先于sudo启动。
这个目录里的所有文件(除了README),就是启动时要加载的程序。如果想增加或删除某些程序,不建议手动修改 /etc/rcN.d 目录,最好是用一些专门命令进行管理(参考这里和这里)。

加载开机启动程序
前面提到,七种预设的"运行级别"各自有一个目录,存放需要开机启动的程序。不难想到,如果多个"运行级别"需要启动同一个程序,那么这个程序的启动脚本,就会在每一个目录里都有一个拷贝。这样会造成管理上的困扰:如果要修改启动脚本,岂不是每个目录都要改一遍?
Linux的解决办法,就是七个 /etc/rcN.d 目录里列出的程序,都设为链接文件,指向另外一个目录 /etc/init.d ,真正的启动脚本都统一放在这个目录中。init进程逐一加载开机启动程序,其实就是运行这个目录里的启动脚本。

下面就是链接文件真正的指向


1

2

[[email protected] ~]# ls -l /etc/rc3.d

lrwxrwxrwx. 1 root root 10 Aug 22 16:30 /etc/rc3.d -> rc.d/rc3.d

这样做的另一个好处,就是如果你要手动关闭或重启某个进程,直接到目录 /etc/init.d 中寻找启动脚本即可。
比如,我要重启iptables服务器,就运行下面的命令:
[[email protected] ~]# /etc/init.d/iptables restart

/etc/init.d 这个目录名最后一个字母d,是directory的意思,表示这是一个目录,用来与程序 /etc/init 区分。

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

一般来说,用户的登录方式有三种:命令行登录、ssh登录、图形界面登录。这三种情况,都有自己的方式对用户进行认证。
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。

Linuix默认的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等配置文件。

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窗口,都是如此。

原文地址:https://www.cnblogs.com/chengjian-physique/p/9803369.html

时间: 2024-08-29 03:34:25

linux启动流程梳理【转】的相关文章

记录Linux启动流程的工具bootchart

/*********************************************************************  * Author  : Samson  * Date    : 04/28/2014  * Test platform:  *              3.11.0-12-generic #19-Ubuntu  *              GNU bash, version 4.2.45  * ****************************

STB 参考Linux启动流程分析

STB启动流程 1. uboot启动(Fastboot启动) 硬件资源检测(如CPU,DDR Size,Nand  flash,mem size,flash size) print Version(如HW Version,Boot Version,Loader Version) boot设置模型的选择(autoboot or stop) 2. Starting kernel 各种接口驱动的启动() Creating 10 MTD partitions on “hinand” 网卡驱动,USB驱动

linux启动流程及自定义gurp

linux 启动流程 POST BIOS(boot sequence) 所选择的启动设备次序的MBR中是否有引导程序, ----> MBR(bootloader) 提供内核列表 ------->加载选定的Kernel,initrd(内存模拟的磁盘设备需要缓存),initramfs(缓存)  ---->获取到根文件系统并挂载,运行init bootloadler开始以后的挂载流程 1.当系统读取bootloader,挂载内核分区的时候,不识别更高级的磁盘分区上,只能放在基本磁盘分区,而且只

Linux启动流程详解【转载】

在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接管硬件以后,首先读入 /boot 目录下的内核文件. 我们查看一下,/boot 目录下面大概是这样一些文件: 第二步.启动初始化进程 内核文件加载以后,就开始运行第一个程序 /sbin/init,它的作用是初始化系统环境. 由于init是第一个运行的程序,它的进程编号(pid)就是1.其他所有进程都

Linux 启动流程学习

Linux 启动流程学习 开机自检(加载BIOS) 无论什么机器,在开机后都要进行通电自检(硬件),如果硬件有问题,则无法继续下去. (例如当内存条松动时或者损坏,就会发出嘀嘀嘀警报声).接着开始加载BIOS(Basic Input Output System BIOS是一个写入到主板上的一个软件程序.BIOS会去分析计算机里面有哪些存储设备, 从默认的第一启动项开始启动. MBR与boot loader 接下来BIOS将程序启动的下一步交给了MBR,他会去读取第一个扇区的MBR位置. 由于不同

Linux启动流程简介以及各启动阶段失败的恢复方法

透彻的了解Linux启动流程是非常关键的知识点,只有了解了这部分内容,才会在Linux出现系统级别的错误时能够非常冷静的面对以及快速的排错. Linux启动流程 第一阶段 BIOS不是操作系统的职责范围 BIOS是硬件的功能,属于firmware BIOS存储于ROM,不需要强电就可以实现数据保存 更改BIOS如启动顺序保存在一种特定的RAM中,为了保证断电后实际更改保存,通过BIOS上加电池来解决 在BIOS可以选择启动顺序(硬盘,光盘,网络等) 如果选择BIOS从硬盘启动,硬盘的必须是MBR

linux启动流程详解、破解root密码、添加服务脚本

1.Linux的组成 kernel+rootfs kernel:进程管理.内存管理.网络管理.安全管理.文件系统管理.驱动程序 rootfs:程序和glibc 库:函数集合,function,调用接口(头文件负责描述) 过程调用:procedure  ,无返回值 结果调用:function 程序:二进制文件 2.内核设计流派 单内核(monolithic kernel):Linux 把所有功能集成于同一个程序 微内核(micro kernel):Windows, Solaris 每种功能使用一个

24、Linux启动流程和grub详解

还记得Windows的启动流程吗?相信大家能说出来个大概,为什么说出个大概呢,因为Windows是图形界面启动的,但是开机过程都做了什么,你知道吗,相反,Linux启动的时候,会把这些加载到屏幕上面显示,那接下来我们来看看Linux启动都发生了些什么把!!! Linux启动流程图 简解开机启动流程 当用户打开电源后,BIOS开机自检,确定启动设备,安装启动设备启动设备上面安装的GRUB开始引导Linux,Linux首先先进行内核引导,通过跟切换,执行init程序,init程序确定启动级别,根据启

Linux启动流程讲解

要了解linux系统的启动流程,先要了解系统的组成 关于系统的组成:        内核+根文件系统组成 内核:由内核核心文件和模块文件组成            1.内核核心文件:一般位于/boot/目录下,命名为vmlinuz-VERSION(版本号)             2.模块文件:位于/lib/modules/VERSION/目录下,存放着内核的众多功能组件(如驱动)            3.initrd:位于/boot下,一般命名为initramfs-VERSION,此文件相当