内容:

1、CentOS 的启动流程

2、服务管理(chkconfig)

3、手动制定系统开机服务脚本


一、centos6系统启动流程

    综述过程:

        POST-->BIOS(Boot Sequence)-->MBR(grub,446)-->Kernel-->initramfs(虚根文件)-->(ROOTFS)/sbin/init(/etc/inittab)


    步骤详解:

    1、POST:

        POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测。

    2、BIOS:

        决定设备的启动顺序

    3、grub(bootloader)

        在centos5、6中,linux系统的MBR的bootloader是grub程序,windows的bootloader程序是    ntloader:

windows: ntloader,仅是启动OS

        Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核。

        由于linux的grub提供了丰富的功能,而MBR的bootloader仅仅446个字节,所以grub有分成了两个阶段,其中阶段二又有两部分(stage1_5,stage2):

    stage1:bootloader,446个字节,作用就是为了引导下一个阶段

    stage1_5:此阶段的文件在初次安装系统时生成,只要是boot分区的文件系统驱动程序,作用是为了加载boot分区


[19:13 [email protected]/etc/init.d]# ll /boot/grub/*5
-rw-r--r--. 1 root root 13428 Jul 20 02:24 /boot/grub/e2fs_stage1_5
-rw-r--r--. 1 root root 12636 Jul 20 02:24 /boot/grub/fat_stage1_5
-rw-r--r--. 1 root root 11780 Jul 20 02:24 /boot/grub/ffs_stage1_5
-rw-r--r--. 1 root root 11772 Jul 20 02:24 /boot/grub/iso9660_stage1_5
-rw-r--r--. 1 root root 13284 Jul 20 02:24 /boot/grub/jfs_stage1_5
-rw-r--r--. 1 root root 11972 Jul 20 02:24 /boot/grub/minix_stage1_5
-rw-r--r--. 1 root root 14428 Jul 20 02:24 /boot/grub/reiserfs_stage1_5
-rw-r--r--. 1 root root 12040 Jul 20 02:24 /boot/grub/ufs2_stage1_5
-rw-r--r--. 1 root root 11380 Jul 20 02:24 /boot/grub/vstafs_stage1_5
-rw-r--r--. 1 root root 13980 Jul 20 02:24 /boot/grub/xfs_stage1_5

    

        stage2:此阶段的作用是提供选择菜单(如果有多个内核系统),引导启动下一步的kernel内核启动和加载initramfs文件(作用是提供真正根分区的文件系统驱动程序,以便能加载根分区),其配置文件为/etc/grub.conf 


[19:16 [email protected]/etc/init.d]# cat /etc/grub.conf 
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-642.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=81d6eec4-2af7-4166-bfb6-092432abb4c0 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=128M  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-642.el6.x86_64.img
说明: 
default:设定默认启动菜单项,默认为0开始
timeout:选择启动内核的停留时间
splashp_w_picpath:启动的背景图片
hiddenmenu:隐藏选择菜单
title:启动时看到的选择内核的名称
root(hd0,0):第一块硬盘,第一个分区,根系统的分区位置
kernel:内核文件的路径,此时会把boot文件当跟文件,所以不需要写成/boot/PATH 
initrd:根分区文件系统的驱动程序路径

    由于在grub阶段只能进入了boot分区,所以kernel内核和initramfs文件都存在在boot分区


    4、kernel

        kernel内核阶段会把内核文件进行解压,初始化系统中各设备并做相关的配置工作,其中包括CPU、I/O、存储设备等。关于Linux的设备驱动程序的加载,有一部分驱动程序直接被编译进内核镜像中,另一部分驱动程序则是以模块的形式放在initrd(ramdisk)中。

        initramfs的作用前面已经说明,下一步就是加载真正的/根分区 


5、/sbin/init

        (1)进入根分区后,会运行第一个进程init,PID为1,/sbin/init进程是系统其他所有进程的父进程,当它接管了系统的控制权先之后,它首先会去读取/etc/inittab文件来执行相应的脚本进行系统初始化

[19:18 [email protected]/etc/init.d]# 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:



    运行级别:为系统运行或维护等目的而设定;0-6:7个级别

        0:关机

        1:单用户模式(root自动登录), single, 维护模式,该模式就是所谓的破解root密码

        2: 多用户模式,启动网络功能,但不会启动NFS;维护模式

        3:多用户模式,正常模式;文本界面

        4:预留级别;可同3级别

        5:多用户模式,正常模式;图形界面

        6:重启

        默认级别:3, 5

        切换级别:init#

        查看级别:runlevel; who -r

