一、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上的时间,软件时钟是指系统上的时间,当两个时间不同时,可能会出现某些错误,因此我们必须了解如何设置这两个时间。常用的命令如下:

  1. //执行以下命令必须先切换到root用户(只有root用户可以执行时钟命令)
  2. [chanshuyi@localhost ~]$ su root
  3. Password:
  4.  
  5. # hwclock 查看硬件时钟
  6. # date 查看软件时钟
  7.  
  8. # hwclock –hctosys 用硬件时间设置系统时间(软件时间)
  9. # hwclock –systohc 用软件时间设置硬件时间
  10.  
  11. #hwclock –set –date=”8/9/2003 16:45:05”
  12. 设置硬件时间为20138916:45:05。其中时间格式为:MMDDYYYY hh:mm:ss
  13.  
  14. #date 121511302010.38
  15. 设置软件时间为2010121511: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下),它的文件内容如下:

  1. # grub.conf generated by anaconda
  2. #
  3. # Note that you do not have to rerun grub after making changes to this file
  4. # NOTICE: You have a /boot partition. This means that
  5. # all kernel and initrd paths are relative to /boot/, eg.
  6. # root (hd0,0)
  7. # kernel /vmlinuz-version ro root=/dev/sda2
  8. # initrd /initrd-[generic-]version.img
  9. #boot=/dev/sda
  10. default=0
  11. timeout=5
  12. splashimage=(hd0,0)/grub/splash.xpm.gz
  13. hiddenmenu
  14. password --md5 $1$HRvb$omlc/8yCiCaR0reqyM.kn1
  15. title CentOS (2.6.32-431.el6.x86_64)
  16. root (hd0,0)
  17. 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
  18. 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文件内容如下:

  1. # inittab is only used by upstart for the default runlevel.
  2. #
  3. # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
  4. #
  5. # System initialization is started by /etc/init/rcS.conf
  6. #
  7. # Individual runlevels are started by /etc/init/rc.conf
  8. #
  9. # Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
  10. #
  11. # Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
  12. # with configuration in /etc/sysconfig/init.
  13. #
  14. # For information on how to write upstart event handlers, or how
  15. # upstart works, see init(5), init(8), and initctl(8).
  16. #
  17. # Default runlevel. The runlevels used are:
  18. # 0 - halt (Do NOT set initdefault to this)
  19. # 1 - Single user mode
  20. # 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
  21. # 3 - Full multiuser mode
  22. # 4 - unused
  23. # 5 - X11
  24. # 6 - reboot (Do NOT set initdefault to this)
  25. #
  26. 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 – 重启

