ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

52.第十二章 Linux启动和内核管理 -- CentOS 的启动管理(一)

2021-11-22 12:02:28  阅读:688  来源: 互联网

标签:off CentOS 启动 -- etc init rc fi root


第十二章 Linux启动和内核管理

内容概述

  • CentOS 6 之前版本的启动流程
  • 服务管理
  • Grub管理
  • 启动排错
  • 内核管理
  • CentOS 7 以后版本启动流程
  • Unit介绍
  • 服务管理和查看
  • 启动排错
  • 破解root口令
  • 修复Grub2

1.CentOS 6 的启动管理

1.1 Linux 组成

  • kernel 实现进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能等功能

  • rootfs 包括程序和 glibc 库
    程序:二进制执行文件

    库:函数集合, function, 调用接口(头文件负责描述)

1.2 内核设计流派

  • 宏内核(monolithic kernel):又称单内核和强内核,Unix,Linux

    把所有系统服务都放到内核里,所有功能集成于同一个程序,分层实现不同功能,系统庞大复杂,Linux其实在单内核内核实现了模块化,也就相当于吸收了微内核的优点

  • 微内核(micro kernel):Windows,Solaris,HarmonyOS

    简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护,每种功能使用一个单独子系统实现,将内核功能移到用户空间,性能差

1.3 CentOS 6 启动流程

1.3.1 CentOS 6 启动流程

在这里插入图片描述

  1. 加载BIOS的硬件信息,获取第一个启动设备
  2. 读取第一个启动设备MBR的引导加载程序(grub)的启动信息
  3. 加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
  4. 核心执行init程序,并获取默认的运行信息
  5. init程序执行/etc/rc.d/rc.sysinit文件,重新挂载根文件系统
  6. 启动核心的外挂模块
  7. init执行运行的各个批处理文件(scripts)
  8. init执行/etc/rc.d/rc.local
  9. 执行/bin/login程序,等待用户登录
  10. 登录之后开始以Shell控制主机

1.3.2 硬件启动POST

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

主板的ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等

主板的RAM:CMOS互补金属氧化物半导体,保存各项参数的设定,按次序查找引导设备,第一个有引导程序的设备为本次启动设备

1.3.3 启动加载器 bootloader

1.3.3.1 grub 功能和组成

bootloader: 引导加载器,引导程序

  • windows: ntloader,仅是启动OS
  • Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核Linux的bootloader
  • LILO:LInux LOader,早期的bootloader,功能单一
  • GRUB: GRand Unified Bootloader, CentOS 6 GRUB 0.97: GRUB Legacy, CentOS 7 以后使用GRUB 2.02

GRUB 启动阶段

  • primary boot loader :

    1st stage:MBR的前446个字节

    1.5 stage:mbr 之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统

  • secondary boot loader :2nd stage,分区文件/boot/grub/

范例:

[root@centos6 ~]# hexdump -C -n 512 /dev/sda
00000000  eb 48 90 00 00 00 00 00  00 00 00 00 00 00 00 00  |.H..............|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 03 02  |................|
00000040  ff 00 00 20 01 00 00 00  00 02 fa 90 90 f6 c2 80  |... ............|
00000050  75 02 b2 80 ea 59 7c 00  00 31 c0 8e d8 8e d0 bc  |u....Y|..1......|
00000060  00 20 fb a0 40 7c 3c ff  74 02 88 c2 52 f6 c2 80  |. ..@|<.t...R...|
00000070  74 54 b4 41 bb aa 55 cd  13 5a 52 72 49 81 fb 55  |tT.A..U..ZRrI..U|
00000080  aa 75 43 a0 41 7c 84 c0  75 05 83 e1 01 74 37 66  |.uC.A|..u....t7f|
00000090  8b 4c 10 be 05 7c c6 44  ff 01 66 8b 1e 44 7c c7  |.L...|.D..f..D|.|
000000a0  04 10 00 c7 44 02 01 00  66 89 5c 08 c7 44 06 00  |....D...f.\..D..|
000000b0  70 66 31 c0 89 44 04 66  89 44 0c b4 42 cd 13 72  |pf1..D.f.D..B..r|
000000c0  05 bb 00 70 eb 7d b4 08  cd 13 73 0a f6 c2 80 0f  |...p.}....s.....|
000000d0  84 f0 00 e9 8d 00 be 05  7c c6 44 ff 00 66 31 c0  |........|.D..f1.|
000000e0  88 f0 40 66 89 44 04 31  d2 88 ca c1 e2 02 88 e8  |..@f.D.1........|
000000f0  88 f4 40 89 44 08 31 c0  88 d0 c0 e8 02 66 89 04  |..@.D.1......f..|
00000100  66 a1 44 7c 66 31 d2 66  f7 34 88 54 0a 66 31 d2  |f.D|f1.f.4.T.f1.|
00000110  66 f7 74 04 88 54 0b 89  44 0c 3b 44 08 7d 3c 8a  |f.t..T..D.;D.}<.|
00000120  54 0d c0 e2 06 8a 4c 0a  fe c1 08 d1 8a 6c 0c 5a  |T.....L......l.Z|
00000130  8a 74 0b bb 00 70 8e c3  31 db b8 01 02 cd 13 72  |.t...p..1......r|
00000140  2a 8c c3 8e 06 48 7c 60  1e b9 00 01 8e db 31 f6  |*....H|`......1.|
00000150  31 ff fc f3 a5 1f 61 ff  26 42 7c be 7f 7d e8 40  |1.....a.&B|..}.@|
00000160  00 eb 0e be 84 7d e8 38  00 eb 06 be 8e 7d e8 30  |.....}.8.....}.0|
00000170  00 be 93 7d e8 2a 00 eb  fe 47 52 55 42 20 00 47  |...}.*...GRUB .G|
00000180  65 6f 6d 00 48 61 72 64  20 44 69 73 6b 00 52 65  |eom.Hard Disk.Re|
00000190  61 64 00 20 45 72 72 6f  72 00 bb 01 00 b4 0e cd  |ad. Error.......|
000001a0  10 ac 3c 00 75 f4 c3 00  00 00 00 00 00 00 00 00  |..<.u...........|
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 80 20  |............... |
000001c0  21 00 83 aa 28 82 00 08  00 00 00 00 20 00 00 aa  |!...(....... ...|
000001d0  29 82 83 fe ff ff 00 08  20 00 00 80 3c 0c 00 fe  |)....... ...<...|
000001e0  ff ff 83 fe ff ff 00 88  5c 0c 00 00 40 06 00 fe  |........\...@...|
000001f0  ff ff 05 fe ff ff 00 88  9c 12 00 78 63 06 55 aa  |...........xc.U.|
00000200
[root@centos6 ~]# hexdump -C -n 512 -v /dev/sda
00000000  eb 48 90 00 00 00 00 00  00 00 00 00 00 00 00 00  |.H..............|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 03 02  |................|
00000040  ff 00 00 20 01 00 00 00  00 02 fa 90 90 f6 c2 80  |... ............|
00000050  75 02 b2 80 ea 59 7c 00  00 31 c0 8e d8 8e d0 bc  |u....Y|..1......|
00000060  00 20 fb a0 40 7c 3c ff  74 02 88 c2 52 f6 c2 80  |. ..@|<.t...R...|
00000070  74 54 b4 41 bb aa 55 cd  13 5a 52 72 49 81 fb 55  |tT.A..U..ZRrI..U|
00000080  aa 75 43 a0 41 7c 84 c0  75 05 83 e1 01 74 37 66  |.uC.A|..u....t7f|
00000090  8b 4c 10 be 05 7c c6 44  ff 01 66 8b 1e 44 7c c7  |.L...|.D..f..D|.|
000000a0  04 10 00 c7 44 02 01 00  66 89 5c 08 c7 44 06 00  |....D...f.\..D..|
000000b0  70 66 31 c0 89 44 04 66  89 44 0c b4 42 cd 13 72  |pf1..D.f.D..B..r|
000000c0  05 bb 00 70 eb 7d b4 08  cd 13 73 0a f6 c2 80 0f  |...p.}....s.....|
000000d0  84 f0 00 e9 8d 00 be 05  7c c6 44 ff 00 66 31 c0  |........|.D..f1.|
000000e0  88 f0 40 66 89 44 04 31  d2 88 ca c1 e2 02 88 e8  |..@f.D.1........|
000000f0  88 f4 40 89 44 08 31 c0  88 d0 c0 e8 02 66 89 04  |..@.D.1......f..|
00000100  66 a1 44 7c 66 31 d2 66  f7 34 88 54 0a 66 31 d2  |f.D|f1.f.4.T.f1.|
00000110  66 f7 74 04 88 54 0b 89  44 0c 3b 44 08 7d 3c 8a  |f.t..T..D.;D.}<.|
00000120  54 0d c0 e2 06 8a 4c 0a  fe c1 08 d1 8a 6c 0c 5a  |T.....L......l.Z|
00000130  8a 74 0b bb 00 70 8e c3  31 db b8 01 02 cd 13 72  |.t...p..1......r|
00000140  2a 8c c3 8e 06 48 7c 60  1e b9 00 01 8e db 31 f6  |*....H|`......1.|
00000150  31 ff fc f3 a5 1f 61 ff  26 42 7c be 7f 7d e8 40  |1.....a.&B|..}.@|
00000160  00 eb 0e be 84 7d e8 38  00 eb 06 be 8e 7d e8 30  |.....}.8.....}.0|
00000170  00 be 93 7d e8 2a 00 eb  fe 47 52 55 42 20 00 47  |...}.*...GRUB .G|
00000180  65 6f 6d 00 48 61 72 64  20 44 69 73 6b 00 52 65  |eom.Hard Disk.Re|
00000190  61 64 00 20 45 72 72 6f  72 00 bb 01 00 b4 0e cd  |ad. Error.......|
000001a0  10 ac 3c 00 75 f4 c3 00  00 00 00 00 00 00 00 00  |..<.u...........|
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 80 20  |............... |
000001c0  21 00 83 aa 28 82 00 08  00 00 00 00 20 00 00 aa  |!...(....... ...|
000001d0  29 82 83 fe ff ff 00 08  20 00 00 80 3c 0c 00 fe  |)....... ...<...|
000001e0  ff ff 83 fe ff ff 00 88  5c 0c 00 00 40 06 00 fe  |........\...@...|
000001f0  ff ff 05 fe ff ff 00 88  9c 12 00 78 63 06 55 aa  |...........xc.U.|
00000200

[root@centos6 ~]# df -Th
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/sda2      ext4    97G  908M   91G   1% /
tmpfs          tmpfs  490M     0  490M   0% /dev/shm
/dev/sda1      ext4   976M   31M  895M   4% /boot
/dev/sda3      ext4    50G   74M   47G   1% /data

[root@centos6 ~]# modinfo ext4
filename:       /lib/modules/2.6.32-754.el6.x86_64/kernel/fs/ext4/ext4.ko
license:        GPL
description:    Fourth Extended Filesystem
author:         Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others
retpoline:      Y
srcversion:     3C0D8A8996992A22750E504
depends:        mbcache,jbd2
vermagic:       2.6.32-754.el6.x86_64 SMP mod_unload modversions 

[root@centos6 ~]# ll -h /lib/modules/2.6.32-754.el6.x86_64/kernel/fs/ext4/ext4.ko
-rwxr--r--. 1 root root 636K Jun 20  2018 /lib/modules/2.6.32-754.el6.x86_64/kernel/fs/ext4/ext4.ko

[root@centos6 ~]# fdisk -l

Disk /dev/sda: 214.7 GB, 214748364800 bytes
255 heads, 63 sectors/track, 26108 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0008a04f

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         131     1048576   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2             131       12910   102645760   83  Linux
/dev/sda3           12910       19437    52428800   83  Linux
/dev/sda4           19437       26109    53591040    5  Extended
/dev/sda5           19437       19698     2097152   82  Linux swap / Solaris

