linux开机启动流程

linux开机启动流程:


wKiom1fRFGORQGWiAACCp6aQIlY198.jpg


 

一、BIOS 加电自检 
当你按电源开关开机时,电脑会首先去启动BIOS(基本输入输出系统),BIOS一般是集成在主板上的. 
BIOS 的工作 
1.检测连接硬件,比如显卡,内存,磁盘等等,检测的目的是以后把这些设备信息提供给操作系统 
2.寻找启动磁盘,每一种BIOS都会有开机启动菜单,可以在菜单里设置以哪个设备启动系统 
比如:光驱,硬盘,网络等等,这个菜单可以设置多个选项,依照设置次序在设备上寻找启动信息 
3.找到了启动硬盘,接着BIOS就会在磁盘上找启动扇区,找到内核启动系统. 
1)先试着寻找第一个扇区,也就是主引导记录MBR(Master Boot Record) 
2)如果第一个扇区上没有没有存在操作系统,再去寻找标记为BOOT的分区. 
不论是MBR还是BOOT分区,存储操作系统的空间都只有446字节; 
如果没有在上面提到的位置找到操作系统的内核,那么BIOS就无法继续启动工作. 
而我们的内核往往会大于446个字节,存放在磁盘的其他位置上,既然446装不下内核,又为了能顺利的找到放在其他位置上的内核, 
人们想出了一个办法就在446字节里写了一个小程序,当BIOS试着启动操作系统时就会执行这个小程序,然后再由小程序来载入其他位置的内核.这个小程序就是启动载入器(boot loader) 
二、BOOT Loader 
linux的boot loader(上文提到的小程序) 常见的有两种:lilo grub 
因为lilo存在着一个1024柱面的限制,并且更改了磁盘上的启动信息文件后需要重新启动系统才能同步446字节的内容,因为lilo的缺陷,已经被grub所取代.现在的绝大多数类linux系统都采用grub做boot loader; 
grub则没有了lilo各种限制,而且方便到能修改系统文件的启动内容就可以立刻与446内容同步. 
那么我们就看看grub的内容 它存在于 /boot/grub中 
GRUB有几个重要的文件,STAGE1、STAGE1.5、STAGE2 
STAGE1:它只有512字节,通常放在MBR中,它的作用很简单,就是在系统启动时用于装载STAGE2并将控制权交给它。 
STAGE2:GRUB的核心,所有的功能都是由它实现。 
STAGE1.5:介于STAGE1和STAGE2之间,是它们的桥梁,因为STAGE2较大,通常都是放在一个文件系统当中的,但是STAGE1并不能识别文件系统格式, 
所以才需要STAGE1.5来引导位于某个文件系统当中的STAGE2。根据文件系统格式的不同,STAGE1.5也需要相应的文件,如:e2fs_stage1_5,fat_stage1_5,分别用于识别ext和fat的文件系统格式。它存放于1-63的柱面之间. 
引导顺序如下:STAGE1->;STAGE1.5->;STAGE2, 
主要的配置文件时 grub.conf 
里面选项含义: 
title:一个操作系统引动的标头,可以使多个 
root :指明所需文件存在于哪个磁盘哪个分区上 (hd0,0)表示第一个硬盘,第一个分区,可参考/boot/grub/device.map 
kernel:内核文件的名字,并且会有一些加载内核时的参数 or代表以只读方式加载 
initrd:包含一些附加的驱动程序

三、内核启动 
内核启动后会向bios查询电脑的所有硬件信息,然后自己接手下来管理这些设备,以便提供给linux使用 
内核会试着驱动这些设备,这些设备的驱动一部分包含在内核中,叫做静态驱动,一部分以模块的方式(动态)存放文件系统中,由 
于此时还未挂载任何文件系统,因此还不能使用文件系统中的模块,这里只能驱动在内核中存在的硬件驱动程序的对应设备.想驱动内核中未包含的硬件驱动就需要加载文件系统. 
内核会尝试挂载根文件系统,根文件系统至少包含 /etc /bin /sbin /lib /dev 这5大目录 
他们5个缺一不可.都会导致系统无法启动 
根文件系统挂载是以只读方式挂载的,因为这时linux还在启动阶段,并不稳定,避免破坏系统资料 
四、启动INIT服务 
顺利的挂载了根文件系统后,就会启动init服务 
内核会按 /sbin/init /etc/init /bin/init 顺序寻找init程序, 
如果找不到则内核报错 这里存在一个参数 init=/bin/sh 如果启动时指定了则最后执行/bin/sh 
而不会产生内核报错.也被称为快速启动,因为它忽略了很多启动初始化工作. 
启动init的目的就是为了初始化系统环境,启动了init就证明了内核已经顺利启动,接下来就由init服务来建立linux使用环境 
init做了什么?它会读取 /etc/inittab 文件,根据这个文件的信息来进行初始化工作. 
会执行三个脚本 /etc/rc.d/rc.sysinit /etc/rc.d/rc /etc/rc.d/rc.local 
rc.sysinit 主要的功能用来建立系统的基本环境 
启动udev selinux子系统 
udev负责产生 /dev中的文件,selinux负责增强系统的安全性 
设定核心参数 sysctl -p 加载 /etc/sysctl.conf 
设定系统时间 将硬件时间设定为系统时间 
加载键盘和交换分区 swapon -a -e 
设置主机名,挂载文件系统,并将根重新挂载为可读写的. 
加载动态驱动模块 
USB设备与RAID & LVM 
卸载 /initrd/ 目录

