0x001 Team

Linux启动顺序

一、系统启动初始化init阶段

1. Grub加载内核之后,第一个运行的程序是 /sbin/init

init是SysVinit的一个实体进程,是系统所有进程的顶级父进程,PID是1

2. /sbin/init 读取 /etc/inittab文件,确定运行级别

etc/inittab文件的信息会包含以下信息给init程序

  • 捕获组合键的定义
  • 定义电源 fail/restore 脚本
  • 启动 getty 和虚拟控制台
  • 系统需要进入的 runlevel
    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
    [root@centos ~]# cat /etc/inittab
    # inittab is only used by upstart for the default runlevel.
    #
    # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
    #
    # System initialization is started by /etc/init/rcS.conf
    #
    # Individual runlevels are started by /etc/init/rc.conf
    #
    # Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
    #
    # Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
    # with configuration in /etc/sysconfig/init.
    #
    # For information on how to write upstart event handlers, or how
    # upstart works, see init(5), init(8), and initctl(8).
    #
    # Default runlevel. The runlevels used are:
    # 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:

当前系统使用有网络支持的多用户模式,字符终端,没有图形界面

Linux的运行等级设定如下:

1
2
3
4
5
6
7
0:关机
1:单用户模式
2:无网络支持的多用户模式
3:有网络支持的多用户模式
4:保留,未使用
5:有网络支持有X-Window支持的多用户模式
6:重新引导系统,即重启

3. /sbin/init 执行 /etc/rc.d/rc.sysinit脚本

sysinit的是系统启动的初始化脚本, 会做以下一些工作:

  • 激活 udev 和 selinux
  • 设置定义在/etc/sysctl.conf 中的内核参数
  • 设置系统时钟
  • 加载 keymaps
  • 使用交换分区
  • 设置主机名(hostname)
  • 根分区检查和 remount
  • 激活 RAID 和 LVM 设备
  • 开启磁盘配额
  • 检查并挂载所有文件系统
  • 清除过期的 locks 和 PID 文件

4. /sbin/init 执行 /etc/rc.d/rc脚本

/etc/rc脚本确定 /etc/inittab文件配置的运行级别ID(X)。

每个 runlevel X 都有一个这样的目录,目录名为/etc/rc.d/rcX.d。在这些目录下存放着很多不同的脚本。

文件名以 S (start) 开头的脚本就是启动时应该运行的脚本,S 后面跟的数字定义了这些脚本的执行顺序。

文件名以 K (kill) 开头的脚本表示启动的时候不执行的脚本。

在/etc/rc.d/rcX.d 目录下的脚本其实都是一些软链接文件,真实的脚本文件存放在/etc/init.d 目录下, 这个目录的文件通常被称为Linux服务启动脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@centos rc3.d]# pwd
/etc/rc3.d
[root@centos rc3.d]# ls -al
总用量 8
drwxr-xr-x. 2 root root 4096 11月 29 13:12 .
drwxr-xr-x. 10 root root 4096 1月 27 09:34 ..
lrwxrwxrwx. 1 root root 19 11月 29 12:49 K10saslauthd -> ../init.d/saslauthd
lrwxrwxrwx. 1 root root 17 11月 16 2015 K30postfix -> ../init.d/postfix
lrwxrwxrwx. 1 root root 20 11月 16 2015 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 21 11月 16 2015 K87restorecond -> ../init.d/restorecond
lrwxrwxrwx. 1 root root 15 11月 16 2015 K89rdisc -> ../init.d/rdisc
lrwxrwxrwx. 1 root root 19 11月 16 2015 K92ip6tables -> ../init.d/ip6tables
lrwxrwxrwx. 1 root root 18 11月 29 12:34 K92iptables -> ../init.d/iptables
lrwxrwxrwx. 1 root root 22 11月 16 2015 S02lvm2-monitor -> ../init.d/lvm2-monitor
lrwxrwxrwx. 1 root root 17 11月 16 2015 S10network -> ../init.d/network
lrwxrwxrwx. 1 root root 16 11月 16 2015 S11auditd -> ../init.d/auditd
lrwxrwxrwx. 1 root root 17 11月 16 2015 S12rsyslog -> ../init.d/rsyslog
lrwxrwxrwx. 1 root root 26 11月 16 2015 S25blk-availability -> ../init.d/blk-availability
lrwxrwxrwx. 1 root root 15 11月 16 2015 S25netfs -> ../init.d/netfs
lrwxrwxrwx. 1 root root 19 11月 16 2015 S26udev-post -> ../init.d/udev-post
lrwxrwxrwx. 1 root root 14 11月 26 08:19 S55sshd -> ../init.d/sshd
lrwxrwxrwx. 1 root root 15 11月 16 2015 S90crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 15 11月 29 13:12 S95jexec -> ../init.d/jexec
lrwxrwxrwx. 1 root root 11 11月 16 2015 S99local -> ../rc.local

chkconfig 名字就是对/etc/init.d/目录下的服务脚本进行管理的工具,实际上就是对 /etc/rcX.d/下的软链接文件的增删改。

5. /sbin/init 执行 /etc/rc.d/rc.local 脚本

rc.local 是 Linux 留给用户进行个性化设置的地方。比如放一些自定义的启动命令

6. 启动登录终端/sbin/mingetty,等待登录

mingetty 会启动 /bin/login进程,用来验证帐户密码,输入正确的账户密码之后,从/etc/passwd的账户配置里面启动响应的shell,例如下面root帐户使用了bash

1
2
3
4
5
6
7
8
9
10
[root@centos ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

二、用户登录阶段

7. 用户登录后先执行 /etc/profile

这个文件是所有用户登录系统后的设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置

紧接着profile文件里面去启动 /etc/profile.d 下的所有文件

8. 执行 ~/.bash_profile

这个文件是用户专属的bash shell初始化脚本
当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量
~/.bash_profile会判断 ~/.bashrc文件是否存在并执行,~/.bashrc会判断/etc/bashrc文件是否存在并执行,最后设置PATH环境变量,结束。
所以~/.bashrc和/etc/bashrc都是层层嵌套执行的。

9. 执行 ~/.bashrc

这个文件是用户专属的bash shell初始化脚本

当登录时以及每次打开新的shell时,该文件被执行
~/.bashrc 会判断 /etc/bashrc文件是否存在并执行

10. 执行 /etc/bashrc

这个文件是bash环境的全局文件。几乎默认存在,每个登录的用户上去之后都要初始化一下bash的环境。

当bash shell被打开时,该文件被执行(即每次新开一个终端,都会执行bashrc)