[20:20 [email protected]/etc/init.d]# runlevel 
N 5 #N表示上次运行的级别,5表示切换的本次的运行级别


    

        (2)运行/etc/rc.d/rc.sysinit脚本,此脚本的大概功能如下

(1) 设置主机名
(2) 设置欢迎信息
(3) 激活udev和selinux
(4) 挂载/etc/fstab文件中定义的文件系统
(5) 检测根文件系统,并以读写方式重新挂载根文件系统
(6) 设置系统时钟
(7) 激活swap设备
(8) 根据/etc/sysctl.conf文件设置内核参数
(9) 激活lvm及software raid设备
(10) 加载额外设备的驱动程序
(11) 清理操作



        (3)sysinit脚本执行完成,系统就可以顺利工作了,只是还需要启动系统所需要的各种服务,这样主机才可以提供相关的网络和主机功能,因此还会根据相应的运行级别,运行相应的系统服务。

执行/etc/rc.d/rc脚本。该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在/etc/rc.d/rc*.d(*=0~6)目录下,所有的文件均是指向/etc/init.d下相应文件的符号链接。rc.sysinit通过分析/etc/inittab文件来确定系统的启动级别,然后才去执行/etc/rc.d/rcN.d下的文件。

    

        以rc3.d为例:

         /etc/rc.d/rc3.d目录,该目录下的内容全部都是以 S 或 K 开头的链接文件,都链接到"/etc/rc.d/init.d"目录下的各种shell脚本。S表示的是启动时需要start的服务内容,K表示关机时需要关闭的服务内容,后面的数字代表优先次序。