rc 脚本设置启动级别 linux中有许多不同的启动级别,不同的启动级别会制定不同的服务
根据指定rc的参数会对应执行 /etc/rc.d/rc[0-6].d/ 中的连接脚本文件 以S开头的则启动
rc.local 前两个脚本都是系统至关重要的脚本,如果我们想在启动过程中放置一些其他程序
应该使用rc.local脚本中 因为S99local存在于rc[2-5].d中
三个RC脚本执行完毕后,就会建立虚拟主控制台 执行 /bin/login 就提供了用户登陆界面了
如果是图形 L5级别的话,会启动X window登录界面
所有的启动就都已经完毕
用户环境初始化
输入用户名和密码系统验证,然后会执行
    /etc/profile
    /etc/profile.d/*.sh $HOME/.bash_profile
    /etc/bashrc
    $HOME/.bashrc

启动级别 
0 关机 
1 单用户 
2 多用户模式但带网络但不能远程登录 
3 不受限多用户模式 TUI 
4 保留 
5 图形模式 
6 重新启动 
查看启动级别 
# runlevel        或者 who -r
N 3 
N是上次的级别,3是当前级别 也就是说机器开机就是3级别 
切换级别 
init 5




设置开机自动写的服务

1 将自己所写的脚本放到/etc/init.d, 并将脚本加上执行权限chmod +x 脚本名

[root@centos6 rc.d]# ll -hi /etc/init.d

1179741 lrwxrwxrwx. 1 root root 11 Aug 17 13:35 /etc/init.d -> rc.d/init.d

[root@centos6 etc]# ll -di /etc/rc.d/init.d/

1179742 drwxr-xr-x. 2 root root 4096 Aug 25 06:21 /etc/rc.d/init.d/


2 在脚本中写入

#!/bin/bash

#chkconfig:35 88 22                         #35表示在级别3和级别5下开启此程序

                                                          #88表示开机时运行的优先级

                                                          #22表示关机时运行的优先级

#description:testsrv script

3 执行chkconfig –add 脚本名称,此时在/etc/rc.d/目录下的rc3.d和rc5.d中创建脚本的连接,K代表关机关闭顺序,S代表开机启动顺序


chkconfig命令:


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

chkconfig[–list] [name]

添加:

SysV的服务脚本放置于/etc/rc.d/init.d(/etc/init.d)

chkconfig–add name

#!/bin/bash

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

# chkconfig: LLLL nnnn

删除:

chkconfig–del name

修改指定的链接类型

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

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

作业

1、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd”

    

0 0 * * 2,4,7 cp -r /var/log/messages /logs/"messages-`date +%Y%m%d`"

2、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中

0 */2 * * * egrep "^M|^S" /proc/meminfo >> /tmp/meminfo.txt

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

(1)
zebra930zebra930
上一篇 2016-09-19
下一篇 2016-09-19

相关推荐

  • bash变量之位置参数变量

        什么是变量     变量是 bash 环境中非常重要的一个玩意儿,就是让某一个特定字串代表不固定的内容就是了,讲的更简单一点,我们可以“用一个简单的 "字眼" 来取代另一个比较复杂或者是容易变动的数据”。    &nbsp…

    Linux干货 2016-08-15
  • 正则表达式30分钟入门教程

    来园子之前写的一篇正则表达式教程,部分翻译自codeproject的The 30 Minute Regex Tutorial。 由于评论里有过长的URL,所以本页排版比较混乱,推荐你到原处查看,看完了如果有问题,再到这里来提出. 一些要说的话: 如果你没有正则表达式的基础,请跟着教程“一步步来”。请不要大概地扫两眼就说看不懂——以这种态度我写成什么样你也看不…

    2015-03-12
  • N21-兔锅-第四周作业

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。     cp -a /etc/skel /home/tuser1     chmod g-x /home/tuser1/     chmod o-x /home/t…

    Linux干货 2016-07-26
  • 8-2 用户组和权限管理

    用户组和权限管理     本节主要是:su、passwd、chage、chown、chgrp、chmod、umask等命令及文件的三种普通权限和三种特殊权限     切换用户或以其他用户身份执行命令:su su [options…] [-] [user[args…]] 切换用…

    Linux干货 2016-08-07
  • 第三周作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@localhost /]# who | cut -d ‘ ‘ -f 1  | sort -u root user1 或: [root@localhost /]# who | cut -d ‘ ‘ -…

    Linux干货 2017-02-24
  • centos7 yum源仓库网络共享

    一般yum源仓库需要两部分组成,一部分为rpm程序包,另一个就是repodata元数据组成。制作一个简单的网络共享yum源仓库,在制作网络共享服务器需要事先配备好你的yum源,以方便使用 1.安装网络共享yum源仓库服务 以ftp为例: (1)在centos7中是否有ftp,用rpm -q 对vsftpd程序包查看 [root@local…

    Linux干货 2017-04-23