9.Linux系统引导流程
一、Linux系统引导流程
当我们按下主机电源键的那时候开始,主板上的CMOS/BIOS模块将进行固件自检,以此检查各个硬件是否正确连接。
在Linux引导流程中,一般可以分为以下几个主要过程:
1、固件firmware(CMOS/BIOS) -> POST(Power On Self Test),即加电自检
2、自举程序BootLoader(GRUB) -> 将系统载入内核
3、载入内核Kernel -> 驱动硬件
4、启动进程init -> 服务启动
5、读取执行配置文件/etc/inittab
1、固件firware(CMOS/BIOS)
在按下电源键后,LINUX进行加电自检。在这个过程中,我们可以随时按下F2或F11等按钮,进入BIOS设置,对一些常见的固件设置进行设置。常用的固件设置包括:
· 安全设置
· 可引导介质列表
· 可引导介质搜索顺序(启动顺序)
· 等等
这一部分其实跟进入Windows的BIOS是基本上一样的。
此外,我们还可以在进入系统的时候使用一些命令查看硬件和软件的时钟。
硬件时钟是指CMOS上的时间,软件时钟是指系统上的时间,当两个时间不同时,可能会出现某些错误,因此我们必须了解如何设置这两个时间。常用的命令如下:
//执行以下命令必须先切换到root用户(只有root用户可以执行时钟命令) [chanshuyi@localhost ~]$ su root Password: # hwclock 查看硬件时钟 # date 查看软件时钟 # hwclock –hctosys 用硬件时间设置系统时间(软件时间) # hwclock –systohc 用软件时间设置硬件时间 #hwclock –set –date=”8/9/2003 16:45:05” 设置硬件时间为2013年8月9日16:45:05。其中时间格式为:MMDDYYYY hh:mm:ss #date 121511302010.38 设置软件时间为2010年12月15日11:30:38秒。时间格式为:MMDDHHmmYYYYSS
注:查看命令帮助时,可以先用“命令 --help”查看剪短帮助。当查找不到想要的帮助信息时,可以用“man + 命令”查看更详细的帮助信息。
2、自举程序BootLoader(GRUB)
在Linux中,当CMOS/BIOS加点自检完成后,它就会去读取磁盘第一个扇区的bootloader程序(在Linux中对应的bootloader程序是GRUB)。在Linux中广泛使用的Bootloader就是GRUB。 在Windows下也有一个bootloader叫ntldr,即NT loader。所有bootloader最重要的一个功能就是将系统载入内核。在Linux下所说的grub是一个配置文件,它的文件路径是/boot/grub/grub.conf(它有一个软链接文件,存放在/etc/grub.conf下),它的文件内容如下:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda2
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
password --md5 $1$HRvb$omlc/8yCiCaR0reqyM.kn1
title CentOS (2.6.32-431.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=98c8f16d-e03b-4a4b-a942-75bbacbae9aa rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img
其中“#”号开头的行表示注释。
default = 0
表示缺省启动哪个系统。(因为硬盘可能装有多个系统,0表示第一个系统,1表示第二个系统,以此类推)
timeout = 5
表示留在启动界面多久之后没反应便自动进入默认选项
splashimage=(hd0,0)/grub/splash.xpm.gz
表示启动界面的图片
hiddenmenu
用于启动时隐藏菜单,除非在timeout之前按下ESC才能看到菜单
password --md5 $1$HRvb$omlc/8yCiCaR0reqyM.kn1
其中后面的“$1....kn1”字符串是设置grub密码后返回的一串密文,以后会说到。
title CentOS (2.6.32-431.el6.x86_64)
引导条目的名称。通常使用操作系统的名称做为标识,你可以自行更改这个名称。
root (hd0,0)
操作系统内核和引导文件所在的磁盘分区,并设置根目录(root)为硬盘的第一个分区(即root = /boot)。(hd0,0) 表示第一块硬盘的第一个分区,(hd0,2) 表示第一块硬盘的第3个分区,依次类推。
kernel
系统内核及 boot 命令用到的参数。
initrd
系统引导程序
注:kernel和initrd中指定的文件都是相对于root中所设置的硬盘分区,例如本例中的(hd0,0)是机器上的/boot分区,kernel的位置实际上是/boot//vmlinuz-2.6.32-431.el6.x86_64
其中title/root(hd0,0)/kernel/initrd这4行是一个整体,它代表一个系统引导信息。如果有多个系统,那么就会有多个tiel/root/kernel/initrd信息。
当自举程序grub读取到grub.conf配置文件时,根据grub.conf文件的配置,决定将哪个系统载入内核。
内核会做两件事情,一是在操作系统的层次上驱动所有硬件,二是启动init进程并由init进程去完成接下来的系统引导。
3、启动init进程
启动init进程后,init进程会去读取/etc/inittab配置文件。
读取Inittab配置文件时,init进程根据initdefault判断系统的运行级别。
之后读取/etc/rc.d/rd.sysinit脚本来完整系统的一些初始化命令(这个脚本是无论选择什么运行级别都会执行的,因此可以将需要初始化的一些指令放在这个脚本后面来执行)。
之后读取/etc/rd.d/rc脚本,根据缺省的运行级别initdefault的值,决定运行/etc/rc.d/rcN.d目录下的特定脚本(这个目录下的文件,以大写S开头的表示Start需要初始化,大写K的表示Kill不需要初始化的),来完成特定运行级别下的一些初始化命令(N指运行级别)。
当执行完rcN.d脚本后,系统就会进入相应的界面,提示我们输入用户名和密码,此时Linux的系统引导就结束了。
注:一些系统默认安装的目录都放在:/etc/rc.d/init.d目录下。
其中inittab文件内容如下:
# inittab is only used by upstart for the default runlevel. # # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # System initialization is started by /etc/init/rcS.conf # # Individual runlevels are started by /etc/init/rc.conf # # Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf # # Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf, # with configuration in /etc/sysconfig/init. # # For information on how to write upstart event handlers, or how # upstart works, see init(5), init(8), and initctl(8). # # Default runlevel. The runlevels used are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:5:initdefault:
其中最后一行“id:5:initdefault:”代表的意义是缺省启动Linux第5个运行级别。
这里设计两个知识点,一个是inittab文件中条目的格式,一个是Linux的运行级别。
· Linux的运行级别
0 – 表示关机,等于shutdown
1 - 单用户模式,只有root可以登录,且没有图形界面。一般情况下需要修复Linux的时候才进入此种模式。类似于Windows的安全模式。
2 – 多用户模式。与3共同,但与3相比没有NFS服务,即Network File System(Unix系列的一个文件共享机制)。是广泛使用的服务器模式。
3 – 多用户模式
4 – 没有使用的一种模式。你可以自己定义
5 – x11 系统默认启动的模式(图形化的多用户模式,与3相比就是多了图形化界面)
6 – 重启
在命令行下,如果要查看当前运行级别以及切换运行级别,可以用如下命令:
//查看当前的运行级别 #runlevel S 3 (S是指上次的运行级别,3是指现在的运行级别) //运行级别的切换 #init [0123456Ss] 或 #telinit [0123456Ss]
0123456分别代表对应的运行级别,S和s表示单用户模式即运行级别1。
· inittab文件中的条目格式
在inittab中,所有条目采用如下格式:id:run-levels:action:process
id:条目的标识符,包含4个字符以内的字母或数字(但在inittab文件中一般都是用两位字符)
run-levels:指定运行级别,可以指定多个
action:指定运行状态
process:指定要运行的可执行程序的完整路径
其中action的常用取值有:
initdefault:指定系统缺省启动的运行级别
sysinit:系统启动执行process中指定的命令
wait:执行process中指定的命令,并等其结束之后再运行其他命令
once:执行process中指定的命令,不等待其结束
ctrlaltdel:按下Ctrl+Alt+Del时执行process指定的命令
powerfail:当出现电源错误时执行process指定的命令,不等待其结束
powerokwait:当电源恢复时执行process指定的命令
respawn:一旦process指定的命令中止,便重新运行该命令
比如:上面的
“id:5:initdefault:”
initdefault表示指定系统缺省启动的运行级别,5表示指定运行级别为5。表示默认启动运行级别5(即X WINDOW)
“id::sysinit:/etc/hello.script”
sysinit表示系统启动执行process的命令,(范围)是所有的运行级别(空表示所有运行级别),(哪个命令)hello.script脚本对应的命令。这样就表示在系统启动的时候,无论哪个运行级别都执行hello.script脚本。
“id:5:wait:check.script”
表示在运行级别为5的时候,等待执行check.script脚本执行完毕后再继续执行其他指令。
二、Linux启动服务管理
1、人工启动服务
我们可以用“服务名 stop/restart/status/condrestart/reload”来查看或更改系统的服务。
如:“stop /etc/rc.d/init.d/sshd”
其中restart = stop + start,如果该服务已经关闭了,那么执行stop环节时会失败。
而condrestart = {stop} + start,其中的stop是选择执行的。如果服务已经关闭,那么stop就不会执行。否则会执行stop关闭服务。
2、设置自启动服务
设置服务自启动有三种方法,分别是:
· ln -s 设置软链接到对应的rcN.d目录下
范例:“ln -s /etc/rc.d/init.d/msg.script /etc/rc.d/rc3.d/S100msg.script”
· chkconfig 命令
chkconfig –list 查看所有服务在所有运行级别下的启动状态
chkconfig –list sshd 查看某个服务在所有运行级别下的启动状态
chkconfig --levels 2345 sshd off 设置sshd服务在2345运行级别下不启动
· ntsysv 命令
运行:“ntsysv --level 3”命令,查看所有运行级别3下的服务,用界面的方式设置启动与否。
其中已启动的用“*”表示,不想其启动用空格取消即可。
三、启动故障分析与解决
用dmesg命令可以检查引导期间的错误。配合grep命令可以快速查看某个硬件的引导是否出问题,如:
dmesg | grep hda 查看硬盘第一分区的引导是否出错
而查找系统日志/var/log/messages,可以查找可能被dmesg忽略的应用程序错误。
案例一:忘记root密码,进入单用户模式
因为进入单用户模式是只能用root用户进入,但是不需要密码。因此当我们忘记了root密码的时候,我们可以通过进入单用户模式更改密码,从而用新的密码进入系统。
步骤一:开机时按ESE键进入GRUB界面,按e进入编辑航模式,选择kernel行,再次按e键编辑,在新的界面的最后一行输入1或s,即可进入单用户模式。
步骤二:进入单用户模式后像更改其他密码一样,输入passwd root,再输入设置的密码即可。
因为只要接触到这台电脑的就可以随时重新设置密码,那会不会因此Linux系统就不安全呢?其实因为基本上所有的服务器都是所在机房中的,普通人是接触不到这些机器的,所以不用担心这个问题。另外,如果你还是担心的话,你可以给Linux设置一个GRUB密码,这样你在编辑GRUB条目的时候就必须先输入密码才能进入单用户模式。
案例二:设置GRUB密码
使用GRUB自带的grub-md5-crypt命令,如:
命令行下输入:“#grub-md-crypt ”之后按照提示即可。最后复制输出的加密后的密文字符串。
最后编辑grub配置文件,加入如下行:
password -md5 [密文字符串]
另外我们也可以通过:“md5crypg”命令生成加密后的密文字符串。
案例三:GRUB命令行下手动启动系统
当系统只能进入grub界面但没有菜单时,我们可以进入grub命令行下,通过输入grub.confing文件中的root/kernel/initrd三行命令,最后输入boot就可以手工引导系统来修复系统。

案例四:当无法进入命令模式的时候,如何修复系统
这种情况需要通过光驱启动,进入到命令行模式去排除错误
1、安装光盘到光驱,然后重启极其,在BIOS中设置用光驱引导
2、等安装界面弄出来后,按F5键,也就是linux rescue模式,然后在boot下输入linux rescue,然后就是回车一下,之后会进入 sh# 命令行下。
9.Linux系统引导流程的更多相关文章
- Linux——系统引导流程学习简单笔记
开启电源: 固件 firmware(CMOS/BIOS) → POST 加电自检 对硬件就行检查 ↓ 自举程序 BootLoader(GRUB) → 载入内核 ↓ 载入内核 Kernel 1:驱动硬件 ...
- linux系统引导流程
1.固件:硬件和软件结合.加电自检是我们按下电源会检测硬件像cpu.内存.网卡等信息.(从硬件层次检测硬件是否可用) 固件设置实例:设置时间 软件时间和硬件时间: [root@VM_0_12_cent ...
- linux 启动引导流程
课程大纲: Linux引导流程 Linux运行级别 Linux启动服务管理 GRUB配置与应用 启动故障分析与解决 系统引导流程 1.固件firmware(CMOS(固化在硬件上的程序与硬件统称)/B ...
- linux系统引导过程
linux系统引导过程 linux-0.11引导时,将依次运行BIOS程序.bootsect.s.setup.s和head.s,完成引导过程后进入到main函数运行.BIOS完成硬件的检查与初始化等工 ...
- Linux系统初始流程
一.0S(内核的功能):平台类软件(通用软件) 进程管理:进程调度器(scheduler)维持一个任务结构(task_struct) 内存管理:如何使用线性地址空间,如何分段,如何分页,如何避免内存( ...
- Linux 开机引导流程
Linux 开机启动流程 BIOS(Basic Input Output System)是 PC 机启动时加载的第一个软件.其实,它是一组固化到计算机主板上一个芯片上的程序,它保存着计算机最重要的输入 ...
- linux系统开机流程详解
今天,我们主要来谈谈计算机系统的启动流程 1.BIOS启动 BIOS是写入到主板上的一个韧体(韧体就是写入到硬件上的一个软件程序).开机的时候,BIOS是计算机系统会主动执行的第一个程序.BIOS主要 ...
- Linux系统——引导过程与服务控制
一.Linux开机启动原理(十步) (1)开机自检BIOS 开机检测,主板检测 (2)MBR引导 硬盘512字节 (3)GRUB菜单 操作系统菜单 (4)加载内核(kernel) 启动操作系统核心,根 ...
- 【Linux系统引导过程】
*** 第一步 开机自检 根据主板BIOS中的启动顺序,移交系统控制权. 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它. 这是因为BIO ...
随机推荐
- BZOJ 1095: [ZJOI2007]Hide 捉迷藏(线段树维护括号序列)
这个嘛= =链剖貌似可行,不过好像代码长度很长,懒得打(其实是自己太弱了QAQ)百度了一下才知道有一种高大上的叫括号序列的东西= = 岛娘真是太厉害了,先丢链接:http://www.shuizilo ...
- java学习之路
先来说一说我和it之间的不解之缘.准确来说,我接触it是从大二是我买的第一个手机开始的(国产的,展讯平台,能够运行mrp虚拟机),那时候还没有智能手机,或者说还不够普及,总之就是买不起.一次偶然的机会 ...
- 由于java.util.Arrays.asList(...)导致的异常
前言: Collections.toArray()与Arrays.asList() 是Java API提供的友好的相互转换工具,日常开发中用于列表和数组之间的转换非常方便,但今天测试时,发现一下隐藏的 ...
- .Net小白的第一篇博客
2016年8月8日,经过了一周的纠结.我决定放弃了,原来学了六年并且工作两年的学前教育,走上了开发的道路.我认为生活就应该这样,就应该充满挑战,而不是每天在重复相同的工作!作为插班生的我,于2016年 ...
- 每天一个linux命令(45)--telnet命令
每天一个Linux命令,今天是网络命令中的Telnet. Telnet 命令通常用来远程登录,Telnet 程序是基于 Telnet 协议的远程登录客户端程序.Telnet 协议是TCP/IP协议族中 ...
- 每天一个Linux命令(14)--head命令
head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然的就是查看档案的结尾啦. 1.命令格式: h ...
- yum的用法
yum check-update 检查可更新的所有软件包 yum update 下载更新系统已安装的所有软件包 yum upgrade 大规模的版本升级,与yum update不同的是,连旧的淘汰的包 ...
- PHP+Jquery+Ajax 实现动态生成GUID、加载GUID
GUID: 全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中 ...
- 简单总结在51cto平台的两日学习
许久未曾静下心写东西,希望这会是一个好习惯的开始. 一次偶然的机会,大概是160415在Applestore邂逅51cto,看了点评果断下载,着实是一款优秀的学习软件. 由于最近正在用python写自 ...
- Jenkins+Git 持续集成
持续集成是必要的! 希望达到的效果是:开发同事签入代码后,对应的站点可以自动实现更新.目前还只在在内部服务器上实现开发环境中的站点更新,不涉及到线上的发布. 目前使用Jenkins实现这样的持续集成. ...