PXE | 开关机流程

linuxPXE

主要阶段

引导的主要6个阶段

  1. 从MBR中读取引导加载程序boot loader
  2. 加载并初始化内核;
  3. 检测和配置设备;
  4. 创建内核进程;
  5. 系统管理员干预(单用户模式)
  6. 执行系统启动脚本

boot squene

1.1 BIOS

SMPS(Switching Mode Power Supply)即开关变换器,即服务器电源,当电压检查没问题后,SMPS会发送POWER GOOD信号给主板计数器。一旦主板收到该信号则会停止向CPU发送reset信号。CPU就开始工作了。然后ROM上有个代码固定跳转到启动区。

  1. 按下开机后执行POST(Power-On Self-Test)对硬件进行自检,确保所有硬件工作正常。按F12F2进入BIOS设置。主要检测如下硬件:

    • Timer IC计数器
    • DMA controller
    • CPU
    • Video ROM

而完整自检则还会检测如下信息:

- 主板

- 键盘

- 打印机口

- 硬盘灯

冷重启和热重启区别:

当进行热重启时,将会跳过完整自检,冷重启会执行完整检测

  1. 检查服务器是cord boot还是warm boot
  2. CMOS里接收存储的时间、日期和一些重要系统信息。
  3. BIOS检查都是好的后开始在MBR上搜寻可用的操作系统启动字段
  4. 一旦BIOS找到可用MBR后,开始执行启动并执行磁盘或CD等设备的第一段512字节启动字段(sector 0),找不到第一个会找第二个启动项,如果找完也无法找到,则会使用告警“No boot device found”

初始化代码主要从BIOS中加载,一旦BIOS确定从哪些设备上引导系统,它就会加载设备上开头512字节的数据段,即MBR。MBR里有个程序会告诉计算机从哪个分区加载第二阶段的引导程序。

1.2 MBR

  1. 在BIOS执行可用的MBR后,MBR开始查找可用的主分区(primary parition)并标记为可启动项,一般是/dev/hda或sda等

  2. MBR找到可用主分区后开始执行该分区的第一个512字节,即第二级MBR,在LINUX上这个第二级MBR主要指LILOGRUB。MBR只要有3部分

    • 446字节主分区信息
    • 64字节分区表信息
    • 2字节MBR检查信息(Magic number)
  3. 由于分区表只有64bytes,而每个分区大小为16bytes,因此我们最多创建4个主分区(primary partition)。且扩展分区(extended)分区最多有一个。因此要么4个全是主分区,要么(1,2,3)个主分区+一个扩展分区。

1.2.1 LILO(老系统)

因为其太大,512字节无法装下,因此LILO分成了两部分:installerruntime模块,

  • installer:改模块存放在MBR上,而runtime模块则包含系统信息。
  • 当runtime模块执行时,它选择操作系统并转换内核

LILO不关心文件系统和boot镜像,所以会原生态的加载他们。

1.2.2 GRUB

  1. GRUB MBR包含446字节的主引导部分和64字节的分区表
  2. GRUB会列出所有已安装系统的引导界面并让用户选择
  3. 用户选择系统后,GRUB会开始加载内核
  4. grub的配置文件为/boot/grub/grub.conf,而/etc/grub.conf文件做了个链接到改配置文件。
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-194.el5PAE)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/
initrd /boot/initrd-2.6.18-194.el5PAE.img

1.3 Kernel

内核在grub配置文件中用root=标识的。

一旦GRUB或LILO移交控制权给内核后,内核将会执行下列任务:

  1. 初始化设备和加载initrd模块。(Initrd ramdisk或者initrd是指一个临时文件系统,它在启动阶段被Linux内核调用。initrd主要用于当“根”文件系统被挂载之前,进行准备工作。包含一些编译后的驱动),类似WIN PE系统,比如大白菜装机
  2. 挂载根分区文件系统
  3. 如果kernel挂载文件系统失败,则会出现“kernel panic”。
  4. 内核越小越好,因此内核首先是个压缩文件,其次大部分驱动和工具然间由initrd提供。一般文件名为initramfs
  5. /boot目录下存放内核和initrd文件

