CentOS系统启动流程与grub

本文主要讲述CenOS系统启动的整个流程。

对于CentOS系统来说,整个启动过程可分为4个阶段,分别是:加点自检,加载MBR,加载内核并执行初始化信息,初始化用户空间。下面就具体来描述每个过程都做了什么。

一.加点自检(power on system test,POST)

任何一种操作系统的启动,第一步必定是加点自检,主要功能是装载在硬件芯片CMOS之上的BIOS(Basic Input Output System)来实现,这个程序CMOS会根据CMOS上的配置信息去检测当前计算机是否具有启动系统的基本硬件能力,比如CPU,内存是否正常等等。

二.选择启动顺序,加载MBR

完成BIOS初始化之后,BIOS会列出一些可以启动的装置顺序,然后根据这个顺序去找对应的内核文件。但是由于不同系统的文件系统系统可能会不同,所以就有了一个叫做启动管理程序,来处理文件系统不同这些问题,而这个程序就叫做Booot Loader,它位于可以启动的第一块硬盘的MBR(Master Boot Record)中。MBR则是位于可以启动的硬盘的第一个扇区之内,Boot Loader还要完成操作系统的识别,加载核心文件的功能,当用户安装多个系统以后,还会提供一个让用户选择要启动的操作系统的菜单。因此当MBR被破坏以后,Boot Loader也会收到影响,进而就会导致无法启动系统。

三.加载内核Kernel,并执行系统初始化信息

当Boot Loader读取操作系统内核文件后,接下来就会将内核文件解压后装载到内存之中,并依据内核所提供的功能去测试设备。此时,内核程序还没加载到磁盘,也就是说此时系统还没有磁盘的驱动能力,那又如何加载位于磁盘上的内核文件呢?

Linux采用了一种叫做虚拟文件系统(Initial RAM DISK)来解决这个问题,它的主要功能是:通过Boot Loader程序加载到内存中,然后这个文件就会被解压展开到模拟的根文件系统中,这个根文件系统能提供一个可运行的程序,通过这个程序加载核心的模块,完成之后,释放虚拟的文件系统,并挂载真实的根文件系统,完成根切换,之后就能执行正常的启动过程。

四.启动用户空间的第一个程序,初始化用户空间

1.完成以上三步之后,内核会呼叫用户空间的第一个程序:/sbin/init,这个程序会完成一系列的初始化操作,包括主机名设定,网络配置等操作,所有的这些操作都是在init的配置文件中定义的。因此init配置文件就至关重要。

对于CentOS5:其采用的是SysV init方式,通过脚本启动服务,有依赖关系的服务就会被串行启动,配置文件为/etc/inittab

