Linux: kernel+rootfs
kernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
rootfs:程序和glibc
库:函数集合, function, 调用接口(头文件负责描述)
过程调用:procedure,无返回值
函数调用:function
程序:二进制执行文件
内核设计流派:
单内核(monolithic kernel):Linux
把所有功能集成于同一个程序
微内核(micro kernel):windows, Solaris
每种功能使用一个单独子系统实现
内核Linux内核特点:
支持模块化:.ko(内核对象)
如:文件系统,硬件驱动,网络协议等
支持内核模块的动态装载和卸载
组成部分:
核心文件:/boot/vmlinuz-VERSION-release
ramdisk:辅助的伪根系统
CentOS 5: /boot/initrd-VERSION-release.img
CentOS6,7: /boot/initramfs-VERSION-release.img
模块文件:/lib/modules/VERSION-release
示例:Linux的核心文件

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控制主机
Linux启动流程
1、POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存RAM、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测。
ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等。
RAM:CMOS互补金属氧化物半导体,保存各项参数的设定按次序查找引导设备,第一个有引导程序的设备为本次启动设备
2、MBR:其中Bootloader占据446字节,分区表占据64字节,magic num占据2字节。MBR将加载Bootloader去开始后边的工作。
3、bootloader: 引导加载器,引导程序Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
LILO:Linux Loader
Bootloader(内核加载器)位于第0磁道第0扇区的446字节是最前边的446字节!Bootloader的工作机制:bootloader可以访问文件系统,而内核则作为文件而存在。所以bootloader可以访问内核文件,深入的说bootloader访问内核文件时,是将内核文件Vmlinz所在的整个分区当作根去访问的,如访问/Vmlinz而根"/"本身的存在位置是由内核文件自己决定。(因为每个文件必须要有一个自己的起始路径)现代我们常用的内核加载器是grub(Grand Unified Bootloader)以此grub来加载内核。加载内核之前grub所做的工作
4、GRUB : 就是MBR中的前 446 个字节,是BooTLoader的一种,它的作用是要选择要启动的内核
primary boot loader : 1st stage,1.5 stage
secondary boot loader :2nd stage,分区文件
/boot/grub文件夹里面有各种启动的文件备份

主要是由device.map,menulst,stage1,stage2,以及一系列的stage1_5组成。
device.map:存放的是内核文件的根分区
grub.conf:就是菜单列表。里面设置了可以选择的内核菜单,存放于stage2中。
stage:用于grub引导程序过大,所以分2段引导,第一段存放在MBR中,第二段存放于内核文件系统中,第一段引导完成后可以找到第二段。 但是,第二段是存放于内核文件系统中的,此时还没有格式化文件系统,如何可以访问到第二段的 menu.lst 呢??就需要借助于中间层 stage1_5,有它来协助 stage1 段来访问 stage2 段。stage1_5通常位于 stage1 字段后的 63 个扇区。 由于stage2 在内存中存放可以使用的文件系统不确定,所以这就是有多个 stage1_5 的原因了。
示例:grub.conf文件