grub默认从/boot/grub/menu.lst/boot/grub/grub.conf中读取配置,引导时修改grub、内核的配置不保留,而修改grub.conf文件则会保留

内核执行步骤:

1. 配置硬件和内存

2. 解压initrd镜像并挂载和加载必须的驱动

3. 利用insmod和rmmod等加载内核模块

4. 查找硬盘如LVM或raid

5. 卸载initrd镜像并释放内存

6. 内核通过只读方式读取grub.conf文件来挂载指定的root parition

7. 运行init程序

1.4 Init

  1. 内核加载后,开始在/sbin/init中查找init并执行.
  2. 所以linux第一个开始执行的进程是init进程。
  3. init会开始读取/etc/inittab文件并开始设置路径、swap、检查文件系统等。
  4. 运行所有启动项脚本(/etc/rd.d/,/etc/rc.boot/
  5. 读取/etc/inittab文件中的运行级别并启动系统。

inittab一般按照如下顺序执行:

- 1. 根据/etc/sysconfig/network判断系统是否网络启动

- 2. 挂载/proc并判断驱动程序状态

- 3. 设置系统时间

- 4. 启用虚拟内存,激活和挂载swap分区,/etc/fstab

- 5. 设置主机名和认证信息、网络服务

- 6. 判断根系统并挂载

- 7. 根据/etc/fstab信息挂载文件系统

- 8. 挂载一些可插拔设备和声卡等设备

- 9. 判断磁盘信息和raid信息

- 10. 挂载所有特定分区/etc/fstab

- 11. 执行其他系统任务

1.5 创建内核进程

init进程号始终为1.

ps aux命令中可以看到一些用[]的进程,这些都是内核进程

[watchdog/2]进程后面有数字的标识在哪个处理器上运行。

1.6 启动脚本

脚本一般保存在/etc/init.d下,运行级别在/etc/inittab文件中定义

drwxr-xr-x 2 root root 4096 Apr 20  2018 init.d
drwxr-xr-x 2 root root 4096 Apr 19 2018 rc0.d
drwxr-xr-x 2 root root 4096 Apr 19 2018 rc1.d
drwxr-xr-x 2 root root 4096 Apr 19 2018 rc2.d
drwxr-xr-x 2 root root 4096 Apr 19 2018 rc3.d
drwxr-xr-x 2 root root 4096 Apr 19 2018 rc4.d
drwxr-xr-x 2 root root 4096 Apr 19 2018 rc5.d
drwxr-xr-x 2 root root 4096 Apr 19 2018 rc6.d
-rwxr-xr-x 1 root root 619 Apr 21 2018 rc.local

rclevel.d表示不同的运行级别所读取的脚本。而里面的脚本启动和关闭顺序不同

lrwxrwxrwx 1 root root 20 Apr 25 13:06 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx 1 root root 17 Apr 25 13:06 S10network -> ../init.d/network

init从低级别向高级别过渡时,按照递增的顺序start所有带S开头的脚本,而从高级别向低级别过渡时,则按照数字递减的顺序stop所有带K的脚本

引导过程中大部分配置文件是调整/etc/sysconfig/文件来实现。常用的有

  • clock:调整时钟
  • console:总为空
  • crond:传给cron这个守护进程的参数
  • i18n:系统的本地设置,日期、语言等
  • init:配置启动脚本发出消息的显示方式
  • keboard:设置键盘
  • mouse:设置鼠标
  • network:设置网络,主机名、网关、转发机制等
  • network-scripts:网络补充脚本和网络配置文件
  • sendmail:邮件设置

1.7 关机

shutdown -h = halt

shutdown -r = reboot


enter description here

PXE | 开关机的更多相关文章

  1. Azure Automation (3) 定期将某个Azure订阅下的所有虚拟机开关机

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China. 在笔者之前的文章中,我们介绍了使用Azure Automation ...

  2. Azure Automation (4) 按照Azure虚拟机的机器名,设置开关机

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China服务. 在有的时候,我们不需要将所有的虚拟机进行开关机. 本文介绍的脚 ...

  3. windows开关机时间记录

    1. 开机时间记录批处理文件,kai.bat @echo off echo %date% %time% 开机 >>D:\开关机记录\开关机时间.txt 2. 关机时间记录批处理文件,gua ...

  4. 简述HP iLO中的几种开关机选项

    ILO是intergrated Light-Out的缩写,是HP的远程管理功能,它可以实现远程开关机.远程安装.远程连接等功能. 笔者刚接触HP服务器时对四个关于开关机的选项非常困惑,不明其中区别.此 ...

  5. Linux基础---开关机与帮助

    1.X window与文字模式的切换 通常我们也称文字模式为 终端机接口, terminal或console!Linux预设的情况下, 会提供六个Terminal来让使用者登入,切换的方式为: [Ct ...

  6. ADB对手机进行开关机测试

    Verify issue 时,其中有条要对手机进行开关机100次,由于只有ADB环境,只能用批处理来写脚本了,代码如下: ::需配置ADB环境,开启Debug模式 ::start循环 :start s ...

  7. Windows在生产体系Android开关机动画

    在Windows根据系统.办Android开关机动画,几个需要注意的问题: 1.压缩的选择 2.压缩的格式: 版权声明:本文博客原创文章,博客,未经同意,不得转载.

  8. 解决Ubuntu开关机动画不正常方法

    联想的笔记本,显卡NVIDIA GT218M,默认使用开源的驱动,但挂起后,再唤醒就黑屏回不到桌面. 1.解决办法:安装NVIDIA专有驱动 $sudo apt-get install nvidia- ...

  9. Linux常用命令(第二版) --系统开关机命令

    系统开关机命令 说明-服务器不会经常的关机,重启,没有故障,服务器不会关机.因此这些命令就显得不是很常用. 1.shutdown /usr/sbin/shutdown e.g. shutdown -h ...

随机推荐

  1. 网络传输 buf 封装 示例代码

    网络传输 buf 封装 示例代码 使用boost库 asio // BufferWrapTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h&quo ...

  2. Json中对日期的处理

    前言:Json对日期的处理很特别,我们不能简单的转换而得到我们想要的结果,需要进行特殊处理 一.JSon序列化和反序列化对日期的处理 JsonHelper类: using System.IO; usi ...

  3. atom编辑器使用“apm install”无法响应的解决方案

    工具:shadowsocks 利用ss建立代理服务,之后apm --help,得到apm的配置命令: apm - Atom Package Manager powered by https://ato ...

  4. JSP内置对象page/pageContext/Config/Exception

    Config对象 config对象实是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一 ...

  5. 延迟执行(Invoke 函数)和消息发送(SendMessage 函数)

    Invoke 函数需要继承 MonoBehaviour 类后才能使用. Invoke(string str,float a):a 秒后执行名为 str 函数(只会调用一次). Invoke(strin ...

  6. CPP全面总结(涵盖C++11标准)

    OOP之类和对象 1. this指针的引入 每个成员函数都有一个额外的隐含的形参,这个参数就是this指针,它指向调用对象的地址.默认情况下,this的类型是指向类类型非常量版本的常量指针.可以表示成 ...

  7. ASP.NET MVC下使用AngularJs语言(九):日期时间处理与显示

    当在angularjs去显示一个时间时,如原原本本去显示这个值,它将显示一个怪怪的字符串,其实它就是被系列化json之后的字符串.如:一个空值显示为日期时间: 如果非空值显示为日期时间的情形: 为了能 ...

  8. Linux和Windows下tomcat开机自启动设置

    Linux下tomcat的开机自启动设置 1.修改系统文件rc.local:vi /etc/rc.d/rc.local rc.local是给用户自定义启动时需要执行的文件,和windows里面的“启动 ...

  9. Flask中的模板语言jinja2

    jinja2介绍 jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用. jinja2的优点 jin ...

  10. 机器翻译质量评测算法-BLEU

    机器翻译领域常使用BLEU对翻译质量进行测试评测.我们可以先看wiki上对BLEU的定义. BLEU (Bilingual Evaluation Understudy) is an algorithm ...