linux系统启动详解

主要内容:

系统启动过程

init启动过程

chkconfig的增,删,查


Linux组成

Linux: kernel+rootfs 

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

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

 过程调用:procedure,无返回值 

 函数调用:function 程序:二进制执行文件 v 

内核设计流派: 单内核(monolithic kernel)Linux 把所有功能集成于同一个程序 

微内核(micro kernel)Windows, Solaris 每种功能使用一个单独子系统实现

核心文件: /boot/vmlinuz-2.6.18…

LINUX特点:

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

支持动态加载和卸载

 

组成部分:

核心文件 :/boot/vmlinuz-2.6.18..

CentOS6,7: /boot/initramfs-VERSION-release.img 

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

 

启动过程:

加载BIOS的硬件信息,获取第一个启动设备。 

读取第一个启动设备MBR的引导加载程序(grub)的启动信息 

加载核心操作系统的核心信息,核心开始解压缩,并尝试驱 动所有的硬件设备。 

核心执行init程序并获取运行信息。 

Init执行/etc/rc.d/rc.sysinit文件。 

启动核心的外挂模块(/etc/modprobe.conf)。 

Init执行运行的各个批处理文件(scripts). 

Init执行/etc/rc.d/rc.local.

执行/bin/login程序,等待用户登录。

登录之后开始以Shell控制主机。

 

具体流程:

1 POST:上电自检,检查CPU,主板,内存,硬盘

 ROM:不可写入内存,存着系统最基本的输入输出程序,系统信息设置,开机加电自检程序

 RAM:保存各项参数设定,易失性内存,拔掉电池就丢失

 

2 MBR

446字节 bootloader

64:分区表

2:55AA

grub启动3个阶段

  1  primary boot loader

  1.5  读取硬盘后续的20-30个分区中存放的驱动信息

   2 读取分区文件

加载内核文件,并解压缩内核文件,再执行内核文件

Bootloader

window:仅仅用来启动系统

linux:功能比较丰富,可以选择启动内核版本  GRUB

 

获取runlevel级别 

init程序:

读取/etc/inittab  /etc/init.*/.conf文件

不同的级别将会加载不同的程序,启动不同的服务。

运行的所有初始化脚本放在/etc/init.d/目录下,不同运行级别对应不同的文件夹,每个级别有自己的目录存放服务,rc#.d

Init执行运行的各个批处理文件(scripts). 

Init执行/etc/rc.d/rc.local.

 

 

用户登录

执行/bin/login

1)命令行登录:init进程调用getty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,核对密码,如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell

2ssh登录:这时系统调用sshd程序,取代gettylogin,然后启动shell

 

 

 

内核文件被删除恢复

删除initramfs-`uname -r`

启动时按住esc,进入光盘启动

进入救援模式

4 chroot /mnt/sysimage

  cd /boot

  mkinitrd initramfs-`uname -r`.image `uname -r`

拷贝生成的文件到/boot目录下

 

 /sbin/init CentOS6之前 v 

运行级别:为系统运行或维护等目的而设定;0-67个级别 

0:关机 

1:单用户模式(root自动登录), single, 维护模式 

2: 多用户模式,启动网络功能,但不会启动NFS(共享);维护模式 

3:多用户模式,正常模式;文本界面 

4:预留级别;可同3级别 

5:多用户模式,正常模式;图形界面 

6:重启 v 

默认级别: 3, 5 

切换级别:init # 

查看级别:runlevel ; who -r

 

init初始化:

init读取其初始化文件:/etc/inittab 

初始运行级别(RUN LEVEL) 

系统初始化脚本 

对应运行级别的脚本目录 

捕获某个关键字顺序 

定义UPS电源终端/恢复脚本 

在虚拟控制台生成getty 

在运行级别5初始化X

 

/etc/inittab 

kk.png

 

设置系统默认的运行级别 id:3:initdefault: v

/etc/init/control-alt-delete.conf v/etc/init/tty.conf v/etc/init/start-ttys.conf /etc/init/rc.conf /etc/init/prefdm.conf

K*  K开头的:kill

S*  S开头的:start

数字越小越先执行

 

init启动流程详解:

