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

(0)
上一篇 2016-09-07 23:21
下一篇 2016-09-08 18:55

相关推荐

  • bash的重定向

    一、简介         bash的数据流重定向(redirect)是将程序的执结果重新定向到另一文件或者设备。或者把一文件重定向给一程序作为数据来源。默认情况下,命令的执行结果显示在屏幕上。文件系统中,分为:标准输入,标准输出,错误输出。 二、用法   &n…

    Linux干货 2015-08-11
  • screen和ehco命令常用选项

    screen的用法 screen 是个外部命令,用之前需要安装。      安装方式之一:yum 源 安装      yum install -y screen screen 是基于VT100/ANSI的仿真终端屏幕管理器    …

    Linux干货 2016-07-26
  • 集群-ipvsadm和NAT实验(3)

    纠正:报文进入内核空间后,当到达input链时发现是一个集群服务时,则直接发送到postrouting链,不经过forward链。 调度算法: 1、静态方法: rr:轮询,即依照次序从所有RS中进行挑选 wrr:加权轮询,按照权重在RS中进行轮询 sh:source hashing,源地址哈希,即对来自相同客户端的请求发送至同一RS,这样会破坏负载均衡效果。…

    Linux干货 2015-12-15
  • 网卡别名与bonding配置

    我们知道,一般来说,一个硬件地址对应与一个IP地址。但在一些情况下,我们可以通过一些方法打破硬件地址与IP地址的一一对应关系。下面就来说一下网卡别名与bonding配置。 网卡别名就是将多个IP地址绑定到一个网络接口上,其命名方式为IFACE:num,如eth0:1等。需要注意的是,网卡别名仅对虚拟主机有效。创建网卡别名有两种方式: 1、ifconfig命令…

    Linux干货 2016-09-05
  • N25第八周博客作业

    1、写一个脚本,使用ping命令探测172.16.250.1-172.16.250.254之间的所有主机的在线状态;     在线的主机使用绿色显示;     不在线的主使用红色显示; #!/bin/bash trap ‘mytrap’ INT mytra…

    Linux干货 2017-02-26
  • man的用法

    man的使用 man命令是Linux下的帮助指令,通过man指令可以查看Linux中的指令帮助、配置文件帮助和编程帮助等信息。 语法 man(选项)(参数) 选项 -a:在所有的man帮助手册中搜索; -f:等价于whatis指令,显示给定关键字的简短描述信息; -P:指定内容时使用分页程序; -M:指定man手册搜索的路径。 参数 数字:指定从哪本man手…

    Linux干货 2018-03-04

评论列表(1条)

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

    写的很详细,赞一个