centos6开机启动流程理论篇
硬件启动流程
硬件启动流程 - 1)打开电源
硬件启动流程 - 2)BIOS
BIOS:Basic Input and Output System,主板ROM(只读)上内置的一段程序,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和程序启动自举程序等。
RAM:CMOS互补金属氧化物半导体,保存各项参数的设定。RAM掉电易失,因此主板中有电池供电,使得RAM保存各项参数设定不丢失。
BIOS - ①post
POST:Power-On-Self-Test,加电自检是BIOS的主要功能部分。主要完成对CPU、主板、内存、硬盘、键盘、接口等硬件的检查
BIOS - ②确定启动设备
按照次序查找引导设备,第一个有引导程序的设备为本次启动设备
系统启动自举程序:通过约好的固定位置寻找操作系统。根据BIOS设置的启动顺序,检查驱动器(硬盘,光盘,U盘,网络)
a、如果硬盘是启动项,读取硬盘第一个扇区(MBR,512字节)到内存
b、控制区转给MBR中的BootLoader
BIOS - ③MBR
(MBR的前446字节)BootLoader:引导加载器,专用于引导操作系统
- Windows:ntloader,仅是启动OS
- Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
LILO:LInux LOader
GRUB: GRand Unified Bootloader
GRUB 0.X: GRUB Legacy, GRUB2(centos7开始使用GRUB2)
GRUB引导阶段
centos6的grub是0.97版本,grub的核心功能:启动时找到操作系统;可以用来引导启动各种操作系统。
[root@centos6 ~]#rpm -ql grub
/boot/efi/EFI/redhat
/boot/efi/EFI/redhat/grub.efi
/boot/grub (文件夹)
/sbin/grub
/sbin/grub-crypt (生成grub口令,sha512加密)
/sbin/grub-install (生成/boot/grub下的对应的文件grub.conf文件除外)
/sbin/grub-md5-crypt (生成grub口令,md5加密)
/sbin/grub-terminfo
GRUB - stage1
stage1 :大小512字节 - 对应于MBR中BootLoader中的内容(前446字节)
GRUB - stage1.5
stage1_5: mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统
GRUB - stage2
stage2:磁盘分区(/boot/grub/),进入/boot后先进入grub目录,通过grub/grub.conf文件定位内核文件名
/boot/grub/grub.conf文件的格式
此文件表示boot为根
root (hd0,0) --定义根,hd0表示第一个硬盘,0表示第一个分区,即sda1
因此内核文件表示的路径:
kernel /vmlinuz..内核文件文件名 内核参数 root=真正硬盘的根
设置内核参数时quiet作用:内核加载此参数不显示,硬件识别过程不显示
若/boot未单独分区时:kernel /boot/vmlinuz..内核文件
注意: kernel 要先于initrd 被加载因此文件格式顺序如下:
default=#: 设定默认启动的菜单项;落单项(title)编号从0开始
timeout=#:指定菜单项等待选项选择的时长
splashimage=(hd#,#)/PATH/XPM_FILE:菜单背景图片文件路径
password [--md5] 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: 启动选定的内核或操作系统时进行认证
当yum仓库被禁用时,临时启用yum仓库:
yum --enablerepo=elrepo-kernel install
内核引导阶段
思考:内核加载之后首先寻找 / ,但是内核文件中不具备加载根文件系统的驱动模块,而根文件系统的驱动模块存放在(locate ext4.ko:/usr/lib/modules/2.6.32-754.el6.x86_64/kernel/fs/ext4/ext4.ko),而此目录却存放于 / 之上,如何解决根文件系统的驱动模块?
解决:initramfs-2.6.32-754.el6.x86_64.img
此文件模拟了 / ,同时还有各个文件系统的驱动模块。加载内核之后,会读取ramdisk文件然后解压,加载至内核,这样就构成了一个小型的Linux,解决了根文件系统的驱动模块就可以去加载真正的 / 。
内核的组成部分:
核心文件:/boot/vmlinuz-VERSION-release
ramdisk:辅助的伪根系统
CentOS5:/boot/initrd-VERSION-release.img
CentOS6,7:/boot、initramfs-VERSION-release.img
模块文件 :/lib/modules/VERSION-release
内核引导阶段
①探测可识别到的所有硬件设备
②加载硬件驱动程序(借助于ramdisk加载驱动)
③以只读方式挂载根文件系统
④运行用户空间的第一个应用程序:/sbin/init
系统初始化阶段
运行用户空间的第一个应用程序:/sbin/init后读取其配置文件
读取/sbin/init程序的配置文件/etc/inittab文件,其中/etc/inittab/文件中的定义:centOS6将配置文件拆成多个文件
配置文件/etc/inittab文件
id:runlevel:action:process
id:一行的唯一标识,什么都行,不影响配置生效
runlevels:定义了操作所使用的运行级别
action:指定了要执行的特定操作
wait: 切换至此级别运行一次
respawn:此process终止,就重新启动之
initdefault:设定默认运行级别;process省略
sysinit:设定系统初始化方式
process:定义了要执行的进程
开机启动的模式:
0关机
1单用户模式(root自动登录), single, 维护模式
2多用户模式,启动网络功能,但不会启动NFS;维护模式
3多用户模式,正常模式;文本界面
4预留级别;可同3级别
5多用户模式,正常模式;图形界面
6重启
系统初始化阶段 - 1)/etc/inittab
id:3:initdefault:
定义系统默认开机启动模式
系统初始化阶段 - 2)/etc/rc.d/rc.sysinit
si::sysinit:/etc/rc.d/rc.sysinit
/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)加载开机启动的服务
l3:3:wait:/etc/rc.d/rc 3
/etc/rc.d/rc#.d 根据运行级别启动对应的/etc/rc.d/rc#.d目录下的服务
S开头 start
K开头 stop/etc/rc.local 加载用户自定义服务
/etc/inittab 中的其他选项:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
ctrl+alt+del 换机快捷键,建议禁用,防止误操作
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
...<登录终端>
x:5:respawn:/etc/X11/prefdm -nodaemon
<启动图形界面>
启动终端
根据运行级别启动登录终端
图形终端 runlevel 5
字符终端 执行/sbin/mingetty
验证登录:
*/etc/nologin(默认没有)此文件存在,禁止普通用户登录名单,空文件禁止所有普通用户登录
/etc/usertty 对文件作出附近访问限制,不存在该文件没有限制
/etc/securetty:登记的终端才允许使用,没有文件任何终端都可以登录
/etc/issue 登录前提示信息
/etc/passwd && /etc/shadow:验证用户和口令
登录成功:
屏幕输出:
/var/log/lastlog 输出最近一次登录信息
/var/spool/mail/用户名 检查用户是否有新邮件
/etc/motd/ 登录后提示信息加载环境变量: /etc/profile --> .bash_profile --> .bash_login --> .profile
centos6服务开机启动设置方法
方法一 - 开机启动服务脚本
服务启动脚本放置于/etc/rc.d/init.d/目录中,其中/etc/rc.d/rc#.d/K* 或者/etc/rc.d/rc#.d/S* 是etc/rc.d/init.d/目录下对应的软链接
- chkconfig命令:更新和查询系统服务的运行级别信息
- chkconfig可以将/etc/rc.d/init.d/目录下的服务脚本添加至/etc/rc.d/rc#.d/
- service命令可以调用/etc/rc.d/init.d/目录下的服务脚本
# chkconfig: 345 95 5 (-表示任何模式均不开机启动)
# description:
其中服务脚本需要写明上面两行 (95表示开机启动序号S95 5表示K5)
其中开机启动次序为ls /etc/rc.d/rc#.d/S* 的次序,
手动添加的服务脚本应该选择考虑开机服务的依赖性,使用系统中未使用的数字编号
[root@centos6 init.d]#chkconfig --add testsr.sh
[root@centos6 init.d]#chkconfig --level 345 testsr.sh on
[root@centos6 init.d]#chkconfig --list | grep testsr.sh
testsr.sh 0:off 1:off 2:off 3:on 4:on 5:on 6:off
[root@centos6 init.d]#ll /etc/rc.d/rc*.d/*test*
lrwxrwxrwx 1 root root 19 Jul 21 12:11 /etc/rc.d/rc0.d/K03testsr.sh -> ../init.d/testsr.sh
lrwxrwxrwx 1 root root 19 Jul 21 12:11 /etc/rc.d/rc1.d/K03testsr.sh -> ../init.d/testsr.sh
.....
方法二 - 在/etc/rc.d/rc.local中添加需要启动的服务
- 如果开机有需要启动的服务/命令/脚本等可以添加在rc.local文件中,Centos7也支持此功能(默认7上rc.local没有执行权限)。
在2345模式中均是S开头,/etc/rc.d/rc.local不是服务脚本,此脚本将在最后执行。
[root@centos6 ~]#ll /etc/rc.d/rc*.d/*local
lrwxrwxrwx. 1 root root 11 Jul 17 15:53 /etc/rc.d/rc2.d/S99local -> ../rc.local
lrwxrwxrwx. 1 root root 11 Jul 17 15:53 /etc/rc.d/rc3.d/S99local -> ../rc.local
lrwxrwxrwx. 1 root root 11 Jul 17 15:53 /etc/rc.d/rc4.d/S99local -> ../rc.local
lrwxrwxrwx. 1 root root 11 Jul 17 15:53 /etc/rc.d/rc5.d/S99local -> ../rc.local
xinetd管理的服务
瞬态服务:某些不频繁使用的服务,此类服务设为开机启动占用资源,但是偶尔有可能又会被人使用,因此xinetd服务代理启动,根据需要唤醒对应的服务,又称非独立服务。
- xinetd服务监控瞬态服务,瞬态服务并不启动,当有访问时,xinetd将访问的服务唤醒,提供服务。xinetd称为超级守护进程。
- /etc/xinetd.d/此目录下为xinetd服务监控的服务的配置文件
telnet 服务:监听端口tcp:23
~]#yum install telnet-server -y
~]#chkconfig --list
......
xinetd based services:
.....
rsync: off
tcpmux-server: off
telnet: off <off 表示xinetd服务也不能激活>
~] chkconfig telnet on
<也可以使用修改配置文件方式修改/etc/xinetd.d/目录下对应的服务文件>
~]#lsof -i :23
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xinetd 2674 root 5u IPv6 14686 0t0 TCP *:telnet (LISTEN)
~]#ss -tnlp
users:(("xinetd",2674,5)) :23 23端口由xinetd监控
有人访问时,唤醒Telnet服务