系统启动(grub--centos5)

来源:互联网 发布:网络教育专升本哪个好 编辑:程序博客网 时间:2024/05/16 02:15

开机过程简单介绍:

  1. 主板上电,cpu硬件将cs:ip指向BIOS的程序入口,BIOS对主板各类硬件进行自检,
  2. BIOS读取MBR至内存,并将控制权限交给MBR中的程序 ,实际上也就是grub程序的stage1。
  3. stage1 联合stage1.5 实现第一阶段功能,识别boot分区的文件系统,并将位于文件系统上的stage2加载至内存,完成grub的加载启动工作,实际上grub也可 以算是一个具有特定功能的系统。
  4. grub运行显示菜单界面,提供菜单选项,根据选择或默认配置,加载内核及虚拟文件系统至内存,并将之解压,展开。并向内核传递参数,后将运行指针指向内核。
  5. 内核运行,借助initrd(ramdisk)识别根所在的文件系统,并以只读方式挂载根文件系统,探测硬件,加载驱动
  6. 执行init( sysv init)程序 , init会根据配置文件(/etc/inittab)决定系统的运行级别,并根据执行级别启动不同的脚本,通过脚本实现启动系统后台的各种服务,包括启动终端(/sbin/mingetty).mingetty会调用login程序实现用户登录 执行脚本/etc/rc.d/rc.sysinit 执行脚本rc 传递当前runlevel 调应指定文件夹rc{0..6}.d中的内容 ,启动后台服务/etc/rc.d/rc,调用启动脚本的顺序是按照*匹配到的顺序

grub

grub 程序介绍: grub是一个来自GUN项目的可以作用于多种系统的启动引导程序,grub可以引导计算机上的多个系统,gurb拥有自己的启动菜单,并且可以在加载内核时向系统中传递参数. grub,分为两个版本,grub,grub2. grub2重新实现了功能,所以grub并非意义上的grub升级版.grub 与grub2 并无相同性,运行的流程并不相同, grub 引导过程: grub程序相对于硬盘上的第一扇区即MBR过于庞大,446字节无法容纳grub的代码,所以grub被分割成了三部分分别存放在不同的位置, 第一部分存放在MBR之中,第二部分存放在MBR随后的扇区中(理论上吧),第三部分存放在/boot文件夹,或者boot分区.

以下为存在于第一扇区中的512字节[root@localhost ~]# hexdump -Cvn512 /dev/sda00000000  eb 48 90 10 8e d0 bc 00  b0 b8 00 00 8e d8 8e c0  |.H..............|00000010  fb be 00 7c bf 00 06 b9  00 02 f3 a4 ea 21 06 00  |...|.........!..|00000020  00 be be 07 38 04 75 0b  83 c6 10 81 fe fe 07 75  |....8.u........u|00000030  f3 eb 16 b4 02 b0 01 bb  00 7c b2 80 8a 74 03 02  |.........|...t..|00000040  80 00 00 80 00 f1 04 00  00 08 fa 90 90 f6 c2 80  |................|00000050  75 02 b2 80 ea 59 7c 00  00 31 c0 8e d8 8e d0 bc  |u....Y|..1......|00000060  00 20 fb a0 40 7c 3c ff  74 02 88 c2 52 f6 c2 80  |. ..@|<.t...R...|00000070  74 54 b4 41 bb aa 55 cd  13 5a 52 72 49 81 fb 55  |tT.A..U..ZRrI..U|00000080  aa 75 43 a0 41 7c 84 c0  75 05 83 e1 01 74 37 66  |.uC.A|..u....t7f|00000090  8b 4c 10 be 05 7c c6 44  ff 01 66 8b 1e 44 7c c7  |.L...|.D..f..D|.|000000a0  04 10 00 c7 44 02 01 00  66 89 5c 08 c7 44 06 00  |....D...f.\..D..|000000b0  70 66 31 c0 89 44 04 66  89 44 0c b4 42 cd 13 72  |pf1..D.f.D..B..r|000000c0  05 bb 00 70 eb 7d b4 08  cd 13 73 0a f6 c2 80 0f  |...p.}....s.....|000000d0  84 f0 00 e9 8d 00 be 05  7c c6 44 ff 00 66 31 c0  |........|.D..f1.|000000e0  88 f0 40 66 89 44 04 31  d2 88 ca c1 e2 02 88 e8  |..@f.D.1........|000000f0  88 f4 40 89 44 08 31 c0  88 d0 c0 e8 02 66 89 04  |..@.D.1......f..|00000100  66 a1 44 7c 66 31 d2 66  f7 34 88 54 0a 66 31 d2  |f.D|f1.f.4.T.f1.|00000110  66 f7 74 04 88 54 0b 89  44 0c 3b 44 08 7d 3c 8a  |f.t..T..D.;D.}<.|00000120  54 0d c0 e2 06 8a 4c 0a  fe c1 08 d1 8a 6c 0c 5a  |T.....L......l.Z|00000130  8a 74 0b bb 00 70 8e c3  31 db b8 01 02 cd 13 72  |.t...p..1......r|00000140  2a 8c c3 8e 06 48 7c 60  1e b9 00 01 8e db 31 f6  |*....H|`......1.|00000150  31 ff fc f3 a5 1f 61 ff  26 42 7c be 7f 7d e8 40  |1.....a.&B|..}.@|00000160  00 eb 0e be 84 7d e8 38  00 eb 06 be 8e 7d e8 30  |.....}.8.....}.0|00000170  00 be 93 7d e8 2a 00 eb  fe 47 52 55 42 20 00 47  |...}.*...GRUB .G|00000180  65 6f 6d 00 48 61 72 64  20 44 69 73 6b 00 52 65  |eom.Hard Disk.Re|00000190  61 64 00 20 45 72 72 6f  72 00 bb 01 00 b4 0e cd  |ad. Error.......|000001a0  10 ac 3c 00 75 f4 c3 00  00 00 00 00 00 00 00 00  |..<.u...........|000001b0  00 00 00 00 00 00 00 00  5e 49 0a 00 00 00 80 20  |........^I..... |000001c0  21 00 83 aa 28 82 00 08  00 00 00 00 20 00 00 aa  |!...(....... ...|000001d0  29 82 82 bf 78 87 00 08  20 00 00 00 40 00 00 bf  |)...x... ...@...|000001e0  79 87 83 fe ff ff 00 08  60 00 00 f8 1f 02 00 00  |y.......`.......|000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|00000200