[root@centos7 ~]# fdisk -l

Disk /dev/sda: 214.7 GB, 214748364800 bytes, 419430400 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000b65a1

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200   211814399   104857600   83  Linux
/dev/sda3       211814400   316671999    52428800   83  Linux
/dev/sda4       316672000   419430399    51379200    5  Extended
/dev/sda5       316674048   320868351     2097152   82  Linux swap / Solaris

[root@centos6 ~]# ls /boot
config-2.6.32-754.el6.x86_64  grub                                 lost+found                        System.map-2.6.32-754.el6.x86_64
efi                           initramfs-2.6.32-754.el6.x86_64.img  symvers-2.6.32-754.el6.x86_64.gz  vmlinuz-2.6.32-754.el6.x86_64

[root@centos6 ~]# ls /boot/grub/
device.map     fat_stage1_5  grub.conf         jfs_stage1_5  minix_stage1_5     splash.xpm.gz  stage2         vstafs_stage1_5
e2fs_stage1_5  ffs_stage1_5  iso9660_stage1_5  menu.lst      reiserfs_stage1_5  stage1         ufs2_stage1_5  xfs_stage1_5

[root@centos6 ~]# cat /boot/grub/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
splashimage=(hd0,0)/grub/splash.xpm.gz #加载图片
hiddenmenu
title CentOS 6 (2.6.32-754.el6.x86_64) #菜单
	root (hd0,0)
	kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=UUID=f26b3084-878f-4218-a7df-0eedd8cb79af rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
	initrd /initramfs-2.6.32-754.el6.x86_64.img
#/vmlinuz-2.6.32-754.el6.x86_64  内核     root=UUID=55ed4e69-a262-485e-a2c8-9df9ac044aec  / 根分区UUID     initrd /initramfs-2.6.32-754.el6.x86_64.img  驱动文件

[root@centos6 ~]# blkid
/dev/sda1: UUID="07ff813e-74af-4047-88ad-c402b397fd1c" TYPE="ext4" 
/dev/sda2: UUID="f26b3084-878f-4218-a7df-0eedd8cb79af" TYPE="ext4" 
/dev/sda3: UUID="c8cea348-2536-46ae-9b3b-fe0543fbdc13" TYPE="ext4" 
/dev/sda5: UUID="66c77c3c-e56c-4df2-90fd-08150563b747" TYPE="swap"

[root@centos6 ~]# ls /boot
config-2.6.32-754.el6.x86_64  grub                                 lost+found                        System.map-2.6.32-754.el6.x86_64
efi                           initramfs-2.6.32-754.el6.x86_64.img  symvers-2.6.32-754.el6.x86_64.gz  vmlinuz-2.6.32-754.el6.x86_64
# initramfs-2.6.32-754.el6.x86_64.img  驱动文件    vmlinuz-2.6.32-754.el6.x86_64 内核文件

[root@centos6 ~]# file /boot/initramfs-2.6.32-754.el6.x86_64.img
/boot/initramfs-2.6.32-754.el6.x86_64.img: gzip compressed data, from Unix, last modified: Wed Oct  6 23:46:51 2021, max compression

[root@centos6 ~]# cp /boot/initramfs-2.6.32-754.el6.x86_64.img /data
cp: overwrite `/data/initramfs-2.6.32-754.el6.x86_64.img'? y
[root@centos6 ~]# cd /data
[root@centos6 data]# ls
initramfs-2.6.32-754.el6.x86_64.img  lost+found

[root@centos6 data]# mv initramfs-2.6.32-754.el6.x86_64.img initramfs-2.6.32-754.el6.x86_64.img.gz
[root@centos6 data]# gzip -d initramfs-2.6.32-754.el6.x86_64.img.gz

[root@centos6 data]# ls
initramfs-2.6.32-754.el6.x86_64.img  lost+found
[root@centos6 data]# ll -h initramfs-2.6.32-754.el6.x86_64.img 
-rw------- 1 root root 61M Nov  5 20:13 initramfs-2.6.32-754.el6.x86_64.img

[root@centos6 data]# ll /boot/initramfs-2.6.32-754.el6.x86_64.img -h
-rw-------. 1 root root 22M Nov  4 22:57 /boot/initramfs-2.6.32-754.el6.x86_64.img

[root@centos6 data]# file initramfs-2.6.32-754.el6.x86_64.img 
initramfs-2.6.32-754.el6.x86_64.img: ASCII cpio archive (SVR4 with no CRC)

[root@centos6 data]# cpio -id < initramfs-2.6.32-754.el6.x86_64.img 
123797 blocks
[root@centos6 data]# ls
bin      dracut-004-411.el6  init                initqueue-settled                    lib         mount      pre-pivot    proc  sysroot  var
cmdline  emergency           initqueue           initqueue-timeout                    lib64       netroot    pre-trigger  sbin  tmp
dev      etc                 initqueue-finished  initramfs-2.6.32-754.el6.x86_64.img  lost+found  pre-mount  pre-udev     sys   usr

[root@centos6 data]# find -name ext4.ko
./lib/modules/2.6.32-754.el6.x86_64/kernel/fs/ext4/ext4.ko

1.3.3.2 CentOS 6 grub 安装

安装 grub 两种方式

方法1: grub-install 安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到DIR/boot目录下

grub-install --root-directory=DIR /dev/DISK

方法2 : grub命令

#grub
grub> root (hd#,#)
grub> setup (hd#)

范例:修复grub的第1阶段故障

[root@centos6 ~]# hexdump -C -n 512 /dev/sda
00000000  eb 48 90 10 8e d0 bc 00  b0 b8 00 00 8e d8 8e c0  |.H..............|
00000010  fb be 00 7c bf 00 06 b9  00 02 f3 a4 ea 21 06 00  |...|.........!..|
00000020  00 be be 07 38 04 75 0b  83 c6 10 81 fe fe 07 75  |....8.u........u|
00000030  f3 eb 16 b4 02 b0 01 bb  00 7c b2 80 8a 74 03 02  |.........|...t..|
00000040  80 00 00 80 30 f2 04 00  00 08 fa 90 90 f6 c2 80  |....0...........|
00000050  75 02 b2 80 ea 59 7c 00  00 31 c0 8e d8 8e d0 bc  |u....Y|..1......|
00000060  00 20 fb a0 40 7c 3c ff  74 02 88 c2 52 f6 c2 80  |. ..@|<.t...R...|
00000070  74 54 b4 41 bb aa 55 cd  13 5a 52 72 49 81 fb 55  |tT.A..U..ZRrI..U|
00000080  aa 75 43 a0 41 7c 84 c0  75 05 83 e1 01 74 37 66  |.uC.A|..u....t7f|
00000090  8b 4c 10 be 05 7c c6 44  ff 01 66 8b 1e 44 7c c7  |.L...|.D..f..D|.|
000000a0  04 10 00 c7 44 02 01 00  66 89 5c 08 c7 44 06 00  |....D...f.\..D..|
000000b0  70 66 31 c0 89 44 04 66  89 44 0c b4 42 cd 13 72  |pf1..D.f.D..B..r|
000000c0  05 bb 00 70 eb 7d b4 08  cd 13 73 0a f6 c2 80 0f  |...p.}....s.....|
000000d0  84 f0 00 e9 8d 00 be 05  7c c6 44 ff 00 66 31 c0  |........|.D..f1.|
000000e0  88 f0 40 66 89 44 04 31  d2 88 ca c1 e2 02 88 e8  |..@f.D.1........|
000000f0  88 f4 40 89 44 08 31 c0  88 d0 c0 e8 02 66 89 04  |..@.D.1......f..|
00000100  66 a1 44 7c 66 31 d2 66  f7 34 88 54 0a 66 31 d2  |f.D|f1.f.4.T.f1.|
00000110  66 f7 74 04 88 54 0b 89  44 0c 3b 44 08 7d 3c 8a  |f.t..T..D.;D.}<.|
00000120  54 0d c0 e2 06 8a 4c 0a  fe c1 08 d1 8a 6c 0c 5a  |T.....L......l.Z|
00000130  8a 74 0b bb 00 70 8e c3  31 db b8 01 02 cd 13 72  |.t...p..1......r|
00000140  2a 8c c3 8e 06 48 7c 60  1e b9 00 01 8e db 31 f6  |*....H|`......1.|
00000150  31 ff fc f3 a5 1f 61 ff  26 42 7c be 7f 7d e8 40  |1.....a.&B|..}.@|
00000160  00 eb 0e be 84 7d e8 38  00 eb 06 be 8e 7d e8 30  |.....}.8.....}.0|
00000170  00 be 93 7d e8 2a 00 eb  fe 47 52 55 42 20 00 47  |...}.*...GRUB .G|
00000180  65 6f 6d 00 48 61 72 64  20 44 69 73 6b 00 52 65  |eom.Hard Disk.Re|
00000190  61 64 00 20 45 72 72 6f  72 00 bb 01 00 b4 0e cd  |ad. Error.......|
000001a0  10 ac 3c 00 75 f4 c3 00  00 00 00 00 00 00 00 00  |..<.u...........|
000001b0  00 00 00 00 00 00 00 00  4f a0 08 00 00 00 80 20  |........O...... |
000001c0  21 00 83 aa 28 82 00 08  00 00 00 00 20 00 00 aa  |!...(....... ...|
000001d0  29 82 83 fe ff ff 00 08  20 00 00 80 3c 0c 00 fe  |)....... ...<...|
000001e0  ff ff 83 fe ff ff 00 88  5c 0c 00 00 40 06 00 fe  |........\...@...|
000001f0  ff ff 05 fe ff ff 00 88  9c 12 00 78 63 06 55 aa  |...........xc.U.|
00000200