在命令行下,如果要查看当前运行级别以及切换运行级别,可以用如下命令:

  1. //查看当前的运行级别
  2. #runlevel
  3. S 3 S是指上次的运行级别,3是指现在的运行级别)
  4.  
  5. //运行级别的切换
  6. #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系统引导流程的更多相关文章

  1. Linux——系统引导流程学习简单笔记

    开启电源: 固件 firmware(CMOS/BIOS) → POST 加电自检 对硬件就行检查 ↓ 自举程序 BootLoader(GRUB) → 载入内核 ↓ 载入内核 Kernel 1:驱动硬件 ...

  2. linux系统引导流程

    1.固件:硬件和软件结合.加电自检是我们按下电源会检测硬件像cpu.内存.网卡等信息.(从硬件层次检测硬件是否可用) 固件设置实例:设置时间 软件时间和硬件时间: [root@VM_0_12_cent ...

  3. linux 启动引导流程

    课程大纲: Linux引导流程 Linux运行级别 Linux启动服务管理 GRUB配置与应用 启动故障分析与解决 系统引导流程 1.固件firmware(CMOS(固化在硬件上的程序与硬件统称)/B ...

  4. linux系统引导过程

    linux系统引导过程 linux-0.11引导时,将依次运行BIOS程序.bootsect.s.setup.s和head.s,完成引导过程后进入到main函数运行.BIOS完成硬件的检查与初始化等工 ...

  5. Linux系统初始流程

    一.0S(内核的功能):平台类软件(通用软件) 进程管理:进程调度器(scheduler)维持一个任务结构(task_struct) 内存管理:如何使用线性地址空间,如何分段,如何分页,如何避免内存( ...

  6. Linux 开机引导流程

    Linux 开机启动流程 BIOS(Basic Input Output System)是 PC 机启动时加载的第一个软件.其实,它是一组固化到计算机主板上一个芯片上的程序,它保存着计算机最重要的输入 ...

  7. linux系统开机流程详解

    今天,我们主要来谈谈计算机系统的启动流程 1.BIOS启动 BIOS是写入到主板上的一个韧体(韧体就是写入到硬件上的一个软件程序).开机的时候,BIOS是计算机系统会主动执行的第一个程序.BIOS主要 ...

  8. Linux系统——引导过程与服务控制

    一.Linux开机启动原理(十步) (1)开机自检BIOS 开机检测,主板检测 (2)MBR引导 硬盘512字节 (3)GRUB菜单 操作系统菜单 (4)加载内核(kernel) 启动操作系统核心,根 ...

  9. 【Linux系统引导过程】

    *** 第一步 开机自检 根据主板BIOS中的启动顺序,移交系统控制权. 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它. 这是因为BIO ...

随机推荐

  1. 纪中集训 Day 7

    今天超级不爽啊啊啊啊 尼玛我三道题都想出来了就是没对一道,第一题没理负数尼玛题目没告诉我,第二题尼玛题目也没说最近的点是第(l+r)/2而不是距离为(a[l]+a[r])/2啊啊啊啊,第三题没打GCD ...

  2. 解读Java内部类

    一.基本概念: 顾名思义,内部类存在于外部类当中,依附于外部类.就像眼睛和脑袋的关系一样. 二.几点说明: 1.内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以 ...

  3. php代码审计--sql注入

    sql注入是web安全中最常见,也是平常中危害最大的漏洞. 最近在学习代码审计,拿自己审核的一段代码做个笔记. 1.sql语句拼接可能引起sql注入 很多偷懒的程序员对于没有过滤的参数,直接将其拼接到 ...

  4. 一张图理解RACSignal的Subscription过程

    通过下面一张图理解RACSignal的调用过程: 创建signale RACSignal通过子类[RACDynamicSignal createSignal:]方法获得Signal,并将disSubs ...

  5. JQUERY写大图轮播;附jquery的hover()方法、animate()方法、find()方法

    思想:黑框设置超出部分隐藏. 红框往左移动,通过判断红框左边框距离黑框左边框的像素值,来实现红框的移动. 绿框在最上层,放每张图片的说明和序号. 一:html部分(大框.图片部分.箭头部分.图片介绍部 ...

  6. 最简单的 RabbitMQ 监控方法 - 每天5分钟玩转 OpenStack(158)

    这是 OpenStack 实施经验分享系列的第 8 篇. 先来看张图:这是 Nova 的架构图,我们可以看到有两个组件处于架构的中心位置:数据库和Queue.数据库保存状态信息,而几乎所有的 nova ...

  7. TokuDB性能测试报告

    一 .背景介绍 近年来,TokuDB作为MySQL的大数据(Big Data)存储引擎受到人们的普遍关注.其架构的核心基于一种新的叫做分形树(Fractal Trees)的索引数据结构,该结构是缓存无 ...

  8. Javascript把数据从一个页面的层传递到另一个页面层里面

    背景:昨天头脑发热投了某一家国企的计算机类岗位(说是有前端岗位),通过找同学内推,虽然也笔试了一大堆题目(行测题,计算机网络,http协议,英译汉,古诗文默写,自己把品质排序并且进行200字以上的阐述 ...

  9. Java面试11|Maven与Git

    git的命令一定要掌握,如果学习可以参考:廖雪峰的官方网站 1.Maven 生命周期及Maven多项目聚合与继承 Maven的生命周期分如下的9个阶段. (1)clean 清理自动生成的文件,也就是t ...

  10. iOS下的界面布局利器-MyLayout布局框架

      Swift:TangramKit: https://github.com/youngsoft/TangramKit OC:MyLayout: https://github.com/youngsof ...