[19:45 [email protected]/etc/init.d]# ll /etc/rc.d/rc3.d/
total 0
lrwxrwxrwx. 1 root root 16 Jul 20 02:20 K01smartd -> ../init.d/smartd
lrwxrwxrwx. 1 root root 17 Jul 20 02:18 K02oddjobd -> ../init.d/oddjobd
lrwxrwxrwx. 1 root root 17 Jul 20 02:22 K05wdaemon -> ../init.d/wdaemon
lrwxrwxrwx. 1 root root 16 Jul 20 02:21 K10psacct -> ../init.d/psacct
lrwxrwxrwx. 1 root root 19 Jul 20 02:18 K10saslauthd -> ../init.d/saslauthd
lrwxrwxrwx. 1 root root 22 Jul 20 02:18 K15htcacheclean -> ../init.d/htcacheclean
lrwxrwxrwx. 1 root root 15 Jul 20 02:18 K15httpd -> ../init.d/httpd
lrwxrwxrwx. 1 root root 18 Aug 26 19:04 K15svnserve -> ../init.d/svnserve
lrwxrwxrwx. 1 root root 24 Jul 20 02:20 K30spice-vdagentd -> ../init.d/spice-vdagentd
lrwxrwxrwx. 1 root root 16 Jul 20 02:18 K36mysqld -> ../init.d/mysqld
lrwxrwxrwx. 1 root root 17 Jul 20 02:17 K50dnsmasq -> ../init.d/dnsmasq
lrwxrwxrwx. 1 root root 13 Jul 20 02:16 K60nfs -> ../init.d/nfs
lrwxrwxrwx. 1 root root 18 Jul 20 02:20 K61nfs-rdma -> ../init.d/nfs-rdma
lrwxrwxrwx. 1 root root 20 Jul 20 02:16 K69rpcsvcgssd -> ../init.d/rpcsvcgssd
lrwxrwxrwx. 1 root root 17 Jul 20 02:16 K73winbind -> ../init.d/winbind
lrwxrwxrwx. 1 root root 14 Jul 20 03:15 K74ntpd -> ../init.d/ntpd
lrwxrwxrwx. 1 root root 17 Jul 20 02:17 K75ntpdate -> ../init.d/ntpdate
lrwxrwxrwx. 1 root root 19 Jul 20 02:20 K75quota_nld -> ../init.d/quota_nld
lrwxrwxrwx. 1 root root 16 Jul 20 02:17 K76ypbind -> ../init.d/ypbind
lrwxrwxrwx. 1 root root 24 Sep  1 17:09 K84NetworkManager -> ../init.d/NetworkManager
lrwxrwxrwx. 1 root root 24 Jul 20 02:17 K84wpa_supplicant -> ../init.d/wpa_supplicant
lrwxrwxrwx. 1 root root 21 Jul 20 02:15 K87restorecond -> ../init.d/restorecond
lrwxrwxrwx. 1 root root 14 Jul 20 02:16 K88sssd -> ../init.d/sssd
lrwxrwxrwx. 1 root root 20 Jul 20 02:15 K89netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 15 Jul 20 02:15 K89rdisc -> ../init.d/rdisc
lrwxrwxrwx. 1 root root 22 Jul 20 02:17 K92pppoe-server -> ../init.d/pppoe-server
lrwxrwxrwx. 1 root root 19 Jul 20 03:15 K95firstboot -> ../init.d/firstboot
lrwxrwxrwx. 1 root root 14 Jul 20 02:20 K95rdma -> ../init.d/rdma
lrwxrwxrwx. 1 root root 14 Jul 20 02:20 K99rngd -> ../init.d/rngd
lrwxrwxrwx. 1 root root 17 Jul 20 02:19 S01sysstat -> ../init.d/sysstat
lrwxrwxrwx. 1 root root 22 Jul 20 02:20 S02lvm2-monitor -> ../init.d/lvm2-monitor
lrwxrwxrwx. 1 root root 19 Jul 20 02:18 S08ip6tables -> ../init.d/ip6tables
lrwxrwxrwx. 1 root root 18 Jul 20 02:15 S08iptables -> ../init.d/iptables
lrwxrwxrwx. 1 root root 17 Jul 20 23:42 S10network -> ../init.d/network
lrwxrwxrwx. 1 root root 16 Jul 20 02:21 S11auditd -> ../init.d/auditd
lrwxrwxrwx. 1 root root 21 Jul 20 02:12 S11portreserve -> ../init.d/portreserve
lrwxrwxrwx. 1 root root 17 Jul 20 02:17 S12rsyslog -> ../init.d/rsyslog
lrwxrwxrwx. 1 root root 18 Jul 20 02:20 S13cpuspeed -> ../init.d/cpuspeed
lrwxrwxrwx. 1 root root 20 Jul 20 02:18 S13irqbalance -> ../init.d/irqbalance
lrwxrwxrwx. 1 root root 17 Jul 20 02:13 S13rpcbind -> ../init.d/rpcbind
lrwxrwxrwx. 1 root root 19 Jul 20 02:16 S15mdmonitor -> ../init.d/mdmonitor
lrwxrwxrwx. 1 root root 20 Jul 20 02:13 S22messagebus -> ../init.d/messagebus
lrwxrwxrwx. 1 root root 17 Jul 20 02:18 S24nfslock -> ../init.d/nfslock
lrwxrwxrwx. 1 root root 16 Jul 20 02:17 S24openct -> ../init.d/openct
lrwxrwxrwx. 1 root root 17 Jul 20 02:18 S24rpcgssd -> ../init.d/rpcgssd
lrwxrwxrwx. 1 root root 26 Jul 20 02:20 S25blk-availability -> ../init.d/blk-availability
lrwxrwxrwx. 1 root root 14 Jul 20 02:15 S25cups -> ../init.d/cups
lrwxrwxrwx. 1 root root 15 Jul 20 02:15 S25netfs -> ../init.d/netfs
lrwxrwxrwx. 1 root root 15 Jul 20 02:20 S26acpid -> ../init.d/acpid
lrwxrwxrwx. 1 root root 19 Jul 20 02:17 S26haldaemon -> ../init.d/haldaemon
lrwxrwxrwx. 1 root root 19 Jul 20 02:15 S26udev-post -> ../init.d/udev-post
lrwxrwxrwx. 1 root root 15 Jul 20 02:17 S27pcscd -> ../init.d/pcscd
lrwxrwxrwx. 1 root root 16 Jul 20 02:18 S28autofs -> ../init.d/autofs
lrwxrwxrwx. 1 root root 19 Jul 20 02:18 S50bluetooth -> ../init.d/bluetooth
lrwxrwxrwx. 1 root root 15 Jul 20 03:15 S50kdump -> ../init.d/kdump
lrwxrwxrwx. 1 root root 14 Jul 20 02:20 S55sshd -> ../init.d/sshd
lrwxrwxrwx. 1 root root 13 Aug 31 21:43 S80cmd -> ../init.d/cmd
lrwxrwxrwx. 1 root root 17 Jul 20 02:18 S80postfix -> ../init.d/postfix
lrwxrwxrwx. 1 root root 19 Jul 20 02:13 S82abrt-ccpp -> ../init.d/abrt-ccpp
lrwxrwxrwx. 1 root root 15 Jul 20 02:13 S82abrtd -> ../init.d/abrtd
lrwxrwxrwx. 1 root root 16 Sep  7 16:52 S88testrv -> ../init.d/testrv
lrwxrwxrwx. 1 root root 15 Jul 20 02:18 S90crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 13 Jul 20 02:17 S95atd -> ../init.d/atd
lrwxrwxrwx. 1 root root 20 Jul 20 02:18 S99certmonger -> ../init.d/certmonger
lrwxrwxrwx. 1 root root 11 Jul 20 02:15 S99local -> ../rc.local

        注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本

        所以不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中


    6、等待用户登录

        完成了系统服务的启动后,linux会启动终端或X-Window来等待用户登录,会执行"/sbin/mingetty",而且执行了6个,所以linux会有6个纯文本终端(tty1,tty2...),mingetty就是启动终端的命令。至此,系统就启动完毕了!