#破坏grub第1阶段
[[root@centos6 ~]# dd if=/dev/zero of=/dev/sda bs=1 count=446
446+0 records in
446+0 records out
446 bytes (446 B) copied, 0.000782486 s, 570 kB/s
[root@centos6 ~]# hexdump -C -n 512 /dev/sda
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 80 20  |............... |
000001c0  21 00 83 aa 28 82 00 08  00 00 00 00 20 00 00 aa  |!...(....... ...|
000001d0  29 82 83 fe ff ff 00 08  20 00 00 80 3c 0c 00 fe  |)....... ...<...|
000001e0  ff ff 83 fe ff ff 00 88  5c 0c 00 00 40 06 00 fe  |........\...@...|
000001f0  ff ff 05 fe ff ff 00 88  9c 12 00 78 63 06 55 aa  |...........xc.U.|
00000200

[root@centos6 ~]# hexdump -C -n 512 -v /dev/sda
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000080  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000090  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000000a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000000b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000000c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000000d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000000e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000000f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000100  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000110  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000120  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000130  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000140  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000150  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000160  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000170  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000180  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000190  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 80 20  |............... |
000001c0  21 00 83 aa 28 82 00 08  00 00 00 00 20 00 00 aa  |!...(....... ...|
000001d0  29 82 83 fe ff ff 00 08  20 00 00 80 3c 0c 00 fe  |)....... ...<...|
000001e0  ff ff 83 fe ff ff 00 88  5c 0c 00 00 40 06 00 fe  |........\...@...|
000001f0  ff ff 05 fe ff ff 00 88  9c 12 00 78 63 06 55 aa  |...........xc.U.|
00000200
#前446字节被清空

[root@centos6 ~]# reboot

在这里插入图片描述
一阶段被破坏,系统认为硬盘不能启动,自动从光盘启动

在这里插入图片描述
语言

在这里插入图片描述
键盘布局

在这里插入图片描述
网络不配置

在这里插入图片描述
Continue

在这里插入图片描述
/ 根分区被挂载到/mnt/sysimage

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

光盘启动,进入rescue模式
#chroot /mnt/sysimage  #切到根目录
#grub-install /dev/sda  #修复前446字节 
#sync #存盘
#exit #退出
#reboot #重启

在这里插入图片描述
系统可以正常启动

范例:

[root@centos6 ~]# grub
Probing devices to guess BIOS drives. This may take a long time.


    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> root (hd0,0)
root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  27 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> quit
quit

1.3.3.3 grub legacy 管理

配置文件:/boot/grub/grub.conf <-- /etc/grub.conf

stage2及内核等通常放置于一个基本磁盘分区

grub legacy 功用:

(1) 提供启动菜单、并提供交互式接口

​ a:内核参数

​ e:编辑模式,用于编辑菜单

​ c:命令模式,交互式接口

(2) 加载用户选择的内核或操作系统

​ 允许传递参数给内核

​ 可隐藏启动菜单

(3) 为菜单提供了保护机制

​ 为编辑启动菜单进行认证

​ 为启用内核或操作系统进行认证

grub的命令行接口

help: 获取帮助列表
help KEYWORD: 详细帮助信息
find (hd#,#)/PATH/TO/SOMEFILE:
root (hd#,#)
kernel /PATH/TO/KERNEL_FILE: 设定本次启动的内核文件;额外还可添加许多内核支持使用的
cmdline参数

例如:max_loop=100 selinux=0 init=/path/to/init
initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk
boot: 引导启动选定的内核

cat /proc/cmdline 内核参数

内核参数文档:

/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt

grub legacy识别硬盘设备

(hd#,#)
hd#: 磁盘编号,用数字表示;从0开始编号
#: 分区编号,用数字表示; 从0开始编号

示例:
(hd0,0) 第一块硬盘,第一个分区

手动在grub命令行接口启动系统

grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot

grub legacy配置文件:/boot/grub/grub.conf

default=#: 设定默认启动的菜单项;落单项(title)编号从0开始
timeout=#:指定菜单项等待选项选择的时长
splashimage=(hd#,#)/PATH/XPM_FILE:菜单背景图片文件路径
password [--md5| --encrypt] STRING: 启动菜单编辑认证
hiddenmenu:隐藏菜单
title TITLE:定义菜单项“标题”, 可出现多次
root (hd#,#):查找stage2及kernel文件所在设备分区;为grub的根
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件
password [--md5|--encrypted ] STRING: 启动选定的内核或操作系统时进行认证

grub加密生成grub口令

grub-md5-crypt
grub-crypt

破解root口令:

(1) 编辑grub菜单(选定要编辑的title,而后使用a 或 e 命令)
(2) 在选定的kernel后附加1, s, S,single 都可以进入单用户模式
(3) 在kernel所在行,键入“b”命令

范例:破解CentOS 6 root密码

在这里插入图片描述
按ESC,进入菜单选择,按a

在这里插入图片描述
在最后输入1,表示临时进入1模式,单用户模式

在这里插入图片描述

#不用密码直接进来了,passwd 直接修改密码
# passwd root

# init 3 #进入3模式

输入新密码 直接登录

范例: 给grub 添加密码,防止破解root密码

[root@centos6 ~]# grub-crypt
Password: 
Retype password: 
$6$dd3QxTQiLvVTxITw$HGyYnMmaFsMA98nYgs8bDaccnw716Bm8i/toQeDRJFcYQ5L7hYdD7OKGTx30fsX9GFr7AGsByFj0SzHbZIAJY/
#设置grub生成密码

[root@centos6 ~]# vim /boot/grub/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
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
password --encrypt $6$dd3QxTQiLvVTxITw$HGyYnMmaFsMA98nYgs8bDaccnw716Bm8i/toQeDRJFcYQ5L7hYdD7OKGTx30fsX9GFr7AGsByFj0SzHbZIAJY/ #在这里设置grub密码
title CentOS 6 (2.6.32-754.el6.x86_64)
	root (hd0,0)
	kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=UUID=f26b3084-878f-4218-a7df-0eedd8cb79af rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
	initrd /initramfs-2.6.32-754.el6.x86_64.img

[root@centos6 ~]# reboot

在这里插入图片描述
按ESC,进入菜单选择,按p

在这里插入图片描述
输入密码

在这里插入图片描述
只有输入密码才可以进到这里

忘记grub密码,直接去vim /boot/grub/grub.conf文件,把password --encrypt $6$dd3QxTQiLvVTxITw$HGyYnMmaFsMA98nYgs8bDaccnw716Bm8i/toQeDRJFcYQ5L7hYdD7OKGTx30fsX9GFr7AGsByFj0SzHbZIAJY/
这行删除就没有grub密码了

范例:生成背景图片

[root@centos6 ~]# convert -resize 640x480 -colors 14 winner.png splash.xpm
[root@centos6 ~]# more splash.xpm

#生成splash.xpm.gz
[root@centos6 ~]# gzip splash.xpm
[root@centos6 ~]# mv splash.xpm.gz /boot/grub

1.3. 加载 kernel

在这里插入图片描述
kernel 自身初始化过程

  1. 探测可识别到的所有硬件设备
  2. 加载硬件驱动程序(借助于ramdisk加载驱动)
  3. 以只读方式挂载根文件系统
  4. 运行用户空间的第一个应用程序:/sbin/init

Linux内核特点:

  • 支持模块化:.ko(内核对象),如:文件系统,硬件驱动,网络协议等
  • 支持内核模块的动态装载和卸载

内核组成部分:

  • 核心文件:/boot/vmlinuz-VERSION-release

    ramdisk:辅助的伪根系统,加载相应的硬件驱动,ramdisk --> ramfs 提高速度

    CentOS 5 /boot/initrd-VERSION-release.img

    CentOS 6 以后版本 /boot/initramfs-VERSION-release.img

  • 模块文件:/lib/modules/VERSION-release

范例:误删除内核文件/boot/vmlinuz-2.6.32-754.el6.x86_64无法启动,故障恢复

[root@centos6 ~]# rm -f /boot/vmlinuz-2.6.32-754.el6.x86_64
[root@centos6 ~]# reboot

在这里插入图片描述
系统启动不了

在这里插入图片描述
按ESC ,选择光驱引导

在这里插入图片描述
进入光盘救援模式

在这里插入图片描述
语言

在这里插入图片描述
键盘布局

在这里插入图片描述
网络不配置

在这里插入图片描述
Continue

在这里插入图片描述
/ 根分区被挂载到/mnt/sysimage

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

#chroot /mnt/sysimage 切换到根目录
#mount /dev/sr0 /mnt/ #挂载光盘
#cp /mnt/isolinux/vmlinuz /boot/vmlinuz-2.6.32-754.el6.x86_64 #从光盘复制内核文件
#sync #存盘
#exit #退出
#reboot #重启

在这里插入图片描述

系统可以正常启动

ramdisk文件的制作:

  • mkinitrd命令
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
  • dracut命令
dracut /boot/initramfs-$(uname -r).img $(uname -r)

范例:误删除/boot/initramfs-2.6.32-754.el6.x86_64.img无法启动,故障恢复

[root@centos6 ~]# rm -f /boot/initramfs-2.6.32-754.el6.x86_64.img
[root@centos6 ~]# reboot

在这里插入图片描述
按ESC ,选择光驱引导

在这里插入图片描述
进入光盘救援模式

在这里插入图片描述
语言

在这里插入图片描述
键盘布局

在这里插入图片描述
网络不配置

在这里插入图片描述
Continue

在这里插入图片描述
/ 根分区被挂载到/mnt/sysimage

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

#chroot /mnt/sysimage   #切换到根目录
#mkinitrd /boot/initramfs-`uname -r`.img `uname -r`  #生成驱动文件
#sync  #存盘
#exit  #退出
#reboot #重启

在这里插入图片描述

系统可以正常启动

1.3.5 init初始化

POST --> BootSequence (BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> init(systemd)

init程序的类型:

SysV: init, CentOS 5之前

​ 配置文件:/etc/inittab

Upstart: init,CentOS 6

​ 配置文件:/etc/inittab, /etc/init/*.conf

Systemd:systemd, CentOS 7

​ 配置文件:/usr/lib/systemd/system

​ /etc/systemd/system

1.3.5.1 运行级别

运行级别:为系统运行或维护等目的而设定;0-6:7个级别,一般使用3, 5做为默认级别

0:关机
1:单用户模式(root自动登录), single, 维护模式
2:多用户模式,启动网络功能,但不会启动NFS;维护模式
3:多用户模式,正常模式;文本界面
4:预留级别;可同3级别
5:多用户模式,正常模式;图形界面
6:重启

切换级别:

init #

查看级别:

runlevel
who -r

定义运行级别

/etc/inittab

CentOS 5 的inittab文件还定义以下内容

初始运行级别(RUN LEVEL)
系统初始化脚本
对应运行级别的脚本目录
捕获某个关键字顺序
定义UPS电源终端/恢复脚本
在虚拟控制台生成getty
在运行级别5初始化X

CentOS 5 的inittab文件每一行格式:

id:runlevel:action:process

id:是惟一标识该项的字符序列
runlevels: 定义了操作所使用的运行级别
action: 指定了要执行的特定操作
		wait: 切换至此级别运行一次
		respawn:此process终止,就重新启动之
		initdefault:设定默认运行级别;process省略
		sysinit:设定系统初始化方式
process:定义了要执行的进程

范例:CentOS 5 的inittab文件

id:5:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down”
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled”
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
x:5:respawn:/etc/X11/prefdm -nodaemon

CentOS 6 /etc/inittab和相关文件

CentOS 6 init程序为 upstart, 其配置文件/etc/inittab, /etc/init/*.conf,配置文件的语法 遵循 upstart配置文件语法格式,和CentOS5不同

/etc/inittab 设置系统默认的运行级别
/etc/init/control-alt-delete.conf
/etc/init/tty.conf
/etc/init/start-ttys.conf
/etc/init/rc.conf
/etc/init/prefdm.conf

范例:

[root@centos6 ~]# pstree -p
init(1)─┬─auditd(1165)───{auditd}(1166)
        ├─crond(1356)
        ├─master(1342)─┬─pickup(1350)
        │              └─qmgr(1351)
        ├─mingetty(1369)
        ├─mingetty(1371)
        ├─mingetty(1373)
        ├─mingetty(1375)
        ├─mingetty(1377)
        ├─mingetty(1379)
        ├─rsyslogd(1187)─┬─{rsyslogd}(1188)
        │                ├─{rsyslogd}(1190)
        │                └─{rsyslogd}(1191)
        ├─sshd(1263)─┬─sshd(1381)───bash(1383)───pstree(1405)
        │            └─sshd(1384)───sftp-server(1400)
        └─udevd(483)─┬─udevd(773)
                     └─udevd(783)
[root@centos6 ~]# 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: #设置开机进入到哪个模式启动

[root@centos5 ~]# cat /etc/inittab 
#
# inittab       This file describes how the INIT process should set up
#               the system in a certain run-level.
#
# Author:       Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
#               Modified for RHS Linux by Marc Ewing and Donnie Barnes
#

# Default runlevel. The runlevels used by RHS 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:5:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.  
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"


# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon

1.3.5.2 初始化脚本 sysinit

[root@centos6 ~]# file /etc/rc.d/rc.sysinit
/etc/rc.d/rc.sysinit: Bourne-Again shell script text executable

[root@centos6 ~]# cat /etc/rc.d/rc.sysinit
#!/bin/bash
#
# /etc/rc.d/rc.sysinit - run once at boot time
#
# Taken in part from Miquel van Smoorenburg's bcheckrc.
#

HOSTNAME=$(/bin/hostname)

set -m

if [ -f /etc/sysconfig/network ]; then
    . /etc/sysconfig/network
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
    HOSTNAME=localhost
fi

if [ ! -e /proc/mounts ]; then
	mount -n -t proc /proc /proc
	mount -n -t sysfs /sys /sys >/dev/null 2>&1
fi
if [ ! -d /proc/bus/usb ]; then
	modprobe usbcore >/dev/null 2>&1 && mount -n -t usbfs /proc/bus/usb /proc/bus/usb
else
	mount -n -t usbfs /proc/bus/usb /proc/bus/usb
fi

#remount /dev/shm to set attributes from fstab #669700
mount -n -o remount /dev/shm >/dev/null 2>&1
#remount /proc to set attributes from fstab #984003
mount -n -o remount /proc >/dev/null 2>&1

. /etc/init.d/functions

PLYMOUTH=
[ -x /bin/plymouth ] && PLYMOUTH=yes

# Check SELinux status
SELINUX_STATE=
if [ -e "/selinux/enforce" ] && [ "$(cat /proc/self/attr/current)" != "kernel" ]; then
	if [ -r "/selinux/enforce" ] ; then
		SELINUX_STATE=$(cat "/selinux/enforce")
	else
		# assume enforcing if you can't read it
		SELINUX_STATE=1
	fi
fi

if [ -n "$SELINUX_STATE" -a -x /sbin/restorecon ] && __fgrep " /dev " /proc/mounts >/dev/null 2>&1 ; then
	/sbin/restorecon -R -F /dev 2>/dev/null
fi

disable_selinux() {
	echo $"*** Warning -- SELinux is active"
	echo $"*** Disabling security enforcement for system recovery."
	echo $"*** Run 'setenforce 1' to reenable."
	echo "0" > "/selinux/enforce"
}

relabel_selinux() {
    # if /sbin/init is not labeled correctly this process is running in the
    # wrong context, so a reboot will be required after relabel
    AUTORELABEL=
    . /etc/selinux/config
    echo "0" > /selinux/enforce
    [ -n "$PLYMOUTH" ] && plymouth --hide-splash

    if [ "$AUTORELABEL" = "0" ]; then
	echo
	echo $"*** Warning -- SELinux ${SELINUXTYPE} policy relabel is required. "
	echo $"*** /etc/selinux/config indicates you want to manually fix labeling"
	echo $"*** problems. Dropping you to a shell; the system will reboot"
	echo $"*** when you leave the shell."
	start rcS-emergency

    else
	echo
	echo $"*** Warning -- SELinux ${SELINUXTYPE} policy relabel is required."
	echo $"*** Relabeling could take a very long time, depending on file"
	echo $"*** system size and speed of hard drives."

	/sbin/fixfiles -F restore > /dev/null 2>&1
    fi
    rm -f  /.autorelabel
    # at this point fsck was already executed see bz1236062
    [ -f /forcefsck ] && rm -f /forcefsck

    echo $"Unmounting file systems"
    umount -a
    mount -n -o remount,ro /
    echo $"Automatic reboot in progress."
    reboot -f
}

# Print a text banner.
echo -en $"\t\tWelcome to "
read -r system_release < /etc/system-release
if [[ "$system_release" == *"Red Hat"* ]]; then
 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;31m"
 echo -en "Red Hat"
 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m"
 PRODUCT=$(sed "s/Red Hat \(.*\) release.*/\1/" /etc/system-release)
 echo " $PRODUCT"
elif [[ "$system_release" == *Fedora* ]]; then
 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;34m"
 echo -en "Fedora"
 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m"
 PRODUCT=$(sed "s/Fedora \(.*\) \?release.*/\1/" /etc/system-release)
 echo " $PRODUCT"
elif [[ "$system_release" =~ "CentOS" ]]; then
 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;36m"
 echo -en "CentOS"
 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m"
 PRODUCT=$(sed "s/CentOS \(.*\) \?release.*/\1/" /etc/system-release)
 echo " $PRODUCT"
else
 PRODUCT=$(sed "s/ release.*//g" /etc/system-release)
 echo "$PRODUCT"
fi

# Only read this once.
cmdline=$(cat /proc/cmdline)

# Initialize hardware
if [ -f /proc/sys/kernel/modprobe ]; then
   if ! strstr "$cmdline" nomodules && [ -f /proc/modules ] ; then
       sysctl -w kernel.modprobe="/sbin/modprobe" >/dev/null 2>&1
   else
       # We used to set this to NULL, but that causes 'failed to exec' messages"
       sysctl -w kernel.modprobe="/bin/true" >/dev/null 2>&1
   fi
fi

touch /dev/.in_sysinit >/dev/null 2>&1

# Set default affinity
if [ -x /bin/taskset ]; then
   if strstr "$cmdline" default_affinity= ; then
     for arg in $cmdline ; do
         if [ "${arg##default_affinity=}" != "${arg}" ]; then
             /bin/taskset -p ${arg##default_affinity=} 1
             /bin/taskset -p ${arg##default_affinity=} $$
         fi
     done
   fi
fi

nashpid=$(pidof nash 2>/dev/null)
[ -n "$nashpid" ] && kill $nashpid >/dev/null 2>&1
unset nashpid

apply_sysctl

/sbin/start_udev

# Load other user-defined modules
for file in /etc/sysconfig/modules/*.modules ; do
  [ -x $file ] && $file
done

# Load modules (for backward compatibility with VARs)
if [ -f /etc/rc.modules ]; then
	/etc/rc.modules
fi

mount -n /dev/pts >/dev/null 2>&1
[ -n "$SELINUX_STATE" ] && restorecon -F /dev/pts >/dev/null 2>&1

# Configure kernel parameters
update_boot_stage RCkernelparam
apply_sysctl

# Set the hostname.
update_boot_stage RChostname
action $"Setting hostname ${HOSTNAME}: " hostname ${HOSTNAME}
[ -n "${NISDOMAIN}" ] && domainname ${NISDOMAIN}

# Sync waiting for storage.
{ rmmod scsi_wait_scan ; modprobe scsi_wait_scan ; rmmod scsi_wait_scan ; } >/dev/null 2>&1

# Device mapper & related initialization
if ! __fgrep "device-mapper" /proc/devices >/dev/null 2>&1 ; then
       modprobe dm-mod >/dev/null 2>&1
fi

if [ -f /etc/crypttab ]; then
    init_crypto 0
fi

if ! strstr "$cmdline" nompath && [ -f /etc/multipath.conf -a \
		-x /sbin/multipath ]; then
	modprobe dm-multipath > /dev/null 2>&1
	/sbin/multipath -v 0
	if [ -x /sbin/kpartx ]; then
                action_silent $"Add partition mappings: " /sbin/dmsetup ls --target multipath --exec "/sbin/kpartx -a -p p" 
	fi
fi

if ! strstr "$cmdline" nodmraid && [ -x /sbin/dmraid ]; then
	modprobe dm-mirror >/dev/null 2>&1
	dmraidsets=$(LC_ALL=C /sbin/dmraid -s -c -i)
	if [ "$?" = "0" ]; then
		for dmname in $dmraidsets; do
			if [[ "$dmname" == isw_* ]] && \
			   ! strstr "$cmdline" noiswmd; then
				continue
			fi
                        action_silent $"Activate software (ATA)RAID: " /sbin/dmraid -ay -i --rm_partitions -p "$dmname"
			/sbin/kpartx -a -p p "/dev/mapper/$dmname"
		done
	fi
fi

# Start any MD RAID arrays that haven't been started yet
[ -r /proc/mdstat -a -r /dev/md/md-device-map ] && action $"Run MD devices: " /sbin/mdadm -IRs

if [ -x /sbin/lvm ]; then
	if [ ! -f /.nolvm ] && ! strstr "$cmdline" nolvm ; then
		action $"Setting up Logical Volume Management:" /sbin/lvm vgchange -a ay --sysinit --ignoreskippedcluster
	else
		echo $"Logical Volume Management disabled at boot."
	fi
fi

if [ -f /etc/crypttab ]; then
    init_crypto 0
fi

if [ -f /fastboot ] || strstr "$cmdline" fastboot ; then
	fastboot=yes
fi

if [ -f /fsckoptions ]; then
	fsckoptions=$(cat /fsckoptions)
fi

if [ -f /forcefsck ] || strstr "$cmdline" forcefsck ; then
	fsckoptions="-f $fsckoptions"
elif [ -f /.autofsck ]; then
	[ -f /etc/sysconfig/autofsck ] && . /etc/sysconfig/autofsck
	if [ "$AUTOFSCK_DEF_CHECK" = "yes" ]; then
		AUTOFSCK_OPT="$AUTOFSCK_OPT -f"
	fi
	if [ -n "$AUTOFSCK_SINGLEUSER" ]; then
		[ -n "$PLYMOUTH" ] && plymouth --hide-splash
		echo
		echo $"*** Warning -- the system did not shut down cleanly. "
		echo $"*** Dropping you to a shell; the system will continue"
		echo $"*** when you leave the shell."
		[ -n "$SELINUX_STATE" ] && echo "0" > /selinux/enforce
		start rcS-emergency
		[ -n "$SELINUX_STATE" ] && echo "1" > /selinux/enforce
		[ -n "$PLYMOUTH" ] && plymouth --show-splash
	fi
	fsckoptions="$AUTOFSCK_OPT $fsckoptions"
fi

if [ "$BOOTUP" = "color" ]; then
	fsckoptions="-C $fsckoptions"
else
	fsckoptions="-V $fsckoptions"
fi

READONLY=
if [ -f /etc/sysconfig/readonly-root ]; then
	. /etc/sysconfig/readonly-root
fi
if strstr "$cmdline" readonlyroot ; then
	READONLY=yes
	[ -z "$RW_MOUNT" ] && RW_MOUNT=/var/lib/stateless/writable
	[ -z "$STATE_MOUNT" ] && STATE_MOUNT=/var/lib/stateless/state
fi
if strstr "$cmdline" noreadonlyroot ; then
	READONLY=no
fi

if [ "$READONLY" = "yes" -o "$TEMPORARY_STATE" = "yes" ]; then

	mount_empty() {
		if [ -e "$1" ]; then
			echo "$1" | cpio -p -vd "$RW_MOUNT" &>/dev/null
			mount -n --bind "$RW_MOUNT$1" "$1"
		fi
	}

	mount_dirs() {
		if [ -e "$1" ]; then
			mkdir -p "$RW_MOUNT$1"
			find "$1" -type d -print0 | cpio -p -0vd "$RW_MOUNT" &>/dev/null
			mount -n --bind "$RW_MOUNT$1" "$1"
		fi
	}

	mount_files() {
		if [ -e "$1" ]; then
			cp -a --parents "$1" "$RW_MOUNT"
			mount -n --bind "$RW_MOUNT$1" "$1"
		fi
	}

	# Common mount options for scratch space regardless of
	# type of backing store
	mountopts=

	# Scan partitions for local scratch storage
	rw_mount_dev=$(blkid -t LABEL="$RW_LABEL" -l -o device)

	# First try to mount scratch storage from /etc/fstab, then any
	# partition with the proper label.  If either succeeds, be sure
	# to wipe the scratch storage clean.  If both fail, then mount
	# scratch storage via tmpfs.
	if mount $mountopts "$RW_MOUNT" > /dev/null 2>&1 ; then
		rm -rf "$RW_MOUNT" > /dev/null 2>&1
	elif [ x$rw_mount_dev != x ] && mount $rw_mount_dev $mountopts "$RW_MOUNT" > /dev/null 2>&1; then
		rm -rf "$RW_MOUNT"  > /dev/null 2>&1
	else
		mount -n -t tmpfs $RW_OPTIONS $mountopts none "$RW_MOUNT"
	fi

	for file in /etc/rwtab /etc/rwtab.d/* /dev/.initramfs/rwtab ; do
		is_ignored_file "$file" && continue
	[ -f $file ] && cat $file | while read type path ; do
			case "$type" in
				empty)
					mount_empty $path
					;;
				files)
					mount_files $path
					;;
				dirs)
					mount_dirs $path
					;;
				*)
					;;
			esac
			[ -n "$SELINUX_STATE" -a -e "$path" ] && restorecon -R "$path"
		done
	done

	# Use any state passed by initramfs
	[ -d /dev/.initramfs/state ] && cp -a /dev/.initramfs/state/* $RW_MOUNT

	# In theory there should be no more than one network interface active
	# this early in the boot process -- the one we're booting from.
	# Use the network address to set the hostname of the client.  This
	# must be done even if we have local storage.
	ipaddr=
	if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]; then
		ipaddr=$(ip addr show to 0.0.0.0/0 scope global | awk '/[[:space:]]inet / { print gensub("/.*","","g",$2) }')
		for ip in $ipaddr ; do
			HOSTNAME=
			eval $(ipcalc -h $ip 2>/dev/null)
			[ -n "$HOSTNAME" ] && { hostname ${HOSTNAME} ; break; }
		done
	fi
	
	# Clients with read-only root filesystems may be provided with a
	# place where they can place minimal amounts of persistent
	# state.  SSH keys or puppet certificates for example.
	#
	# Ideally we'll use puppet to manage the state directory and to
	# create the bind mounts.  However, until that's all ready this
	# is sufficient to build a working system.

	# First try to mount persistent data from /etc/fstab, then any
	# partition with the proper label, then fallback to NFS
	state_mount_dev=$(blkid -t LABEL="$STATE_LABEL" -l -o device)
	if mount $mountopts $STATE_OPTIONS "$STATE_MOUNT" > /dev/null 2>&1 ; then
		/bin/true
	elif [ x$state_mount_dev != x ] && mount $state_mount_dev $mountopts "$STATE_MOUNT" > /dev/null 2>&1;  then
		/bin/true
	elif [ ! -z "$CLIENTSTATE" ]; then
		# No local storage was found.  Make a final attempt to find
		# state on an NFS server.

		mount -t nfs $CLIENTSTATE/$HOSTNAME $STATE_MOUNT -o rw,nolock
	fi

	if [ -w "$STATE_MOUNT" ]; then

		mount_state() {
			if [ -e "$1" ]; then
				[ ! -e "$STATE_MOUNT$1" ] && cp -a --parents "$1" "$STATE_MOUNT"
				mount -n --bind "$STATE_MOUNT$1" "$1"
			fi
		}

		for file in /etc/statetab /etc/statetab.d/* ; do
			is_ignored_file "$file" && continue
			[ ! -f "$file" ] && continue

			if [ -f "$STATE_MOUNT/$file" ] ; then
				mount -n --bind "$STATE_MOUNT/$file" "$file"
			fi

			for path in $(grep -v "^#" "$file" 2>/dev/null); do
				mount_state "$path"
				[ -n "$SELINUX_STATE" -a -e "$path" ] && restorecon -R "$path"
			done
		done

		if [ -f "$STATE_MOUNT/files" ] ; then
			for path in $(grep -v "^#" "$STATE_MOUNT/files" 2>/dev/null); do
				mount_state "$path"
				[ -n "$SELINUX_STATE" -a -e "$path" ] && restorecon -R "$path"
			done
		fi
	fi

        if mount | grep -q /var/lib/nfs/rpc_pipefs ; then
                mount -t rpc_pipefs sunrpc /var/lib/nfs/rpc_pipefs && service rpcidmapd restart
        fi
fi

if [[ " $fsckoptions" != *" -y"* ]]; then
	fsckoptions="-a $fsckoptions"
fi

_RUN_QUOTACHECK=0
if [ -f /forcequotacheck ] || strstr "$cmdline" forcequotacheck ; then
	_RUN_QUOTACHECK=1
fi
if [ -z "$fastboot" -a "$READONLY" != "yes" ]; then

        STRING=$"Checking filesystems"
	echo $STRING
	fsck -T -t noopts=_netdev -A $fsckoptions
	rc=$?
	
	if [ "$rc" -eq "0" ]; then
		success "$STRING"
		echo
	elif [ "$rc" -eq "1" ]; then
	        passed "$STRING"
		echo
	elif [ "$rc" -eq "2" -o "$rc" -eq "3" ]; then
		echo $"Unmounting file systems"
		umount -a
		mount -n -o remount,ro /
		echo $"Automatic reboot in progress."
		reboot -f
        fi
	
        # A return of 4 or higher means there were serious problems.
	if [ $rc -gt 1 ]; then
		[ -n "$PLYMOUTH" ] && plymouth --hide-splash

		failure "$STRING"
		echo
		echo
		echo $"*** An error occurred during the file system check."
		echo $"*** Dropping you to a shell; the system will reboot"
		echo $"*** when you leave the shell."

                str=$"(Repair filesystem)"
		PS1="$str \# # "; export PS1
		[ "$SELINUX_STATE" = "1" ] && disable_selinux
		start rcS-emergency

		echo $"Unmounting file systems"
		umount -a
		mount -n -o remount,ro /
		echo $"Automatic reboot in progress."
		reboot -f
	elif [ "$rc" -eq "1" ]; then
		_RUN_QUOTACHECK=1
	fi
fi

remount_needed() {
  local state oldifs
  [ "$READONLY" = "yes" ] && return 1
  state=$(LC_ALL=C awk '/ \/ / && ($3 !~ /rootfs/) { print $4 }' /proc/mounts)
  oldifs=$IFS
  IFS=","
  for opt in $state ; do
	if [ "$opt" = "rw" ]; then
		IFS=$oldifs
		return 1
	fi
  done
  IFS=$oldifs
  return 0
}

# Remount the root filesystem read-write.
update_boot_stage RCmountfs
if remount_needed ; then
  action $"Remounting root filesystem in read-write mode: " mount -n -o remount,rw /
fi

# Clean up SELinux labels
if [ -n "$SELINUX_STATE" ]; then
   restorecon /etc/mtab /etc/ld.so.cache /etc/blkid/blkid.tab /etc/resolv.conf >/dev/null 2>&1
fi

# If relabeling, relabel mount points.
if [ -n "$SELINUX_STATE" -a "$READONLY" != "yes" ]; then
    if [ -f /.autorelabel ] || strstr "$cmdline" autorelabel ; then
	restorecon $(awk '!/^#/ && $4 !~ /noauto/ && $2 ~ /^\// { print $2 }' /etc/fstab) >/dev/null 2>&1
    fi
fi

if [ "$READONLY" != "yes" ] ; then
	# Clear mtab
	(> /etc/mtab) &> /dev/null

	# Remove stale backups
	rm -f /etc/mtab~ /etc/mtab~~

	# Enter mounted filesystems into /etc/mtab
	mount -f /
	mount -f /proc >/dev/null 2>&1
	mount -f /sys >/dev/null 2>&1
	mount -f /dev/pts >/dev/null 2>&1
	mount -f /dev/shm >/dev/null 2>&1
	mount -f /proc/bus/usb >/dev/null 2>&1
fi

# Mount all other filesystems (except for NFS and /proc, which is already
# mounted). Contrary to standard usage,
# filesystems are NOT unmounted in single user mode.
# The 'no' applies to all listed filesystem types. See mount(8).
if [ "$READONLY" != "yes" ] ; then
	action $"Mounting local filesystems: " mount -a -t nonfs,nfs4,smbfs,ncpfs,cifs,gfs,gfs2,glusterfs -O no_netdev
else
	action $"Mounting local filesystems: " mount -a -n -t nonfs,nfs4,smbfs,ncpfs,cifs,gfs,gfs2,glusterfs -O no_netdev
fi

# Check to see if a full relabel is needed
if [ -n "$SELINUX_STATE" -a "$READONLY" != "yes" ]; then
    if [ -f /.autorelabel ] || strstr "$cmdline" autorelabel ; then
	relabel_selinux
    fi
else
    if [ -d /etc/selinux -a "$READONLY" != "yes" ]; then
        [ -f /.autorelabel ] || touch /.autorelabel
    fi
fi

# Update quotas if necessary
if [ X"$_RUN_QUOTACHECK" = X1 -a -x /sbin/quotacheck ]; then
	action $"Checking local filesystem quotas: " /sbin/quotacheck -anug
fi

if [ -x /sbin/quotaon ]; then
    action $"Enabling local filesystem quotas: " /sbin/quotaon -aug
fi

# Initialize pseudo-random number generator
if [ -f "/var/lib/random-seed" ]; then
	cat /var/lib/random-seed > /dev/urandom
else
	[ "$READONLY" != "yes" ] && touch /var/lib/random-seed
fi
if [ "$READONLY" != "yes" ]; then
	chmod 600 /var/lib/random-seed
	dd if=/dev/urandom of=/var/lib/random-seed count=1 bs=4096 2>/dev/null
fi

if [ -f /etc/crypttab ]; then
    init_crypto 1
fi

# Configure machine if necessary.
if [ -f /.unconfigured ]; then

    if [ -x /bin/plymouth ]; then
        /bin/plymouth quit
    fi

    if [ -x /usr/bin/system-config-keyboard ]; then
	/usr/bin/system-config-keyboard
    fi
    if [ -x /usr/bin/passwd ]; then
        /usr/bin/passwd root
    fi
    if [ -x /usr/sbin/system-config-network-tui ]; then
	/usr/sbin/system-config-network-tui
    fi
    if [ -x /usr/sbin/timeconfig ]; then
	/usr/sbin/timeconfig
    fi
    if [ -x /usr/sbin/authconfig-tui ]; then
	/usr/sbin/authconfig-tui --nostart
    fi
    if [ -x /usr/sbin/ntsysv ]; then
	/usr/sbin/ntsysv --level 35
    fi

    # Reread in network configuration data.
    if [ -f /etc/sysconfig/network ]; then
	. /etc/sysconfig/network

	# Reset the hostname.
	action $"Resetting hostname ${HOSTNAME}: " hostname ${HOSTNAME}
    fi

    rm -f /.unconfigured
fi

# Clean out /.
rm -f /fastboot /fsckoptions /forcefsck /.autofsck /forcequotacheck /halt \
	/poweroff /.suspended &> /dev/null

# Do we need (w|u)tmpx files? We don't set them up, but the sysadmin might...
_NEED_XFILES=
[ -f /var/run/utmpx -o -f /var/log/wtmpx ] && _NEED_XFILES=1

# Clean up /var.
rm -rf /var/lock/cvs/* /var/run/screen/*
find /var/lock /var/run ! -type d -exec rm -f {} \;
rm -f /var/lib/rpm/__db* &> /dev/null
rm -f /var/gdm/.gdmfifo &> /dev/null

[ "$PROMPT" != no ] && plymouth watch-keystroke --command "touch /var/run/confirm" --keys=Ii &

# Clean up utmp/wtmp
> /var/run/utmp
touch /var/log/wtmp
chgrp utmp /var/run/utmp /var/log/wtmp
chmod 0664 /var/run/utmp /var/log/wtmp
if [ -n "$_NEED_XFILES" ]; then
  > /var/run/utmpx
  touch /var/log/wtmpx
  chgrp utmp /var/run/utmpx /var/log/wtmpx
  chmod 0664 /var/run/utmpx /var/log/wtmpx
fi
[ -n "$SELINUX_STATE" ] && restorecon /var/run/utmp* /var/log/wtmp* >/dev/null 2>&1

# Clean up various /tmp bits
[ -n "$SELINUX_STATE" ] && restorecon /tmp
rm -f /tmp/.X*-lock /tmp/.lock.* /tmp/.gdm_socket /tmp/.s.PGSQL.*
rm -rf /tmp/.X*-unix /tmp/.ICE-unix /tmp/.font-unix /tmp/hsperfdata_* \
       /tmp/kde-* /tmp/ksocket-* /tmp/mc-* /tmp/mcop-* /tmp/orbit-*  \
       /tmp/scrollkeeper-*  /tmp/ssh-* \
       /dev/.in_sysinit

# Make ICE directory
mkdir -m 1777 -p /tmp/.ICE-unix >/dev/null 2>&1
chown root:root /tmp/.ICE-unix
[ -n "$SELINUX_STATE" ] && restorecon /tmp/.ICE-unix >/dev/null 2>&1

# Start up swapping.
update_boot_stage RCswap
action $"Enabling /etc/fstab swaps: " swapon -a -e
if [ "$AUTOSWAP" = "yes" ]; then
	curswap=$(awk '/^\/dev/ { print $1 }' /proc/swaps | while read x; do get_numeric_dev dec $x ; echo -n " "; done)
	swappartitions=$(blkid -t TYPE=swap -o device)
	if [ x"$swappartitions" != x ]; then
		for partition in $swappartitions ; do
			[ ! -e $partition ] && continue
			majmin=$(get_numeric_dev dec $partition)
			echo $curswap | grep -qw "$majmin" || action $"Enabling local swap partitions: " swapon $partition
		done
	fi
fi

# Set up binfmt_misc
/bin/mount -t binfmt_misc none /proc/sys/fs/binfmt_misc > /dev/null 2>&1

# Boot time profiles. Yes, this should be somewhere else.
if [ -x /usr/sbin/system-config-network-cmd ]; then
  if strstr "$cmdline" netprofile= ; then
    for arg in $cmdline ; do
        if [ "${arg##netprofile=}" != "${arg}" ]; then
	    /usr/sbin/system-config-network-cmd --profile ${arg##netprofile=}
        fi
    done
  fi
fi

# Now that we have all of our basic modules loaded and the kernel going,
# let's dump the syslog ring somewhere so we can find it later
[ -f /var/log/dmesg ] && mv -f /var/log/dmesg /var/log/dmesg.old
dmesg -s 131072 > /var/log/dmesg

# create the crash indicator flag to warn on crashes, offer fsck with timeout
touch /.autofsck &> /dev/null

[ "$PROMPT" != no ] && plymouth --ignore-keystroke=Ii
if strstr "$cmdline" confirm ; then
	touch /var/run/confirm
fi

# Let rhgb know that we're leaving rc.sysinit
if [ -x /bin/plymouth ]; then
    /bin/plymouth --sysinit
fi

系统初始化脚本功能

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

范例:

[root@centos6 ~]# cat /etc/init/rcS.conf
# rcS - runlevel compatibility
#
# This task runs the old sysv-rc startup scripts.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file rcS.override and put your changes there.

start on startup

stop on runlevel

task

# Note: there can be no previous runlevel here, if we have one it's bad
# information (we enter rc1 not rcS for maintenance).  Run /etc/rc.d/rc
# without information so that it defaults to previous=N runlevel=S.
console output
pre-start script
	for t in $(cat /proc/cmdline); do
		case $t in
			emergency)
				start rcS-emergency
				break
			;;
		esac
	done
end script
exec /etc/rc.d/rc.sysinit
post-stop script
	if [ "$UPSTART_EVENTS" = "startup" ]; then
		[ -f /etc/inittab ] && runlevel=$(/bin/awk -F ':' '$3 == "initdefault" && $1 !~ "^#" { print $2 }' /etc/inittab)
		[ -z "$runlevel" ] && runlevel="3"
		for t in $(cat /proc/cmdline); do
			case $t in
				-s|single|S|s) runlevel="S" ;;
				[1-9])       runlevel="$t" ;;
			esac
		done
		exec telinit $runlevel
	fi
end script

1.3.5.3 服务管理

[root@centos6 ~]# cat /etc/init/rc.conf
# rc - System V runlevel compatibility
#
# This task runs the old sysv-rc runlevel scripts.  It
# is usually started by the telinit compatibility wrapper.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file rc.override and put your changes there.

start on runlevel [0123456]

stop on runlevel [!$RUNLEVEL]

task

export RUNLEVEL
console output
exec /etc/rc.d/rc $RUNLEVEL

[root@centos6 ~]# file /etc/rc.d/rc
/etc/rc.d/rc: Bourne-Again shell script text executable
[root@centos6 ~]# cat /etc/rc.d/rc
#! /bin/bash
#
# rc            This file is responsible for starting/stopping
#               services when the runlevel changes.
#
# Original Author:       
#               Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
#

set -m

# check a file to be a correct runlevel script
check_runlevel ()
{
	# Check if the file exists at all.
	[ -x "$1" ] || return 1
	is_ignored_file "$1" && return 1
	return 0
}

# Now find out what the current and what the previous runlevel are.
argv1="$1"		#根据这个$1参数运行
set $(/sbin/runlevel)
runlevel=$2
previous=$1
export runlevel previous

. /etc/init.d/functions

export CONSOLETYPE
do_confirm="no"
if [ -f /var/run/confirm ]; then
	do_confirm="yes"
fi
UPSTART=
[ -x /sbin/initctl ] && UPSTART=yes
# See if we want to be in user confirmation mode
if [ "$previous" = "N" ]; then
	if [ "$do_confirm" = "yes" ]; then
		echo $"Entering interactive startup"
	else
		echo $"Entering non-interactive startup"
	fi
fi

# Get first argument. Set new runlevel to this argument.
[ -n "$argv1" ] && runlevel="$argv1"

# Is there an rc directory for this new runlevel?
[ -d /etc/rc$runlevel.d ] || exit 0

# Set language, vc settings once to avoid doing it for every init script
# through functions
if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] ; then
  . /etc/profile.d/lang.sh 2>/dev/null
  export LANGSH_SOURCED=1
fi

# First, run the KILL scripts.		#先运行这段代码
for i in /etc/rc$runlevel.d/K* ; do

	# Check if the subsystem is already up.
	subsys=${i#/etc/rc$runlevel.d/K??}
	[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] || continue
	check_runlevel "$i" || continue

	# Bring the subsystem down.
	[ -n "$UPSTART" ] && initctl emit --quiet stopping JOB=$subsys
	$i stop
	[ -n "$UPSTART" ] && initctl emit --quiet stopped JOB=$subsys
done

# Now run the START scripts.		#再运行这段代码
for i in /etc/rc$runlevel.d/S* ; do

	# Check if the subsystem is already up.
	subsys=${i#/etc/rc$runlevel.d/S??}
	[ -f /var/lock/subsys/$subsys ] && continue
	[ -f /var/lock/subsys/$subsys.init ] && continue
	check_runlevel "$i" || continue
		    
	# If we're in confirmation mode, get user confirmation
	if [ "$do_confirm" = "yes" ]; then
		confirm $subsys
		rc=$?
		if [ "$rc" = "1" ]; then
			continue
		elif [ "$rc" = "2" ]; then
			do_confirm="no"
		fi
	fi

	update_boot_stage "$subsys"
	# Bring the subsystem up.
	[ -n "$UPSTART" ] && initctl emit --quiet starting JOB=$subsys
	if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then
		export LC_ALL=C
		exec $i start
	fi
	$i start
	[ -n "$UPSTART" ] && initctl emit --quiet started JOB=$subsys
done
[ "$do_confirm" = "yes" ] && rm -f /var/run/confirm
exit 0

[root@centos6 ~]# ls /etc/rc*.d -d
/etc/rc0.d  /etc/rc1.d  /etc/rc2.d  /etc/rc3.d  /etc/rc4.d  /etc/rc5.d  /etc/rc6.d  /etc/rc.d
[root@centos6 ~]# ls /etc/rc3.d
K10saslauthd  K87restorecond  K89rdisc  S08ip6tables  S10network  S12rsyslog    S25blk-availability  S26udev-post  S55sshd     S90crond
K61nfs-rdma   K89netconsole   S05rdma   S08iptables   S11auditd   S15mdmonitor  S25netfs             S50kdump      S80postfix  S99local

[root@centos6 ~]# ll /etc/rc.d/rc3.d
total 0
lrwxrwxrwx. 1 root root 19 Oct  6 23:45 K10saslauthd -> ../init.d/saslauthd
lrwxrwxrwx. 1 root root 18 Oct  6 23:46 K61nfs-rdma -> ../init.d/nfs-rdma
lrwxrwxrwx. 1 root root 21 Oct  6 23:45 K87restorecond -> ../init.d/restorecond
lrwxrwxrwx. 1 root root 20 Oct  6 23:45 K89netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 15 Oct  6 23:45 K89rdisc -> ../init.d/rdisc
lrwxrwxrwx. 1 root root 14 Oct  6 23:46 S05rdma -> ../init.d/rdma
lrwxrwxrwx. 1 root root 19 Oct  6 23:46 S08ip6tables -> ../init.d/ip6tables
lrwxrwxrwx. 1 root root 18 Oct  6 23:45 S08iptables -> ../init.d/iptables
lrwxrwxrwx. 1 root root 17 Oct  6 23:45 S10network -> ../init.d/network
lrwxrwxrwx. 1 root root 16 Oct  6 23:46 S11auditd -> ../init.d/auditd
lrwxrwxrwx. 1 root root 17 Oct  6 23:45 S12rsyslog -> ../init.d/rsyslog
lrwxrwxrwx. 1 root root 19 Oct  6 23:45 S15mdmonitor -> ../init.d/mdmonitor
lrwxrwxrwx. 1 root root 26 Oct  6 23:45 S25blk-availability -> ../init.d/blk-availability
lrwxrwxrwx. 1 root root 15 Oct  6 23:45 S25netfs -> ../init.d/netfs
lrwxrwxrwx. 1 root root 19 Oct  6 23:45 S26udev-post -> ../init.d/udev-post
lrwxrwxrwx. 1 root root 15 Oct  6 23:46 S50kdump -> ../init.d/kdump
lrwxrwxrwx. 1 root root 14 Oct  6 23:46 S55sshd -> ../init.d/sshd
lrwxrwxrwx. 1 root root 17 Oct  6 23:45 S80postfix -> ../init.d/postfix
lrwxrwxrwx. 1 root root 15 Oct  6 23:45 S90crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 11 Oct  6 23:45 S99local -> ../rc.local

service 命令:手动管理服务

service 服务 start|stop|restart
service --status-all

/etc/rc.d/rc 控制服务脚本的开机自动运行

for srv in /etc/rc.d/rcN.d/K*; do
    $srv stop
done
for srv in /etc/rc.d/rcN.d/S*; do
    $srv start
done

说明:rc N --> 意味着读取/etc/rc.d/rcN.d/

K: K##:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务

S: S##:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务

配置服务开机启动

  • chkconfig命令
  • ntsysv命令

chkconfig 命令管理服务

#查看服务在所有级别的启动或关闭设定情形:
chkconfig [--list] [name]

#添加服务
SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)
#!/bin/bash
chkconfig: LLLL nn nn #LLLL 表示初始在哪个级别下启动,-表示都不启动
description : 描述信息

chkconfig --add name

#删除服务
chkconfig --del name

#修改指定的运行级别
chkconfig [--level levels] name <on|off|reset>

说明:--level LLLL: 指定要设置的级别;省略时表示2345

范例:

[root@centos6 ~]# service crond status
crond (pid  1358) is running...
[root@centos6 ~]# service rdisc status
rdisc is stopped

[root@centos6 ~]# chkconfig --list
auditd         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
blk-availability	0:off	1:on	2:on	3:on	4:on	5:on	6:off
crond          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
ip6tables      	0:off	1:off	2:on	3:on	4:on	5:on	6:off
iptables       	0:off	1:off	2:on	3:on	4:on	5:on	6:off
kdump          	0:off	1:off	2:off	3:on	4:on	5:on	6:off
mdmonitor      	0:off	1:off	2:on	3:on	4:on	5:on	6:off
netconsole     	0:off	1:off	2:off	3:off	4:off	5:off	6:off
netfs          	0:off	1:off	2:off	3:on	4:on	5:on	6:off
network        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
nfs-rdma       	0:off	1:off	2:off	3:off	4:off	5:off	6:off
postfix        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
rdisc          	0:off	1:off	2:off	3:off	4:off	5:off	6:off
rdma           	0:off	1:on	2:on	3:on	4:on	5:on	6:off
restorecond    	0:off	1:off	2:off	3:off	4:off	5:off	6:off
rsyslog        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
saslauthd      	0:off	1:off	2:off	3:off	4:off	5:off	6:off
sshd           	0:off	1:off	2:on	3:on	4:on	5:on	6:off
udev-post      	0:off	1:on	2:on	3:on	4:on	5:on	6:off

[root@centos6 ~]# chkconfig --level 2345 crond off
[root@centos6 ~]# chkconfig --list crond
crond          	0:off	1:off	2:off	3:off	4:off	5:off	6:off
[root@centos6 ~]# ls /etc/rc*.d/*crond
/etc/rc0.d/K60crond  /etc/rc2.d/K60crond  /etc/rc4.d/K60crond  /etc/rc6.d/K60crond
/etc/rc1.d/K60crond  /etc/rc3.d/K60crond  /etc/rc5.d/K60crond

[root@centos6 ~]# chkconfig crond on
[root@centos6 ~]# chkconfig --list crond
crond          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
[root@centos6 ~]# ls /etc/rc*.d/*crond
/etc/rc0.d/K60crond  /etc/rc2.d/S90crond  /etc/rc4.d/S90crond  /etc/rc6.d/K60crond
/etc/rc1.d/K60crond  /etc/rc3.d/S90crond  /etc/rc5.d/S90crond

[root@centos6 ~]# ls /etc/rc3.d/*
/etc/rc3.d/K10saslauthd    /etc/rc3.d/S05rdma       /etc/rc3.d/S12rsyslog           /etc/rc3.d/S50kdump    /etc/rc3.d/S99local
/etc/rc3.d/K61nfs-rdma     /etc/rc3.d/S08ip6tables  /etc/rc3.d/S15mdmonitor         /etc/rc3.d/S55sshd
/etc/rc3.d/K87restorecond  /etc/rc3.d/S08iptables   /etc/rc3.d/S25blk-availability  /etc/rc3.d/S56xinetd
/etc/rc3.d/K89netconsole   /etc/rc3.d/S10network    /etc/rc3.d/S25netfs             /etc/rc3.d/S80postfix
/etc/rc3.d/K89rdisc        /etc/rc3.d/S11auditd     /etc/rc3.d/S26udev-post         /etc/rc3.d/S90crond

[root@centos6 ~]# ls /etc/init.d
auditd            functions  iptables  mdmonitor   network   rdisc        rsyslog    single   udev-post
blk-availability  halt       kdump     netconsole  nfs-rdma  rdma         sandbox    sshd
crond             ip6tables  killall   netfs       postfix   restorecond  saslauthd  testsrv

[root@centos6 ~]# ls /etc/init.d/crond
/etc/init.d/crond

[root@centos6 ~]# cat /etc/init.d/crond
#!/bin/sh
#
# crond          Start/Stop the cron clock daemon.
#
# chkconfig: 2345 90 60
# description: cron is a standard UNIX program that runs user-specified \
#              programs at periodic scheduled times. vixie cron adds a \
#              number of features to the basic UNIX cron, including better \
#              security and more powerful configuration options.

### BEGIN INIT INFO
# Provides: crond crontab
# Required-Start: $local_fs $syslog
# Required-Stop: $local_fs $syslog
# Default-Start:  2345
# Default-Stop: 90
# Short-Description: run cron daemon
# Description: cron is a standard UNIX program that runs user-specified 
#              programs at periodic scheduled times. vixie cron adds a 
#              number of features to the basic UNIX cron, including better 
#              security and more powerful configuration options.
### END INIT INFO

[ -f /etc/sysconfig/crond ] || { 
    [ "$1" = "status" ] && exit 4 || exit 6 
}

RETVAL=0
prog="crond"
exec=/usr/sbin/crond
lockfile=/var/lock/subsys/crond
config=/etc/sysconfig/crond

# Source function library.
. /etc/rc.d/init.d/functions

[ $UID -eq 0 ] && [ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

start() {
    if [ $UID -ne 0 ] ; then
        echo "User has insufficient privilege."
        exit 4
    fi
    [ -x $exec ] || exit 5
    [ -f $config ] || exit 6
    echo -n $"Starting $prog: "
    daemon $prog $CRONDARGS
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
}

stop() {
    if [ $UID -ne 0 ] ; then
        echo "User has insufficient privilege."
        exit 4
    fi
    echo -n $"Stopping $prog: "
	if [ -n "`pidfileofproc $exec`" ]; then
		killproc $exec
		RETVAL=3
	else
		failure $"Stopping $prog"
	fi
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
}

restart() {
    rh_status_q && stop
    start
}

reload() {
	echo -n $"Reloading $prog: "
	if [ -n "`pidfileofproc $exec`" ]; then
		killproc $exec -HUP
	else
		failure $"Reloading $prog"
	fi
	retval=$?
	echo
}

force_reload() {
	# new configuration takes effect after restart
    restart
}

rh_status() {
    # run checks to determine if the service is running or use generic status
    status -p /var/run/crond.pid $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}


case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
        restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
        exit 2
esac
exit $?

[root@centos6 ~]# ls /etc/rc3.d/*
/etc/rc3.d/K10saslauthd    /etc/rc3.d/K89rdisc      /etc/rc3.d/S10network    /etc/rc3.d/S25blk-availability  /etc/rc3.d/S55sshd
/etc/rc3.d/K61nfs-rdma     /etc/rc3.d/S05rdma       /etc/rc3.d/S11auditd     /etc/rc3.d/S25netfs             /etc/rc3.d/S80postfix
/etc/rc3.d/K87restorecond  /etc/rc3.d/S08ip6tables  /etc/rc3.d/S12rsyslog    /etc/rc3.d/S26udev-post         /etc/rc3.d/S90crond
/etc/rc3.d/K89netconsole   /etc/rc3.d/S08iptables   /etc/rc3.d/S15mdmonitor  /etc/rc3.d/S50kdump             /etc/rc3.d/S99local

[root@centos6 ~]# ll /etc/rc3.d/*
lrwxrwxrwx. 1 root root 19 Oct  6 23:45 /etc/rc3.d/K10saslauthd -> ../init.d/saslauthd
lrwxrwxrwx. 1 root root 18 Oct  6 23:46 /etc/rc3.d/K61nfs-rdma -> ../init.d/nfs-rdma
lrwxrwxrwx. 1 root root 21 Oct  6 23:45 /etc/rc3.d/K87restorecond -> ../init.d/restorecond
lrwxrwxrwx. 1 root root 20 Oct  6 23:45 /etc/rc3.d/K89netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 15 Oct  6 23:45 /etc/rc3.d/K89rdisc -> ../init.d/rdisc
lrwxrwxrwx. 1 root root 14 Oct  6 23:46 /etc/rc3.d/S05rdma -> ../init.d/rdma
lrwxrwxrwx. 1 root root 19 Oct  6 23:46 /etc/rc3.d/S08ip6tables -> ../init.d/ip6tables
lrwxrwxrwx. 1 root root 18 Oct  6 23:45 /etc/rc3.d/S08iptables -> ../init.d/iptables
lrwxrwxrwx. 1 root root 17 Oct  6 23:45 /etc/rc3.d/S10network -> ../init.d/network
lrwxrwxrwx. 1 root root 16 Oct  6 23:46 /etc/rc3.d/S11auditd -> ../init.d/auditd
lrwxrwxrwx. 1 root root 17 Oct  6 23:45 /etc/rc3.d/S12rsyslog -> ../init.d/rsyslog
lrwxrwxrwx. 1 root root 19 Oct  6 23:45 /etc/rc3.d/S15mdmonitor -> ../init.d/mdmonitor
lrwxrwxrwx. 1 root root 26 Oct  6 23:45 /etc/rc3.d/S25blk-availability -> ../init.d/blk-availability
lrwxrwxrwx. 1 root root 15 Oct  6 23:45 /etc/rc3.d/S25netfs -> ../init.d/netfs
lrwxrwxrwx. 1 root root 19 Oct  6 23:45 /etc/rc3.d/S26udev-post -> ../init.d/udev-post
lrwxrwxrwx. 1 root root 15 Oct  6 23:46 /etc/rc3.d/S50kdump -> ../init.d/kdump
lrwxrwxrwx. 1 root root 14 Oct  6 23:46 /etc/rc3.d/S55sshd -> ../init.d/sshd
lrwxrwxrwx. 1 root root 17 Oct  6 23:45 /etc/rc3.d/S80postfix -> ../init.d/postfix
lrwxrwxrwx  1 root root 15 Nov  2 19:55 /etc/rc3.d/S90crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 11 Oct  6 23:45 /etc/rc3.d/S99local -> ../rc.local

[root@centos6 ~]# ll /etc/rc5.d/*
lrwxrwxrwx. 1 root root 19 Oct  6 23:45 /etc/rc5.d/K10saslauthd -> ../init.d/saslauthd
lrwxrwxrwx. 1 root root 18 Oct  6 23:46 /etc/rc5.d/K61nfs-rdma -> ../init.d/nfs-rdma
lrwxrwxrwx. 1 root root 21 Oct  6 23:45 /etc/rc5.d/K87restorecond -> ../init.d/restorecond
lrwxrwxrwx. 1 root root 20 Oct  6 23:45 /etc/rc5.d/K89netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 15 Oct  6 23:45 /etc/rc5.d/K89rdisc -> ../init.d/rdisc
lrwxrwxrwx. 1 root root 14 Oct  6 23:46 /etc/rc5.d/S05rdma -> ../init.d/rdma
lrwxrwxrwx. 1 root root 19 Oct  6 23:46 /etc/rc5.d/S08ip6tables -> ../init.d/ip6tables
lrwxrwxrwx. 1 root root 18 Oct  6 23:45 /etc/rc5.d/S08iptables -> ../init.d/iptables
lrwxrwxrwx. 1 root root 17 Oct  6 23:45 /etc/rc5.d/S10network -> ../init.d/network
lrwxrwxrwx. 1 root root 16 Oct  6 23:46 /etc/rc5.d/S11auditd -> ../init.d/auditd
lrwxrwxrwx. 1 root root 17 Oct  6 23:45 /etc/rc5.d/S12rsyslog -> ../init.d/rsyslog
lrwxrwxrwx. 1 root root 19 Oct  6 23:45 /etc/rc5.d/S15mdmonitor -> ../init.d/mdmonitor
lrwxrwxrwx. 1 root root 26 Oct  6 23:45 /etc/rc5.d/S25blk-availability -> ../init.d/blk-availability
lrwxrwxrwx. 1 root root 15 Oct  6 23:45 /etc/rc5.d/S25netfs -> ../init.d/netfs
lrwxrwxrwx. 1 root root 19 Oct  6 23:45 /etc/rc5.d/S26udev-post -> ../init.d/udev-post
lrwxrwxrwx. 1 root root 15 Oct  6 23:46 /etc/rc5.d/S50kdump -> ../init.d/kdump
lrwxrwxrwx. 1 root root 14 Oct  6 23:46 /etc/rc5.d/S55sshd -> ../init.d/sshd
lrwxrwxrwx. 1 root root 17 Oct  6 23:45 /etc/rc5.d/S80postfix -> ../init.d/postfix
lrwxrwxrwx  1 root root 15 Nov  2 19:55 /etc/rc5.d/S90crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 11 Oct  6 23:45 /etc/rc5.d/S99local -> ../rc.local

[root@centos6 ~]# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 Oct  6 23:45 /etc/rc.local -> rc.d/rc.local

[root@centos6 ~]#  cat /etc/rc.d/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
#/etc/rc.d/rc.local  开机启动文件写到这个文件里

[root@centos6 ~]# vim /etc/init.d/testsrv
#!/bin/bash
#chkconfig: - 96 3
#description: the service script

. /etc/init.d/functions
start(){
        touch /var/lock/subsys/testsrv
        action "Starting testsrv"
        sleep 3
} 
stop(){
        rm -f /var/lock/subsys/testsrv
        action "Shutting down testsrv"
}
restart(){
        stop
        start
}
status(){
        if [ -e /var/lock/subsys/testsrv ];then
            echo "testsrv is runing..."
        else
            echo "testsrv is stopped"
        fi
}

case $1 in
start)
    start
    ;;
stop)
    stop
    ;;
restart)
    restart
    ;;
status)
    status
    ;;
*)
    echo "Usage: /etc/init.d/testsrv {start|stop|restart|status}"
    ;; 
esac

[root@centos6 ~]# chmod +x /etc/init.d/testsrv
[root@centos6 ~]# chkconfig --list
auditd         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
blk-availability	0:off	1:on	2:on	3:on	4:on	5:on	6:off
crond          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
ip6tables      	0:off	1:off	2:on	3:on	4:on	5:on	6:off
iptables       	0:off	1:off	2:on	3:on	4:on	5:on	6:off
kdump          	0:off	1:off	2:off	3:on	4:on	5:on	6:off
mdmonitor      	0:off	1:off	2:on	3:on	4:on	5:on	6:off
netconsole     	0:off	1:off	2:off	3:off	4:off	5:off	6:off
netfs          	0:off	1:off	2:off	3:on	4:on	5:on	6:off
network        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
nfs-rdma       	0:off	1:off	2:off	3:off	4:off	5:off	6:off
postfix        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
rdisc          	0:off	1:off	2:off	3:off	4:off	5:off	6:off
rdma           	0:off	1:on	2:on	3:on	4:on	5:on	6:off
restorecond    	0:off	1:off	2:off	3:off	4:off	5:off	6:off
rsyslog        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
saslauthd      	0:off	1:off	2:off	3:off	4:off	5:off	6:off
sshd           	0:off	1:off	2:on	3:on	4:on	5:on	6:off
udev-post      	0:off	1:on	2:on	3:on	4:on	5:on	6:off

[root@centos6 ~]# ls /etc/rc*.d/*testsrv
ls: cannot access /etc/rc*.d/*testsrv: No such file or directory

[root@centos6 ~]# service testsrv status
testsrv is stopped
[root@centos6 ~]# service testsrv start
Starting testsrv                                           [  OK  ]
[root@centos6 ~]# chkconfig testsrv on
[root@centos6 ~]# chkconfig --list testsrv
testsrv        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
[root@centos6 ~]# ls /etc/rc*.d/*testsrv
/etc/rc2.d/S96testsrv  /etc/rc3.d/S96testsrv  /etc/rc4.d/S96testsrv  /etc/rc5.d/S96testsrv

[root@centos6 ~]# reboot

[root@centos6 ~]# service testsrv status
testsrv is runing...

范例:服务启动失败,故障恢复

[root@centos6 ~]# vim /etc/init.d/testsrv 
#!/bin/bash
#chkconfig: - 96 3
#description: the service script

. /etc/init.d/functions
start(){
        touch /var/lock/subsys/testsrv
        action "Starting testsrv"
        sleep 1000  #把等待时间改成1000,模拟服务不能正常启动                              
}

[root@centos6 ~]# reboot

在这里插入图片描述
如果服务卡住,启动不了

在这里插入图片描述
按a

在这里插入图片描述
进入单用户模式

在这里插入图片描述

# chkconfig --list testsrv
# chkconfig testsrv off
# init 3

[root@centos6 ~]# chkconfig --del testsrv #删除开机启动服务
[root@centos6 ~]# chkconfig --list testsrv
service testsrv supports chkconfig, but is not referenced in any runlevel (run 'chkconfig --add testsrv')
[root@centos6 ~]# ls /etc/rc*.d/*testsrv
ls: cannot access /etc/rc*.d/*testsrv: No such file or directory

1.3.5.4 非独立服务

服务分为独立服务和非独立服务

瞬态(Transient)服务被超级守护进程 xinetd 进程所管理,也称为非独立服务

进入的请求首先被xinetd代理

配置文件:

/etc/xinetd.conf
/etc/xinetd.d/<service>

用chkconfig控制非独立服务开机启动

示例:chkconfig tftp on

/etc/rc.d/rc.local

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

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

/etc/rc.d/rc.local在指定运行级别脚本后运行

范例:

[root@centos6 ~]# yum -y install telnet-server

[root@centos6 ~]# chkconfig --list
auditd         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
blk-availability	0:off	1:on	2:on	3:on	4:on	5:on	6:off
crond          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
ip6tables      	0:off	1:off	2:on	3:on	4:on	5:on	6:off
iptables       	0:off	1:off	2:on	3:on	4:on	5:on	6:off
kdump          	0:off	1:off	2:off	3:on	4:on	5:on	6:off
mdmonitor      	0:off	1:off	2:on	3:on	4:on	5:on	6:off
netconsole     	0:off	1:off	2:off	3:off	4:off	5:off	6:off
netfs          	0:off	1:off	2:off	3:on	4:on	5:on	6:off
network        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
nfs-rdma       	0:off	1:off	2:off	3:off	4:off	5:off	6:off
postfix        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
rdisc          	0:off	1:off	2:off	3:off	4:off	5:off	6:off
rdma           	0:off	1:on	2:on	3:on	4:on	5:on	6:off
restorecond    	0:off	1:off	2:off	3:off	4:off	5:off	6:off
rsyslog        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
saslauthd      	0:off	1:off	2:off	3:off	4:off	5:off	6:off
sshd           	0:off	1:off	2:on	3:on	4:on	5:on	6:off
udev-post      	0:off	1:on	2:on	3:on	4:on	5:on	6:off
xinetd         	0:off	1:off	2:off	3:on	4:on	5:on	6:off

xinetd based services:
	chargen-dgram: 	off
	chargen-stream:	off
	daytime-dgram: 	off
	daytime-stream:	off
	discard-dgram: 	off
	discard-stream:	off
	echo-dgram:    	off
	echo-stream:   	off
	tcpmux-server: 	off
	telnet:        	off
	time-dgram:    	off
	time-stream:   	off

[root@centos6 ~]# service xinetd start
Starting xinetd:                                           [  OK  ]
[root@centos6 ~]# service xinetd status
xinetd (pid  1465) is running...

[root@centos6 ~]# chkconfig telnet on
[root@centos6 ~]# chkconfig --list
auditd         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
blk-availability	0:off	1:on	2:on	3:on	4:on	5:on	6:off
crond          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
ip6tables      	0:off	1:off	2:on	3:on	4:on	5:on	6:off
iptables       	0:off	1:off	2:on	3:on	4:on	5:on	6:off
kdump          	0:off	1:off	2:off	3:on	4:on	5:on	6:off
mdmonitor      	0:off	1:off	2:on	3:on	4:on	5:on	6:off
netconsole     	0:off	1:off	2:off	3:off	4:off	5:off	6:off
netfs          	0:off	1:off	2:off	3:on	4:on	5:on	6:off
network        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
nfs-rdma       	0:off	1:off	2:off	3:off	4:off	5:off	6:off
postfix        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
rdisc          	0:off	1:off	2:off	3:off	4:off	5:off	6:off
rdma           	0:off	1:on	2:on	3:on	4:on	5:on	6:off
restorecond    	0:off	1:off	2:off	3:off	4:off	5:off	6:off
rsyslog        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
saslauthd      	0:off	1:off	2:off	3:off	4:off	5:off	6:off
sshd           	0:off	1:off	2:on	3:on	4:on	5:on	6:off
udev-post      	0:off	1:on	2:on	3:on	4:on	5:on	6:off
xinetd         	0:off	1:off	2:off	3:on	4:on	5:on	6:off

xinetd based services:
	chargen-dgram: 	off
	chargen-stream:	off
	daytime-dgram: 	off
	daytime-stream:	off
	discard-dgram: 	off
	discard-stream:	off
	echo-dgram:    	off
	echo-stream:   	off
	tcpmux-server: 	off
	telnet:        	on
	time-dgram:    	off
	time-stream:   	off

[root@centos6 ~]# ss -ntl
State       Recv-Q Send-Q                                       Local Address:Port                                         Peer Address:Port 
LISTEN      0      128                                                     :::22                                                     :::*     
LISTEN      0      128                                                      *:22                                                      *:*     
LISTEN      0      64                                                      :::23                                                     :::*     
LISTEN      0      100                                                    ::1:25                                                     :::*     
LISTEN      0      100                                              127.0.0.1:25                                                      *:* 

[root@centos6 ~]#  ss -ntlp
State       Recv-Q Send-Q                                       Local Address:Port                                         Peer Address:Port 
LISTEN      0      128                                                     :::22                                                     :::*      users:(("sshd",1301,4))
LISTEN      0      128                                                      *:22                                                      *:*      users:(("sshd",1301,3))
LISTEN      0      64                                                      :::23                                                     :::*      users:(("xinetd",1465,5)) #telnet依赖xinetd启动
LISTEN      0      100                                                    ::1:25                                                     :::*      users:(("master",1380,13))
LISTEN      0      100                                              127.0.0.1:25                                                      *:*      users:(("master",1380,12))

[root@centos6 ~]# ps aux |grep telnet
root       1496  0.0  0.0 103320   884 pts/0    S+   16:46   0:00 grep telnet
#telnet服务没有启动

[root@rocky8 ~]# telnet 172.31.0.6
Trying 172.31.0.6...
Connected to 172.31.0.6.
Escape character is '^]'.
CentOS release 6.10 (Final)
Kernel 2.6.32-754.el6.x86_64 on an x86_64
centos6 login: 

[root@centos6 ~]# ps aux |grep telnet
root       1503  0.0  0.1  12528  1024 ?        Ss   16:47   0:00 in.telnetd: 172.31.1.8
root       1508  0.0  0.0 103320   884 pts/0    S+   16:48   0:00 grep telnet
#一但有人访问telnet服务,就自动启动服务

[root@centos6 ~]# lsof -i :23
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
xinetd    1465 root    5u  IPv6  10616      0t0  TCP *:telnet (LISTEN)
in.telnet 1503 root    0u  IPv4  11192      0t0  TCP 172.31.0.6:telnet->172.31.1.8:44944 (ESTABLISHED)
in.telnet 1503 root    1u  IPv4  11192      0t0  TCP 172.31.0.6:telnet->172.31.1.8:44944 (ESTABLISHED)
in.telnet 1503 root    2u  IPv4  11192      0t0  TCP 172.31.0.6:telnet->172.31.1.8:44944 (ESTABLISHED)

#断开telnet访问
[root@centos6 ~]# ps aux |grep telnet
root       1515  0.0  0.0 103320   884 pts/0    S+   16:49   0:00 grep telnet
#telnet服务被关闭

1.3.5.5 开机启动文件 rc.local

/etc/rc.d/rc.local

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

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

/etc/rc.d/rc.local在指定运行级别脚本后运行

范例:

[root@rocky8 ~]# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 May 19 10:58 /etc/rc.local -> rc.d/rc.local

[root@centos8 ~]# vim /etc/rc.d/rc.local
ping 127.0.0.1

[root@rocky8 ~]# chmod +x /etc/rc.d/rc.local
[root@rocky8 ~]# reboot

[root@rocky8 ~]# ps aux |grep ping
root         847  0.0  0.3  32448  2428 ?        S    17:38   0:00 ping 127.0.0.1
root        1338  0.0  0.1  12136  1068 pts/1    R+   17:38   0:00 grep --color=auto ping

1.3.6 CentOS 启动过程总结

/sbin/init --> (/etc/inittab) --> 设置默认运行级别 --> 运行系统初始脚本/etc/rc.d/rc.sysinit、完成系统初始化 -->(关闭对应下需要关闭的服务)启动需要启动服务/etc/rc#.d/Sxxxx,/etc/rc.d/rc.local–> 设置登录终端

参看:http://s4.51cto.com/wyfs02/M02/87/20/wKiom1fVBELjXsvaAAUkuL83t2Q304.jpg

在这里插入图片描述

标签:off,CentOS,启动,--,etc,init,rc,fi,root
来源: https://blog.csdn.net/qq_25599925/article/details/121170990

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有