前面我们已经介绍过以CentOS为例的Linux系统的安装以及Linux常用命令的使用,本节内容我们将介绍Linux系统引导流程。当按下电源的那一刻,到我们看到用户界面,这其中都发生了些什么呢?赶快来一探究竟.
下图为Linux系统引导流程过程图:
以下对Linux引导流程过程做一个简单的说明:
1. POST加电自检
POST(POST ON SELF TEST)首先对每一个设备进行检查,完成后会寻找存有引导记录的设备,找到读入操作系统的引导记录,将系统控制权交给引导记录。
2. MBR引导
MBR(Master Boot Record),MBR记录一般是在磁盘0磁道1扇区,共512字节,前446个字节是BootLoader,后面的4*16个字节是存放分区信息的,最后两个字节是校验信息的 。
3. GRUB加载内核
GRUB(GRand Unified Bootloader)就是MBR前446个字节,是Booloader的一种,它的作用是选择要启动的内核。
GRUB用于载入内核,查看GRUB配置文件: <1> CentOS-7版本以前系统: /etc/grub.conf; <2>CentOS-7系统: /boot/grub2/grub.cfg
内核启动后完成了两件事: (1)驱动硬件; (2)启动init进程
4. 启动init进程
init启动后读取inittab配置文件,执行缺省运行级别,从而继续引导进程。在UNIX系统中,init是第一个可以存在的进程,它的PID恒为1,但它也必须想一个更高级的功能负责: PID为0的内核调度器(分配CPU时间)。
这个过程包含了多个步骤,以CentOS-7以前的系统为例说明:
(1) 读取/etc/inittab,选择默认级别<常用的运行级别有3:表示多用户; 5:X Window环境,关于运行级别的内容放在本文最后,并且十分重要>
(2) 执行初始化系统脚本,这个脚本在/etc/rc.d/rc.sysinit中
(3) 执行/etc/rc.d/rcX.d/下的脚本<默认级别是5,则会读取rc5.d下的所有脚本,来控制系统启动的时候启动或关闭那些服务>
这里的脚本大致分为两类,以S开头的和以K开头的。
S:代表开机启动的
K:表示开机时不启动的
文件命令格式,例如:
S01sysstat S: 开机启动; 01: 启动次序; sysstat: 启动脚本名
(4) 执行/etc/rc.d/rc.local脚本,这是启动过程中最后启动的一个脚本,然后会执行/bin/login 登陆用户。
下面图片中将更具体的展现了系统启动过程中经历的过程:
注意:
CentOS-7版本以前系统inittab配置文件存放目录: /etc/inittab
CentOS-7系统inittab配置文件也存放在/etc/inittab,但并未做实际配置,而是引向了运行级别配置文件
-------------------------------------------------------------------------------- L v S a n t o r i n i 的 分 割 线 --------------------------------------------------------------------------------
设置开机自启动服务或程序:
(1) 确定系统运行级别
(2) 编写脚本文件,并赋予文件可执行权限
(3) 创建对应的软连接文件置于在对应的rcN.d目录下(N表示运行级别: 1,2,3,4,5,6)
注意: 软连接文件名要以启动脚本命名规范来命名,例如: S10sysstat
如此操作,下次设备重启就可以执行自定义的启动脚本了。
举例(CentOS 7以前版本)<此段由于无设备环境,未验证,读者可看下边用chkconfig添加启动服务的示例>:
[[email protected] rc5.d]# cd /etc/rc.d/rc5.d [[email protected] rc5.d]# pwd /etc/rc.d/rc5.d [[email protected] rc5.d]# vi /etc/rc.d/init.d/start.script [[email protected] rc5.d]# cat /etc/rc.d/init.d/start.script date >> /home/santorini/out.log who >> /home/santorini/out.log ls -l /etc >> /home/santorini/out.log [[email protected] rc5.d]# ll /etc/rc.d/init.d/start.script -rw-r--r--. 1 root root 101 Nov 16 21:36 /etc/rc.d/init.d/start.script [[email protected] rc5.d]# chmod 755 /etc/rc.d/init.d/start.script [[email protected] rc5.d]# ll /etc/rc.d/init.d/start.script -rwxr-xr-x. 1 root root 101 Nov 16 21:36 /etc/rc.d/init.d/start.script [[email protected]calhost rc5.d]# ln -s /etc/rc.d/init.d/start.script S20defineBySantorini [[email protected] rc5.d]# ll total 0 lrwxrwxrwx. 1 root root 20 Nov 14 10:24 K50netconsole -> ../init.d/netconsole lrwxrwxrwx. 1 root root 17 Nov 16 21:00 S10network -> ../init.d/network lrwxrwxrwx. 1 root root 29 Nov 16 21:39 S20defineBySantorini -> /etc/rc.d/init.d/start.script
在介绍完下面的chkconfig命令后,我们将给出CentOS-7系统如何运行安装自启动服务.
chkconfig命令:
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息。chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接.
语法: chkconfig [--add][--del][--list][系统服务] 或 chkconfig [--level <等级代号>][系统服务][on/off/reset] 参数用法: --add 增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据; --del 删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据; --level<等级代号> 指定读系统服务要在哪一个执行等级中开启或关闭; 详细: chkconfig --list [name]:显示所有运行级系统服务的运行状态信息(on或off)。如果指定了name,那么只显示指定的服务在不同运行级的状态。 chkconfig --add name:增加一项新的服务。chkconfig确保每个运行级有一项启动(S)或者杀死(K)入口。如有缺少,则会从缺省的init脚本自动建立。 chkconfig --del name:删除服务,并把相关符号连接从/etc/rc[0-6].d删除。 chkconfig [--level levels] name:设置某一服务在指定的运行级是被启动,停止还是重置。
CentOS-7系统安装自启动服务:
[[email protected] init.d]# pwd /etc/rc.d/init.d [[email protected] init.d]# vi defined [[email protected] init.d]# cat defined #!/bin/bash #chkconfig: 5 10 90 (注意10表示启动优先级,90表示停止优先级, 5表示运行级别) #description: define date >> /Hello.log ls -l /etc >> /Hello.log [[email protected] init.d]# ls -l total 36 -rw-r--r--. 1 root root 97 Nov 17 21:49 defined -rw-r--r--. 1 root root 13430 Jan 15 2015 functions -rwxr-xr-x. 1 root root 2989 Jan 15 2015 netconsole -rwxr-xr-x. 1 root root 6470 Jan 15 2015 network -rw-r--r--. 1 root root 1160 Mar 6 2015 README [[email protected] init.d]# chmod 755 defined [[email protected] init.d]# ls -l total 36 -rwxr-xr-x. 1 root root 97 Nov 17 21:49 defined -rw-r--r--. 1 root root 13430 Jan 15 2015 functions -rwxr-xr-x. 1 root root 2989 Jan 15 2015 netconsole -rwxr-xr-x. 1 root root 6470 Jan 15 2015 network -rw-r--r--. 1 root root 1160 Mar 6 2015 README [[email protected] init.d]# chkconfig --add defined [[email protected] init.d]# cd /etc/rc.d/rc5.d [[email protected] rc5.d]# pwd /etc/rc.d/rc5.d [[email protected] rc5.d]# ll total 0 lrwxrwxrwx. 1 root root 20 Nov 14 10:24 K50netconsole -> ../init.d/netconsole lrwxrwxrwx. 1 root root 17 Nov 17 21:43 S10defined -> ../init.d/defined lrwxrwxrwx. 1 root root 17 Nov 16 21:00 S10network -> ../init.d/network
CentOS-7安装自启动服务步骤:
(1) 在/etc/init.d目录下新建开机启动时要执行的脚本,并赋予执行权限
(2) 使用chkconfig --add 命令添加启动服务.(执行完此命令后将在对应的运行级别rcN.d下生成相应的软链接文件,并且软链接指向/etc/init.d下刚才创建的执行脚本)
+++++++++++++++++++++++++++++++++++++++++++ O T H E R I N T R O D U C T I O N ++++++++++++++++++++++++++++++++++++++++++++++++相关概念:
CMOS: 在计算机领域,CMOS常指保存计算机基本启动信息(如日期、时间、启动设置等)的芯片。有时人们会把CMOS和BIOS混称,其实CMOS是主板上的一块可读写的并行或串行FLASH芯片,是用来保存BIOS的硬件配置和用户对某些参数的设定。
硬件时钟(hwclock)和软件时钟(系统时间):
[[email protected] ~]# date ##软件时钟 Sat Nov 14 08:28:12 CST 2015 [[email protected] ~]# hwclock ##硬件时钟 Sat 14 Nov 2015 08:27:35 AM CST -0.192386 seconds
软硬件同步时钟及时间设置:
-s, --hctosys set the system time from the hardware clock ##将系统时间设置为硬件时钟 -w, --systohc set the hardware clock from the current system time ##将硬件时钟设置为系统时间 [[email protected] ~]# hwclock --set --date="2011-08-14 16:45:05" ##设置硬件时钟时间 [[email protected] ~]# date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] ##设置系统时间
runlevel(运行级别):
runlevel 用来表示在init进程结束之后的系统状态,在系统的硬件中没有固定的信息来表示runlevel,它纯粹是一种软件结构。init和 inittab是runlevel影响系统状态的唯一原因。下面简单说明各运行级别runlevel:
0 - halt 关机,让init关闭所有进程并关机;
1 - Single user mode 单用户模式,只能系统管理员进入,没有图形界面,在该模式下处理在有登录用户时不能进行更改的文件;
2 - Multiuser,without NFS 允许系统进入多用户的模式,没有图形界面,但并不支持文件共享,这种模式很少应用;
3 - Full multiuser mode 最常用的运行模式,主要用来提供真正的多用户模式,也是多数服务器的缺省模式;
4 - unused 一般不被系统使用;
5 - X11 将系统初始化为专用的X Window终端;
6 - 关闭所有运行的进程并重新启动系统(系统将不断重启).
运行级别的切换:
[[email protected] ~]# init 5
inittab文件剖析:
在inittab中,所有条目采取以下格式: id:run-levels:action:process
id:标识符,一般为两位字母或数字
run-levels:指定运行级别,可以指定多个
action:指定运行状态
process:指定要运行的脚本/命令
=====
action常用取值:
initdefault: 指定系统缺省启动的运行级别;
sysinit: 系统启动执行process中指定的命令
wait: 执行process中指定的命令,并等其结束在运行其他命令
once: 执行process中指定的命令,不等待其结束
ctrlaltdel: 按下Ctrl+Alt+Del时执行process指定的命令
powerfail: 当出现电源错误时执行process指定的命令,不等待其结束
powerokwait: 当电源恢复时执行process指定的命令
respawn: 一旦process指定的命令终止,便重新运行该命令