[19:51 [email protected]/etc/init.d]# cat /etc/init/tty.conf 
# tty - getty
#
# This service maintains a getty on the specified device.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file tty.override and put your changes there.
stop on runlevel [S016]
respawn
instance $TTY
exec /sbin/mingetty $TTY
usage 'tty TTY=/dev/ttyX  - where X is console id'


综述:POST --> Boot Sequence(BIOS) --> Boot Loader --> Kernel(ramdisk) --> rootfs--> switchroot--> /sbin/init-->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别--> 系统初始化脚本rc.sysinit--> 关闭或启动对应级别的服务--> 启动终端



        可参考下图(图片来自网络):

    linux系统启动流程(centos6)以及配置系统服务(chkconfig)_第1张图片



二、系统服务管理

        根据上面说明,我们可以知道,系统在启动后会根据想要的运行级别,运行相应的服务脚本,而这些系统服务的管理,可以用chkconfig来进行管理使用,这些服务脚本放置于/etc/rc.d/init.d中

    chkconfig:跟新和确认系统服务信息

        语法:chkconfig [--list] [--type type][name]:查看所有的服务列表详细信息

         chkconfig --add name :添加服务到系统服务

         chkconfig --del name:删除系统服务

         chkconfig --override name

         chkconfig [--level levels] [--type type] name

         chkconfig [--level levels] [--type type] name

 

[19:58 [email protected]/etc/init.d]# chkconfig --list
NetworkManager 0:off1:off2:off3:off4:off5:off6:off
abrt-ccpp      0:off1:off2:off3:on4:off5:on6:off
abrtd          0:off1:off2:off3:on4:off5:on6:off
acpid          0:off1:off2:on3:on4:on5:on6:off
atd            0:off1:off2:off3:on4:on5:on6:off
auditd         0:off1:off2:on3:on4:on5:on6:off
autofs         0:off1:off2:off3:on4:on5:on6:off
blk-availability0:off1:on2:on3:on4:on5:on6:off
bluetooth      0:off1:off2:off3:on4:on5:on6:off
certmonger     0:off1:off2:off3:on4:on5:on6:off
cmd            0:off1:off2:on3:on4:on5:on6:off
cpuspeed       0:off1:on2:on3:on4:on5:on6:off
crond          0:off1:off2:on3:on4:on5:on6:off
cups           0:off1:off2:on3:on4:on5:on6:off
dnsmasq        0:off1:off2:off3:off4:off5:off6:off
firstboot      0:off1:off2:off3:off4:off5:off6:off
haldaemon      0:off1:off2:off3:on4:on5:on6:off
htcacheclean   0:off1:off2:off3:off4:off5:off6:off
httpd          0:off1:off2:off3:off4:off5:off6:off
ip6tables      0:off1:off2:on3:on4:on5:on6:off
iptables       0:off1:off2:on3:on4:on5:on6:off
irqbalance     0:off1:off2:off3:on4:on5:on6:off
kdump          0:off1:off2:on3:on4:on5:on6:off
lvm2-monitor   0:off1:on2:on3:on4:on5:on6:off
mdmonitor      0:off1:off2:on3:on4:on5:on6:off
messagebus     0:off1:off2:on3:on4:on5:on6:off
mysqld         0:off1:off2:off3:off4:off5:off6:off
netconsole     0:off1:off2:off3:off4:off5:off6:off
netfs          0:off1:off2:off3:on4:on5:on6:off
network        0:off1:off2:on3:on4:on5:on6:off


    更多内容请关注我的博客。