对于CentOS6:采用Upstart方式进行,进程间的通信通过D-Bus进行,可以基本实现类似并行启动,配置文件为/etc/inittab,/etc/init/*.conf

对于CentOS7:采用了全新的Systemd方式,其特点是只有在服务第一次被启动才会真正启动,其配置文件为/usr/lib/systemd/*

2.init配置文件

在init配置文件中,尤为重要的一项是设置系统的默认运行级别,而在Linux之上,运行级别0-6七种级别,分别是:

0:关闭所有服务,然后关机
1:维护模式,也叫单用户模式,允许root用户可以不用密码直接登录系统
2:维护模式,也叫多用户模式,需要认证,会启动网络
3:正常级别,完全多用户模式,提供文本界面
4:预留级别,暂未使用
5:正常级别:完全多用户级别,提供图形节界面
6:关闭所有服务,重新启动

常看运行级别的方法:

runlevel 或者 who -r

切换运行级别的方法:

init run_level

在CentOS6中,/etc/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:3:initdefault:

定义的格式为:

id:runlevel:action:process,例如上述文件中的最后一行:id:3:initdefault:

因此init的整个处理流程为:

1.通过读取/etc/inittab文件来设定运行级别
2.使用/etc/rc.d/rc.sysinit来初始化系统
3.执行3级别下所设定的操作,并忽略其他级别设定的配置

从上面可以看到,初始化系统是根据/etc/rc.d/rc.sysinit进行的,这个脚本的主要的任务是:

1.根据/etc/sysconfig/network文件来设定主机名
2.打印文本欢迎信息
3.激活SELinux和udev
4.挂载/etc/fatab中定义的文件系统
5.激活swap设备
6.检测根文件系统
7.设置系统时钟
8.根据/etc/sysctl.conf文件来设定内核参数
9.激活LVM和RAID
10.加载驱动程序
11.清理操作

当内核设定运行级别以后,就要去完成对应级别下的操作,而这些级别对应下的任务是/etc/rc.$runlevle.d

/下的操作,不同级别下这些脚本被成为服务脚本,这些脚本决定如何开启或关闭服务,而具体的方式则是系统通过传递S参数来启动服务,传递K来关闭服务;这些服务脚本的定义规范为:

(1)至少接受四个参数:

start:启动服务
restart:重启服务
stop:停止服务
status:查看服务运行状态

(2)脚本的开头

#chkconfig :start_level start_prio stop_prio

#description:description information

这些脚本可以通过/etc/init.d/script_name {start|stop|status|restart}调用,也可以通过service script_name {start|stop|status|restart}调用 

五.grub

1.在系统启动过程中,Boot Loader至关重要,然而Boot Loader处于MBR当中,MBR的大小是512bytes,只有其中的446bytes是用来存放Boot Loader的,为了解决存放Boot Loader的位置空间的大小问题,Linux将Boot Loader的程序分成三个阶段来运行,在Linux上,grub是使用最广泛的启动加载器:

stage1:

执行Boot Loader主程序,这必须安装在MBR中,而且没有安放Boot Loader相关的配置文件

stage1_5:

在MBR随后的分区存放,主要用于与stage2所在的文件系统进行交互

stage2:

通过Boot Loader加载所有配置文件及其相关的参数信息,而这些信息全都存放于/boot目录之下,这些配置文件主要包括:

boot.png

device.map:定义grub的安装位置
e2fs_stage1_5:ext2文件系统定义
fat_stage1_5:fat文件系统定义
ffs_stage1_5:文件系统定义
grub.conf:grub的配置文件
iso9660_stage1_5:光驱的定义
jfs_stage1_5:jfs文件系统发的定义
menu.lst:链接文件
minix_stage1_5:文件系统的定义
reiserfs_stage1_5:reiser文件系统的定义
splash.xpm.gz:背景图片
stage1:stage1相关的信息
stage2:stage2相关的信息
ufs2_stage1_5:ufs文件系统的定义
vstafs_stage1_5:vfs文件系统的定义
xfs_stage1_5:xfs文件系统的定义

2.Linux一切皆文件,对grub的配置也不例外,其配置文件为/etc/grub.conf

(1)设置grub的方法一,直接修改其配置文件

# 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/sda

default=0   #设定默认要启动的内核

timeout=5   #设定可供用户选择的超时时长

splashimage=(hd0,0)/grub/splash.xpm.gz  #定义背景图片

hiddenmenu  #隐藏选择菜单

title CentOS (2.6.32-431.el6.x86_64) #设定操作系统的名称

  root (hd0,0) #设定要启动的内核所在的位置

  kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=908a3c89-4592-4dc4-8dc2-b5261f7c0e83 rd_NO_LUKS rd_NO_LVM.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 #设定辅助内核引导的ramdisk文件的位置

(2)通过命令行接口

进入grub命令行,可以在启动时根据提示的信息进入,在对应的title输入c就能进入,

启动.png

常用的grub命令有:

help:获取帮助信息
find:查找文件
root:设定要启动的内核所在的位置
kernel:设置内核文件路径
initrd:设定ramdisk的位置

六.为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;

  (1) 为硬盘新建两个主分区;并为其安装grub;

  (2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;

  (3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;

  (4) 为grub提供配置文件;

  (5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;

具体过程为:

(1)创建分区,结果为

1.png

(2)格式化分区:

2.png

(3)创建目录

3.png

(4)挂载

3-1.png

3-2.png

(5使用grub-install安装grub

4.png

(6)提供内核文件和ramdisk文件

6.png

6-2.png

(7)为rootfs提供bash,ls,cat程序

7-1.png

7-2.png

复制库文件:

7-3.png

(8)为grub提供配置文件

8.png

至此,制作完成


七.制作一个kickstart文件以及一个引导镜像。描述其过程。

可以手动编辑或者通过system-config-kickstart来创建ks.cfg文件
#命令段
firewall --disabled  #禁用防火墙
install              #执行新的安装操作
cdrom                #使用光盘安装
lang en_US.UTF-8       #默认安装语言
keyboard us            #选择键盘
rootpw  --iscrypted $6$LqIQ9sxk$JLd1tXFz/QavUP7lY4.HeR/HoVGHpgy2V8KzbxCZHxQw7tSH7y4rAqzFYB9yK6r76dxybToPduLH0UEn7Kcm81     #管理员加密密码
authconfig --enableshadow --passalgo=sha512
selinux --enforcing         #激活selinux
logging --level=info       #信息等级
timezone --utc Asia/Shanghai     #定义系统时区
bootloader --location=mbr --driveorder=sdb --append="crashkernel=auto rhgb quiet"
clearpart --all         #删除所有现在分区
part /boot --fstype=ext4 --size=200   #挂载分区
part / --fstype=ext4 --size=40960
part swap --size=4096
#脚本段
%pre     #执行安装前脚本
echo "start install"
%end
%post     #执行安装后脚本
echo "install end"
#程序包段
%packages
@chinese-support    #使用中文
@development       #安装开发工具
@graphical-desktop-clients   #安装图形化工具
@remote-desktop-clients   #安装远程桌面客户端
%end

(1)制作引导光盘

将系统光盘中除了Packages和repodata外的所有文件复制到同一个目录下,并创建引导光盘

mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 –boot-info-table -V "CentOS 6 boot test" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso /root/centos6/

(2)制作自动安装系统光盘

在/root/centos6/isolinux/isolinux.cfg文件中 append initrd=initrd.img 条目后,添加ks文件读取路径 ks=cdrom:/ks.cfg,然后把centos6目录创建为光盘镜像boot.iso

mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 –boot-info-table -V "CentOS6 boot test" -b isolinux/isolinux.bin  -c isolinux/boot.cat -o /root/boot.iso /root/centos6/

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

(0)
zhangbaozhangbao
上一篇 2016-11-28
下一篇 2016-11-29

相关推荐

  • Linux命令的使用格式及部分常用命令详述

    Linux命令的使用格式及部分常用命令详述 Linux系统中命令的使用格式 Linux中命令的使用遵循以下格式 # COMMAND OPTIONS ARGUMENTS   ###命令 选项 参数,三项之间用空格分开 执行一个命令需要指定需要内核将哪一个二进制程序运行为一个进程,C…

    Linux干货 2016-10-30
  • Linux文件权限管理-2016-8-04

    Linux文件权限管理 学习大纲 一 关于文件和目录的权限基本概述(rwx); 二 针对文件或目录权限管理的命令: a) 相关命令:chown , chgrp ,chmod chown修改文件属主 和 属组 语法:chown  [OPTION]…  [OWNER][:[GROUP]]  FILE&#8230…

    Linux干货 2016-08-04
  • LVM 逻辑卷管理器-缩小LV容量及快照区的建立

    LVM 逻辑卷管理器-缩小LV容量 将/dev/sdb2分区抽离出来,缩小LV容量 (1)首先查看/dev/sdb2的容量大小 [root@centos6 ~]# df -h /mnt/lvm/ Filesystem        &nbs…

    Linux干货 2016-09-19
  • 八大排序算法

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 我们这里说说八大排序就是内部排序。     当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。    快速…

    Linux干货 2015-04-07
  • Linux基础之RAID

    一.RAID介绍 RAID刚开始出现的时候叫做廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks),但在当时磁盘并非像现在这么便宜,反而这种组合方式使得代价非常昂贵,所以后来改名为独立磁盘冗余阵列(Redundant Array of Independent Disks),基本的思想就是组合组合多个便宜的,性能相对较低…

    Linux干货 2016-11-08
  • 【招聘】天津/赞普科技股份有限公司/Linux系统运维工程师/6-7k/五险一金

    天津赞普科技股份有限公司——简称赞普科技,成立于2003年,坐落于天津市滨海高新区,是一家专业的互联网综合服务商,主营数字网络建设、数据接入及增值服务和智能化网络产品及服务。历经11年的发展,赞普科技已成长为高新区科技型小巨人企业、国家高新技术企业,专注于移动互联与大数据、云计算、商业WIFI行业的领军者。     赞普科技计划…

    Linux干货 2015-12-03

评论列表(1条)

  • 马哥教育
    马哥教育 2016-11-30 21:18

    内容写翔实扎实,但是整个介绍下来内容量还是比较大的,做为博客来讲,考虑到读者的感受,建议使用Markdonw来进行格式编写,非常简单实用。