5、kernel:
自身初始化:
探测可识别到的所有硬件设备
加载硬件驱动程序(可能借助于ramdisk加载驱动)
以只读方式挂载根文件系统
运行用户空间的第一个应用程序:/sbin/init
系统启动流程init 程序的类型 :
SysV: init, CentOS 5之前
配置文件:/etc/inittab
Upstart: init,CentOS6
配置文件:/etc/inittab , /etc/init/*.conf
Systemd:systemd, CentOS 7
配置文件:/usr/lib/systemd/system ,/etc/systemd/system
ramdisk:内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问
ramdisk > ramfs提高速度
CentOS 5: initrd, 工具程序:mkinitrd
CentOS 6: initramfs,工具程序:mkinitrd, dracut
系统初始化:
POST > BootSequence(BIOS) > Bootloader(MBR) > kernel(ramdisk) > rootfs(只读) > init(systemd)
/sbin/initCentOS 6之前
运行级别:为系统运行或维护等目的而设定;0-6:7个级别
0:关机
1:单用户模式(root自动登录), single, 维护模式
2: 多用户模式,启动网络功能,但不会启动NFS;维护模式
3:多用户模式,正常模式;文本界面
4:预留级别;可同3级别
5:多用户模式,正常模式;图形界面
6:重启
默认级别:3(多用户CLI模式), 5(图形化模式)
切换级别:init#
查看级别:runlevel; who -r

init读取其初始化文件:/etc/inittab
初始运行级别(RUN LEVEL)
系统初始化脚本
对应运行级别的脚本目录
捕获某个关键字顺序
定义UPS电源终端/恢复脚本
在虚拟控制台生成getty
在运行级别5初始化X
CentOS 5的inittab文件配置文件:/etc/inittab
每一行定义一种action以及与之对应的process
id:runlevel:action:process
action:
wait: 切换至此级别运行一次
respawn:此process终止,就重新启动之
initdefault:设定默认运行级别;process省略
sysinit:设定系统初始化方式,此处一般为指定
/etc/rc.d/rc.sysinit
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc0
l1:1:wait:/etc/rc.d/rc1…
l6:6:wait:/etc/rc.d/rc6
CentOS 6 /etc/inittab和相关文件/etc/inittab
设置系统默认的运行级别
id:3:initdefault:
/etc/init/control-alt-delete.conf
/etc/init/tty.conf
/etc/init/start-ttys.conf
/etc/init/rc.conf
/etc/init/prefdm.conf
示例:CentOS6的/etc/inittab文件。如果需要设置为图形化启动,把3改成5即可

/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) 清理操作

说明:rcN > 意味着开机读取/etc/rc.d/rcN.d/
K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务
启动服务的脚本:
for srvin /etc/rc.d/rcN.d/K*; do
$srv stop
done
for srvin /etc/rc.d/rcN.d/S*; do
$srv start
done
示例:属于init3开机级别的服务进程文件

chkconfig命令 ―查看服务在所有级别的启动或关闭设定情形:
chkconfig [ list] [name]添加:
SysV的服务脚本放置于/etc/rc.d/init.d(/etc/init.d)
chkconfig add name
#!/bin/bash
#LLLL 表示初始在哪个级别下启动,-表示都不启动
# chkconfig: LLLL nnnn
删除:
chkconfig del name
修改指定的链接类型
chkconfig [ level levels] name <on|off|reset>level LLLL: 指定要设置的级别;省略时表示2345
ntsysv命令:图形化的chkconfig命令
示例:制作一个模拟服务进程,并启动它。#chkconfig:2345表示能被这几个级别的init程序运行,88表示启动优先级,22表示关闭优先级

把脚本复制到/etc/init.d/目录下面

添加脚本到服务里面,可以看见脚本默认的启动级别了,这个是根据脚本里面来定义的

可以关闭某些运行的级别

可以查看到/etc/rc.d/rcN.d/文件夹下面的各种K和S打头的testservice文件

可以用chkconfig level N SERVICE on | off 修改服务的开机默认开启状态
可以看见,其实/etc/rc.d/rcN.d/下面的K和S打头的文件就是一个软链接而已~

至于为什么这些只是一个软链接的文件,大家可以参考/etc/rc.d/rc的脚本里面可以看到
例如这里定义K开头的服务,这里只是rc脚本的一部分。

测试此服务开启,关闭

守护进程:xinetd管理的服务(很多的服务依赖于此服务)
service 命令:手动管理服务
service 服务start|stop|restart
service status-all
瞬态(Transient)服务被xinetd进程所管理
进入的请求首先被xinetd代理
配置文件:/etc/xinetd.conf、/etc/xinetd.d/<service>
与libwrap.so文件链接
用chkconfig控制的服务:
chkconfigtftpon