第二部分,存在位置并不确定,可能是紧随其后的一段扇区内,也可能是鬼知道的一段地方.

[root@localhost ~]# hexdump -Cvn2048 /dev/sda |sed -n '32,$p'000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|00000200  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|00000210  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|00000220  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|00000230  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|00000240  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|00000250  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|000007b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|000007c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|000007d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|000007e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|000007f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|00000800[root@localhost ~]#以上数据为MBR后的数据 可见第二部分并不在这里那么,
/boot/grub/文件夹下的内容:[root@localhost grub]# lsdevice.map     grub.conf         minix_stage1_5     stage2e2fs_stage1_5  iso9660_stage1_5  reiserfs_stage1_5  ufs2_stage1_5fat_stage1_5   jfs_stage1_5      splash.xpm.gz      vstafs_stage1_5ffs_stage1_5   menu.lst          stage1             xfs_stage1_5[root@localhost grub]#

假设两种情况:

  1. 第二部分存放在第一部分之后,都存放于裸磁盘.也就是只要主板可以识别到硬盘就可以从磁盘中将第一部分,以及第二部分读取置内存.
  2. 第二部分在见鬼的地方,之后的第一部分加载第二部分,只要成功的加载了第二部就算达成目的.

注:/boot必须是简单的文件系统,不能是raid或lvm等高级文件系统.

grub 配置文件 grub文件存放位置/boot/grub/grub.conf[root@localhost grub]# lsdevice.map     grub.conf         minix_stage1_5     stage2e2fs_stage1_5  iso9660_stage1_5  reiserfs_stage1_5  ufs2_stage1_5fat_stage1_5   jfs_stage1_5      splash.xpm.gz      vstafs_stage1_5ffs_stage1_5   menu.lst          stage1             xfs_stage1_5[root@localhost grub]#
配置文件内容:[root@localhost ~]# cat /boot/grub/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/sda3#          initrd /initrd-[generic-]version.img#boot=/dev/sdadefault=0 默认的启动项, 启动项以taitle为标记.timeout=5  启动等待时间 , splashimage=(hd0,0)/grub/splash.xpm.gz启动时的背景图片hiddenmenu 隐藏启动的菜单title CentOS 6 (2.6.32-642.el6.x86_64)  title,标记符,至下一title之间为一个选项,以及定义选项的名称root (hd0,0) 声明grub的根分区,也就是grub所在的分区.boot分区.与linux的分区系统不同. kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=7045d7f6-45a3-457d-8911-9c5d809be102 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet  声明内核位置,以grub 的根分区为起点,不声明的情况下也可以使用 (hd0,0)表示,以只读的方式挂载linux 的根分区.initrd /initramfs-2.6.32-642.el6.x86_64.img 声明虚拟的文件系统的位置. 声明顺序必须为先内核,然后虚拟文件系统[root@localhost ~]#

sysv

运行级别:

运行级别的说明:0:关机,1:单用户模式2:无网络的单用户模式3:基于命令行的完全模式4:保留的运行模式5:图形模式6:重启模式

inittab 文件格式:

