(一)Linux组成结构
- Linux: kernel+rootfs
kernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能 - rootfs: 程序和glibc
- 库:函数集合, function, 调用接口(头文件负责描述)
- 过程调用:procedure ,无返回值
- 函数调用:function
- 程序:二进制执行文件
(1)内核介绍
(1)Linux 内核特点:
- 支持模块化:.ko (内核对象)
- 如:文件系统,硬件驱动,网络协议等
- 支持内核模块的动态装载和卸载
(2)组成部分
- 核心文件:
- /boot/vmlinuz- VERSION -release
- ramdisk :辅助的伪根系统
- CentOS 5: /boot/initrd- VERSION-release.img
- CentOS 6,7: /boot/initramfs- VERSION -release.img
- 模块文件:/lib/modules/ VERSION-release
(二)CentOS6启动流程
(1) POST自检:
系统接通电源时自动检测CPU,内存,主板,显卡,声卡,网卡等I/O设备,如果设备正常则进行下一启动步骤。
(2) MBR引导
MBR(Master Boot Record) MBR记录一般是在磁盘 0 磁道 1 扇区,共512个字节。前446个字节是BootLoder,后 4*16 的 64 个字节是存放分区信息的,最后 2 个字节是校验信息,一般是 55AA。
(3) MBR引导GRUB(GRand Unified Bootloader)
Bootloader的工作机制:bootloader可以访问文件系统,而内核则作为文件而存在。bootloader访问内核文件时,是将内核文件Vmlinz所在的整个分区当作根去访问的。我们常用的内核加载器是GRUB(Grand UnifiedBootloader),因此由grub来加载内核。
# grub文件内部的所有内容
[root@vinny grub]# ll
total 280
-rw-r--r--. 1 root root 63 Jun 19 00:39 device.map
-rw-r--r--. 1 root root 13428 Jun 19 00:39 e2fs_stage1_5
-rw-r--r--. 1 root root 12636 Jun 19 00:39 fat_stage1_5
-rw-r--r--. 1 root root 11780 Jun 19 00:39 ffs_stage1_5
-rw-------. 1 root root 771 Jun 19 00:39 grub.conf
-rw-r--r--. 1 root root 11772 Jun 19 00:39 iso9660_stage1_5
-rw-r--r--. 1 root root 13284 Jun 19 00:39 jfs_stage1_5
lrwxrwxrwx. 1 root root 11 Jun 19 00:39 menu.lst -> ./grub.conf
-rw-r--r--. 1 root root 11972 Jun 19 00:39 minix_stage1_5
-rw-r--r--. 1 root root 14428 Jun 19 00:39 reiserfs_stage1_5
-rw-r--r--. 1 root root 1341 Nov 15 2010 splash.xpm.gz
-rw-r--r--. 1 root root 512 Jun 19 00:39 stage1
-rw-r--r--. 1 root root 126148 Jun 19 00:39 stage2
-rw-r--r--. 1 root root 12040 Jun 19 00:39 ufs2_stage1_5
-rw-r--r--. 1 root root 11380 Jun 19 00:39 vstafs_stage1_5
-rw-r--r--. 1 root root 13980 Jun 19 00:39 xfs_stage1_5
根据上边的所有展示内容,发现很多后缀相同的文件device.map,menulst,stage1,stage2,
以及一系列的stage1_5
组成。一下是我对这些文件的解读,说错了请大牛纠正。
device.map 可能是启动系统的时候,一些需要加载的驱动模块,和分区信息的地图。我们现在出门都需要地图,更何况刻板认真的计算机。
menu.lst 是grub.conf的链接文件,当我们启动系统的时候,会有一个选择功能选择菜单,等下免我会详细介绍。
stage:grub引导程序过于庞大,所以在启动过程中分为三个阶段进行:
第一阶段
存放在MBR中
,第二阶段
存放于内核文件系统中。第二阶段没有文件系统,怎么访问呢。这个时候出现了stage1_5
阶段,反正就是想办法让第二阶段启动,所以这个地方出现了很多stage1_5
为后缀的文件。-
grub.conf 文件参数意义
# grub.conf generated by anaconda default=0 # 默认启动的内核title, 0 表示是第一个 timeout=5 # 默认等待时间 splashimage=(hd0,0)/grub/splash.xpm.gz # 指定菜单的背景图片的路径。为xpm格式,采用gzip压缩,只能为14bits色 hiddenmenu # 隐藏菜单 title CentOS 6 (2.6.32-696.el6.x86_64) # 标题名,用户可自定义 root (hd0,0) # 指定 grub 的根位置 # 指定 kernel 文件的位置,还要指出 root(系统启动后) 的位置,挂载方式 ro,这项很关键。 # 加载后会启动 init 进程。 kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=0861b596-c806-4895-97b3-2ef308bdc6a3 nomodeset rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_LVM rd_NO_DM rhgb quiet # 在内核启动过程中装载根文件系统时有用 initrd /initramfs-2.6.32-696.el6.x86_64.img
(4)引导加载器程序GRUB
(1)grub legacy
GRUB是bootloader阶段的一个程序,这是Centos中最常用的引导程序,CentOS 6安装的是grub legacy。
按e:进入编辑模式,用于编辑菜单
然后按c: 进入命令模式,交互式接口
这个界面就和上边联系起来了 ,假如你不会写的话,可以敲
help
就可以查看帮助。grub>
后边需要跟上本文中grub.conf 文件参数意义
里边的内容。
(5) 进入kernel
在GRUB中选择对应的kernel进入,然后kernel会对自身进行初始化,始化系统中各设备并做相关的配置工作,其中包括CPU、I/O、存储设备等。运行用户空间的第一个应用程序,在CentOS 6上是init,在CentOS 7上是Systemd。
(1)读取/etc/inittab来读取默认级别
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
#0:关机
# 1 - Single user mode
#1:单用户模式(root, 无须登录), single, 维护模式
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#2: 多用户模式,会启动网络功能,但不会启动NFS;维护模式;
# 3 - Full multiuser mode
#3:多用户模式,正常模式;文本界面;
# 4 - unused
#4:预留级别;可同3级别;
# 5 - X11
#5:多用户模式,正常模式;图形界面;
# 6 - reboot (Do NOT set initdefault to this)
#6:重启
id:5:initdefault:
注意:上边的最后一行是制定每次启动时后的默认启动级别,修改它就是修改你的默认启动级别。
如果要查看当前系统运行的init级别可使用runlevel
或者who -r
(2)执行初始化系统脚本 /etc/rc.d/rc.sysinit 来初始化脚本
这个脚本里边有很多内容,这里就不一一列举了,只是把它做的事情给列出来。
# 获取网络环境与主机类型。首先会读取网络环境设置文件"/etc/sysconfig/network",获取主机名称与默认网关等网络环境。
# 打印文本欢迎信息。
# 挂载/etc/fstab文件中定义的其它文件系统。
# 激活swap
# 检测根文件系统,并以读写方式重新挂载
# 决定是否启动SELinux和udev。
# 接口设备的检测
# 用户自定义模块的加载。用户可以再"/etc/sysconfig/modules/*.modules"加入自定义的模块,此时会加载到系统中。
# 加载核心的相关设置。按"/etc/sysctl.conf"这个文件的设置值配置功能。
# 设置系统时间(clock)。
# 设置终端的控制台的级别。
# 设置raid及LVM等硬盘功能。
# 以方式查看检验磁盘文件系统。
# 进行磁盘配额quota的转换。
# 重新以读取模式载入系统磁盘。
# 启动quota功能。
# 启动系统随机数设备(产生随机数功能)。
# 清楚启动过程中的临时文件。
# 将启动信息加载到"/var/log/dmesg"文件中。
(3)然后执行 /etc/rc.d/rc 脚本
当你选择默认模式为3的时候,默认会读取/etc/rc.d/rc3.d
下的所有脚本,来控制系统启动的时候启动或者关闭哪些服务。这里面的脚本大致分为以S 开头的和以 K 开头的脚本。 S 代表开机时启动的,K 表示开机时不启动。
排序的说明:服务的启动可能会产生依赖的情况。所以无法避免的会出现排序的情况。比如说:S20
和S198
来说会先执行S199
后执行S22
,是先S2
和S1
比较,之后在比较S20
和S19
以此类推。数字越小越先运行;数字越小的服务,通常为依赖到别的服务;
-
chkconfig
命令:查看每个服务对应级别的开关,以及设置相关服务对应级别上的开关; - 增加服务:
chkconfig --add srv_name
可以将自己写的一些脚本,让此命令统一管理。 - 删除服务:
chkconfig --del srv_name
将服务删除,意思就是服务不由chkconfig这种机制来管理 -
chkconfig srv_name {on|off}
设置服务开机是否自启动,默认管理的级别是2345
. 指定默认级别,可以与其他选项一起使用
注意:正常级别下,最后启动的一个务:S99local
指向了/etc/rc.d/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
文件中。
(6) 手工配置系统启动配置
(1)系统服务脚本的特点
- 基本都可以提供start|stop|restart|status这几个状态值的接收
- 服务脚本存放位置,所有的系统服务脚本都放在
/etc/rc.d/init.d
文件夹中
(2)服务脚本的编写格式
其中,有三行格式是必须要写上的
#!/bin/bash,#/chkconfig,#description
# chkconfig: runlevels SS KK
【SS:表示开始运行的次序,KK:表示关闭程序的次序,-表示都不启动】 因此可以手动编写系统服务:
- (1)把服务脚本放置/etc/init.d目录下
- (2)使用chkconfig –add 添加到系统服务
- (3)重启系统让服务生效