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)
liuzhuoliuzhuo
上一篇 2016-09-07
下一篇 2016-09-08

相关推荐

  • heartbeatV1+nfs实现高可用httpd

        随着互联网技术的不断发展,Web应用也越来越普遍,Web服务器的无故障工作时间就显得尤重要,但由于各种各样的原因,一台服务器并不能保证永远不出问题的运行,此时就需要一种机制来实现多台服务器共同为相同的来务功能提供服务,以确保任意一台服务器宕机后,不会影响其所承载的业务的访问。   &nbsp…

    Linux干货 2015-06-26
  • yum –rpm前端工具详解

     1、yum 介绍        YUM: Yellowdog Update Modifier, rpm的前端程序,用来解决软件包相关依赖性,可以在多个库之间定位软件包,up2date的替代工具        &nbsp…

    Linux干货 2016-08-24
  • N29 第一周作业

    1、描述计算机的组成及其功能。
    2、按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别。
    3、描述Linux的哲学思想,并按照自己的理解对其进行解释性描述。
    4、说明Linux系统上命令的使用格式;详细介绍ifconfig、echo、tty、startx、export、pwd、history、shutdown、poweroff、reboot、hwclock、date命令的使用,并配合相应的示例来阐述。
    5、如何在Linux系统上获取命令的帮助信息,请详细列出,并描述man文档的章节是如何划分的。
    6、请罗列Linux发行版的基础目录名称命名法则及功用规定

    Linux干货 2018-03-05
  • N26-博客作业-week16

    1、源码编译安装LNMP架构环境 IP:192.168.12.137 Nginx:1.8.1 MariaDB:5.5.57 PHP:5.6.31 安装开发环境包组 yum groupinstall “Development Tools” “Server Platform Development” -y 安装开发程序包 yum install pcre-dev…

    2017-08-04
  • week5

    1、显示当前系统上root、fedora或user1用户的默认shell; useradd fedora useradd user1 egrep "^(root|fedora|user1)" /etc/passwd | cut -d: -f1,7 2、找出/e…

    Linux干货 2016-11-24
  • pxe和dhcp服务——引导安装操作系统

    BootStraping:系统提供(OS Provision) pxe –> preboot excution environment, Intel cobbler –> Cobbler is a network install server.  Cobbler supports PXE, ISO virtual…

    Linux干货 2016-11-05

评论列表(1条)

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

    写的很详细,赞一个