每行只能定义一个动作或者任务。这是一个配置文件并不是脚本,不能以程序的思路去看配置,配置时需要符合固定规范。且执行任务的是init程序,配置文件只提供init的配置。生命一号确实有效,一下午悟了好多。走出了好多误区。id:可以运行的级别:执行后续任务的方式:执行的任务id:标签,可以随意指定,但要求是唯一的,可以运行的级别:指定后续的任务可以运行的级别,就是当前运行级别是指定的级别的其中一个时,才会触发,后续任务。可以填写多个运行级别,也可以为空,为空则默认匹配所有运行级别。执行后续任务的方式:wait :切换或进入到该级别运行一次,系统启动时进入默认级别,也算在内。respawn :当执行的任务关闭时,执行。sysinit :系统初始化,固定格式 id随意:级别为空即所有级别:sysinit:/etc/rc.d/rc.sysinit(默认系统初始化的脚本)inindefaule :系统的默认级别,同样也是固定格式。id随意:默认级别:initdefaule:(为空)执行的任务:全路径,可以传递参数。
inittab 文件格式如下 [root@localhost ~]# cat /etc/inittab # inittab       This file describes how the INIT process should set up#               the system in a certain run-level.# Author:       Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>#               Modified for RHS Linux by Marc Ewing and Donnie Barnes# Default runlevel. The runlevels used by RHS 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: 设置的默认启动级别为5 # System initialization.si::sysinit:/etc/rc.d/rc.sysinit 设置系统初始化脚本l0:0:wait:/etc/rc.d/rc 0 切换或进入该级别则执行任务 /etc/rc.d/rc 并传递参数0l1:1:wait:/etc/rc.d/rc 1切换或进入该级别则执行任务 /etc/rc.d/rc 并传递参数1l2:2:wait:/etc/rc.d/rc 2切换或进入该级别则执行任务 /etc/rc.d/rc 并传递参数2l3:3:wait:/etc/rc.d/rc 3切换或进入该级别则执行任务 /etc/rc.d/rc 并传递参数3l4:4:wait:/etc/rc.d/rc 4切换或进入该级别则执行任务 /etc/rc.d/rc 并传递参数4l5:5:wait:/etc/rc.d/rc 5切换或进入该级别则执行任务 /etc/rc.d/rc 并传递参数5l6:6:wait:/etc/rc.d/rc 6切换或进入该级别则执行任务 /etc/rc.d/rc 并传递参数6# Trap CTRL-ALT-DELETEca::ctrlaltdel:/sbin/shutdown -t3 -r now# When our UPS tells us power has failed, assume we have a few minutes# of power left.  Schedule a shutdown for 2 minutes from now.# This does, of course, assume you have powerd installed and your# UPS connected and working correctly.  pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"# If power was restored before the shutdown kicked in, cancel it.pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"# Run gettys in standard runlevels1:2345:respawn:/sbin/mingetty tty1在 2345 级别时执行 /sbin/mingetty 如果任务关闭则重新执行2:2345:respawn:/sbin/mingetty tty2在 2345 级别时执行 /sbin/mingetty 如果任务关闭则重新执行3:2345:respawn:/sbin/mingetty tty3在 2345 级别时执行 /sbin/mingetty 如果任务关闭则重新执行4:2345:respawn:/sbin/mingetty tty4在 2345 级别时执行 /sbin/mingetty 如果任务关闭则重新执行5:2345:respawn:/sbin/mingetty tty5在 2345 级别时执行 /sbin/mingetty 如果任务关闭则重新执行6:2345:respawn:/sbin/mingetty tty6在 2345 级别时执行 /sbin/mingetty 如果任务关闭则重新执行# Run xdm in runlevel 5x:5:respawn:/etc/X11/prefdm –nodaemon在5 级别时执行 /etc/X11/prefdm 如果任务关闭则重新执行[root@localhost ~]#当前,文件的配置是:设置系统的默认级别,执行/etc/rc.d/rc.sysinit 脚本进行系统的初始化.执行/etc/rc.d/rc 传递参数5,进行5级别的服务后台运行.运行/sbin/mingetty 进行虚拟终端的运行.运行图形化窗口.

rc.sysinit 文件格式:

rc.sysinit文件格式如下:#!/bin/bash## /etc/rc.d/rc.sysinit - run once at boot time## Taken in part from Miquel van Smoorenburg's bcheckrc.#HOSTNAME=`/bin/hostname`HOSTTYPE=`uname -m`unamer=`uname -r`set -m设置主机名称: if [ -f /etc/sysconfig/network ]; then    . /etc/sysconfig/networkfiif [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then    HOSTNAME=localhostfiif [ ! -e /proc/mounts ]; then mount -n -t proc /proc /procmount -n -t sysfs /sys /sys >/dev/null 2>&1后期补全 ,太卡了 先保存了