三、手动配置系统启动服务


    1、系统服务脚本特点:基本都可以提供start|stop|restart|status这几个状态值的接收

    2、服务脚本存放位置

由上面的介绍可知,所有的系统服务脚本都放在/etc/rc.d/init.d文件夹中

[20:04 [email protected]/etc/init.d]# ls
abrt-ccpp         bluetooth   functions     kdump         netfs           oddjobd       rdisc        rsyslog         svnserve
abrtd             certmonger  haldaemon     killall       network         openct        rdma         sandbox         sysstat
abrt-oops         cmd         halt          lvm2-lvmetad  NetworkManager  pcscd         restorecond  saslauthd       udev-post
acpid             cpuspeed    htcacheclean  lvm2-monitor  nfs             portreserve   rngd         single          wdaemon
atd               crond       httpd         mdmonitor     nfslock         postfix       rpcbind      smartd          winbind
auditd            cups        ip6tables     messagebus    nfs-rdma        pppoe-server  rpcgssd      spice-vdagentd  wpa_supplicant
autofs            dnsmasq     iptables      mysqld        ntpd            psacct        rpcidmapd    sshd            ypbind
blk-availability  firstboot   irqbalance    netconsole    ntpdate         quota_nld     rpcsvcgssd   sssd


    3、服务脚本的编写格式

打开其中一个查看服务脚本的开头格式

[20:04 [email protected]/etc/init.d]# cat atd 
#!/bin/sh
#
# atd Starts/stop the "at" daemon
#
# chkconfig:   345 95 5
# description: Runs commands scheduled by the "at" command at the time \
#    specified when "at" was run, and runs batch commands when the load \
#    average is low enough.
### BEGIN INIT INFO
# Provides: atd at batch
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: 345
# Default-Stop: 95
# Short-Description: Starts/stop the "at" daemon
# Description:      Runs commands scheduled by the "at" command at the time 
#    specified when "at" was run, and runs batch commands when the load 
#    average is low enough.
### END INIT INFO

        其中,有三行格式是必须要写上的#!/bin/bash,#/chkconfig,#description

# chkconfig: runlevels SS KK【SS:表示开始运行的次序,KK:表示关闭程序的次序,-表示都不启动】  

       

         因此可以手动编写系统服务:

            (1)把服务脚本放置/etc/init.d目录下

            (2)使用chkconfig --add 添加到系统服务

            (3)重启系统让服务生效

[20:17 [email protected]/etc/init.d]# cat !$
cat testsrv
#!/bin/bash
#chkconfig 35 88 22
#description: test the system service
testsrv () {
case $1 in
start)
touch /var/lock/subsys/`basename $0` &> /dev/null
echo "start OK" ;;
stop)
rm -rf /var/lock/subsys/`basename $0`  &> /dev/null
echo "stop OK" ;;
restart)
rm -rf /var/lock/subsys/`basename $0`  &> /dev/null
touch /var/lock/subsys/`basename $0`  &> /dev/null
echo "restart OK" ;;
status)
[ -e /var/lock/subsys/`basename $0` ] && echo "is running" || echo "is stopping" ;;
esac
}
CHOICE=$1
! [[ "$CHOICE" =~ start|stop|restart|status ]] && echo "useage:start|stop|restart|status" && exit 100
testsrv $CHOICE
[20:20 [email protected]/etc/init.d]# chkconfig --add testsrv 
[20:20 [email protected]/etc/init.d]# chkconfig --list testsrv 
testsrv        0:off1:off2:off3:on4:off5:on6:off
[20:20 [email protected]/etc/init.d]# service testsrv status
is stopping
[20:20 [email protected]/etc/init.d]# service testsrv start
start OK
[20:20 [email protected]/etc/init.d]# service testsrv status
is running

更多内容请关注我的博客。