解析/etc/inittab 文件,执行sysinit指定的进程,/etc/rc.d/sysinit

执行sysinit脚本,这是由init执行的第一个脚本,此步进行的工作包括配置网络、配置内核参数、挂载root文件系统、检查文件系统、设置系统时钟、配置机器、开启交换空间等。

执行/etc/rc.d/rcX.d/[K…][S…]:根据定义的initdefault运行级别,执行对应wait命令指定的程序,这会运行对应目录下的各个程序,并等待它们运行完。在rcX.d目录下,首先终止K开头的服务(用来关闭一个服务),然后启动S开头的服务(用来启动一个服务)。对每一个运行级别来说,在/etc/rc.d子目录中都有一个对应的下级目录。这些运行级别的下级子目录的命名方法为rcX.d, 其中X就是代表运行级别的数字。在各个运行级别的子目录中,都建立有到/etc/rc.d/init.d子目录中命令脚本程序的符号链接,链接的名称在KS后有一个数字,表示执行顺序,数字小的先执行,例如K01tog-pegasusS00microcode_ctl。对以K开头的脚本执行时系统会传递stop参数,而S开头的脚本系统会传递start参数。

最后执行rc.d/rc.local脚本

执行getty程序:为每个联机终端使用fork()创建一个子进程,并在子进程中运行getty程序,init进程则调用wait(),进入等待子进程结束状态。getty程序设置终端类型、属性、速度和线路规程等。对于字符界面的运行级别(如级别23),它会打开并初始化一个tty端口,显示提示信息。通常,若/etc/issue文本文件存在,则getty会首先显示其中的文本信息,然后显示登录提示信息(例如“plinux login:” ),出现字符登录界面,并等待用户键入用户名和口令。可以在inittab文件中配置使用哪一种getty程序(在“id:runlevels:action:process”process部分指定,并可以传递相应的getty参数),如agetty, getty, mgetty, uugetty, mingetty,fbgetty等。getty程序只能由超级用户执行。

6执行login程序:getty调用exec()执行login程序,以核对输入的用户名和口令。由于调用了exec(而不是fork),login的执行环境会覆盖getty的执行环境。login进程会读取

/etc/passwd,以用户名和口令。login根据用户输入的用户名,从口令文件passwd中取得对应用户的登录项,然后调用getpass()以显示”password:”提示信息,读取用户键入的密码

然后使用加密算法对键入的密码进行加密处理,并与口令文件中该用户项中pw_passwd字段作比较。如果用户几次键入的密码均无效,则login程序会以出错码1退出执行,表示此次登录过程失败。此时父进程(进程init)的wait()会返回该退出进程的pid,因此会根据                                                        记录下来的信息再次创建一个子进程,并在该子进程中针对该终端设备再次执行getty程序,再重复上述过程。如果用户键入的密码正确,则login就会把当前工作目录(Currend Work Directory)修改成口令文件中指定的起始工作目录。并把对该终端设备的访问权限修改成用户读/写和组写,设置进程的组ID。然后利用所得到的信息初始化环境变量信息,例如起始目录(HOME=)、使用的shell程序(SHELL=)、用户名(USER=LOGNAME=)和系统执行程序的默认路径序列(PATH=)。接着显示/etc/motd文件(message-of-the-day)中的文本信息,并检查并显示该用户是否有邮件的信息。最后login程序改变成登录用户的用户ID,并执行口令文件中该用户项中指定的shell程序,如/bin/bash/bin/csh等。

 

chkconfig命令 v 查看服务在所有级别的启动或关闭设定情形:

chkconfig [–list] [name] v 添加: SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d) chkconfig –add name 

 

添加服务格式

#!/bin/bash 

#LLLL 表示初始在哪个级别下启动,表示都不启动 

# chkconfig: LLLL nn nn v

#description:xxx 

 

删除服务: chkconfig –del name v

 修改指定的链接类型

chkconfig [–level levels] name <on|off|reset>

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

 

删除服务脚本步骤:

先用chkconfig –del 删除服务

删除服务文件

 

 

xineted:一系列非独立服务的代理 

 

原创文章,作者:liuzhuo,如若转载,请注明出处:http://www.178linux.com/44616

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-10 10:32

    写的很详细,赞一个