Linux系统启动流程推荐

我们在使用Linux操作系统的时候,我们只需按下电源键,等待,然后输入账户和密码就可以使用Linux操作系统了。那么在按下电源到输入账号和密码之前,操作系统都做了些什么?下面就来讲述在这段时间发生的动作。

下面以CentOS6系列为例来讲解Linux的启动流程。

一、Linux启动流程详解

下图就是启动流程的大致过程:

二、POST加电自检

POST(PowerOnSelfTest)首先对每一个设备进行检查。完成后会寻找存有引导记录的设备,找到后读入操作系统引导记录,然后将系统控制权交给引导记录,并由引导记录来完成系统的顺利启动。

三、MBR引导

MBR(Master Boot Record) MBR记录一般是在磁盘 0 磁道 1 扇区,共512个字节。前446个字节是BootLoder,后 4*16 的 64 个字节是存放分区信息的,最后 2 个字节是校验信息,一般是 55AA。

四、GRUB(GRand Unified Bootloader)、加载内核

就是MBR中的前 446 个字节,是BooTLoader的一种,它的作用是要选择要启动的内核。

1、GRUB程序的组成:

主要是由device.map,menulst,stage1,stage2,以及一系列的stage1_5组成。对于这些部分我的理解是这样:

device.map:存放的是内核文件的根分区

menu.lst:是grub.conf的链接文件,但是这个名字我觉得更与它的功能接近,就是菜单列表。文件里设置了可以选择的内核菜单。存放于stage2中。

stage:用于grub引导程序过大,所以分2段引导,第一段存放在MBR中,第二段存放于内核文件系统中,第一段引导完成后可以找到第二段。但是,第二段是存放于内核文件系统中的,此时还没有格式化文件系统,如何可以访问到第二段的 menu.lst 呢??就需要借助于中间层 stage1_5,有它来协助 stage1 段来访问 stage2 段。stage1_5通常位于 stage1 字段后的 63 个扇区。 由于stage2 在内存中存放可以使用的文件系统不确定,所以这就是有多个 stage1_5 的原因了。

2、grub.conf 文件参数意义

default=1#默认启动的内核title,0表示是第一个timeout=5#默认等待时间splashimage=(hd0,0)/grub/splash.xpm.gz#指定菜单的背景图片的路径。为xpm格式,采用gzip压缩,只能为14bits色hiddenmenu#隐藏菜单titleCentOS(2.6.32-358.el6.x86_64)#标题名,用户可自定义 root(hd0,0)#指定grub的根位置 #指定kernel文件的位置,还要指出root(系统启动后)的位置,挂载方式ro,这项很关键。 #加载后会启动init进程。 kernel/vmlinuz-2.6.32-358.el6.x86_64roroot=/dev/mapper/vg0-rootrd_NO_LUKSrd_NO_DMLANG=en_US.UTF-8rd_LVM_LV=vg0/swaprd_NO_MDSYSFONT=latarcyrheb-sun16crashkernel=autord_LVM_LV=vg0/rootKEYBOARDTYPE=pcKEYTABLE=usrhgbcrashkernel=autoquietrhgbquiet #在内核启动过程中装载根文件系统时有用 initrd/initramfs-2.6.32-358.el6.x86_64.img

initramfs-2.6.32-358.el6.x86_64.img 的本质是????

#initramfs是以gzip压缩的cpio格式的文件。内核启动时将他作为一个临时的根文件系统。#grub的stage2将initrd加载到内存里,让后将其中的内容释放到内容中,#内核便去执行init脚本,这时内核将控制权交给了init文件处理。#init它也主要是加载各种存储介质相关的设备驱动程序。当所需的驱动程序加载完后,#会创建一个根设备,然后将根文件系统rootfs以只读的方式挂载。#这一步结束后,释放未使用的内存,转换到真正的根文件系统上面去,同时运行/sbin/init程序,#执行系统的1号进程。此后系统的控制权就全权交给/sbin/init进程了。

如何制作 initramfs 呢?

#可以使用dircut命令,用法如下:#只有在initramfs文件损毁的时候会使用到[root@server~]#dracut/mnt/initramfs-`uname-r`.img`uname-r`[root@server~]#du-sh/mnt/initramfs-2.6.32-358.el6.x86_64.img16M /mnt/initramfs-2.6.32-358.el6.x86_64.img[root@server~]#du-sh/boot/initramfs-2.6.32-358.el6.x86_64.img16M /boot/initramfs-2.6.32-358.el6.x86_64.img#详细介绍,可使用这个链接:https://zh.opensuse.org/index.php?title=SDB:Dracut variant=zh-cn#.E5.90.AF.E7.94.A8_dracut_.E7.94.9F.E6.88.90.E7.9A.84_initramfs

3、grub的功能

1)提供菜单,并提供交互式接口

e: 进入编辑模式

2)选择要启动的内核或系统

允许传递引导参数给内核

选择界面可隐藏

#可以自启动是通过grub像内核传递参数。#应用之一是:修改root密码(忘记密码),使用e选项,传递单用户指令。

3)为编辑功能提供保护机制

启用内核文件

选择运行指定的内核得先输入密码

传递参数

使用e命令得先输入密码

[root@serverroot]#grub-md5-cryptPassword:Retypepassword:$1$Mp7Rp1$l2wzOILNUqpUhAR7zXvQb0#上面是生成的加密字符串#然后将信息加入到grub.conf文件中,格式如下:password--md5$1$Mp7Rp1$l2wzOILNUqpUhAR7zXvQb0#当然加入grub.conf文件的位置不同,加密效果也不一样。#加入到title之前的话,会加密整个菜单。#加入到title指内的话,会加密对应的操作系统的入口。

4、安装grub的方式

1)使用grub-install命令

# grub-install [–root-directory=/path/to/somewhere] DEVICE

2)grub交互是命令

在这里我们自制一个精简grub,当然启动的时候只启动一个bash就可以。示例是在 VMware 虚拟机下完成的。

第一步:准备好块新磁盘,分 2 个区出来

第二步:模拟启动时的boot目录,和根目录,并挂载。如下

[root@server~]#df-H|tail-n2/dev/sdd1518M11M481M3%/mnt/boot/dev/sdd22.2G71M2.0G4%/mnt/sysroot

第三步:制作 grub,并生成 grub 的配置文件

制作grub

拷贝内核文件和 initramfs 文件到 /mnt/boot 目录下,并生成 grub.conf 文件

[root@server~]#cp/boot/vmlinuz-2.6.32-358.el6.x86_64/mnt/boot/vmlinuz[root@server~]#cp/boot/initramfs-2.6.32-358.el6.x86_64.img/mnt/boot/initramfs.img[root@server~]#ll/mnt/boot/total20106drwxr-xr-x2rootroot1024Jul2420:58grub-rw-r--r--1rootroot16542269Jul2421:06initramfs.img-rwxr-xr-x1rootroot4043888Jul2421:05vmlinuz#生成的grub.conf文件[root@server~]#cat/mnt/boot/grub/grub.confdefault=0timeout=10titleMiniLinux root(hd0,0) kernel/vmlinuzroroot=/dev/sda2selinux=0init=/bin/bash initrd/initramfs.img

第四步: 生成根文件系统

第五步:拷贝使用命令和库到对应根目录下

将刚才的磁盘镜像作为另一个虚拟机的启动盘。

五、启动 init 进程

init 进程是系统启动的第一个进程。其他进程都是有此进程控制fork出来的,也就是说,init是其他进程的“祖先”,PID=1。当然,PID=0进程我们称为空闲进程是属于内核的。

init启动后所做的事情:

1、读取/etc/inittab来读取默认级别假设:读取到的默认级别是 3

/etc/init/*.conf

#启动级别:(runlevel)#0:关机#1:单用户模式#2:多用户模式,不支持NFS功能#3:完全多用户模式,支持文本接口#4:预留模式#5:完全多用户模式,支持图形模式#6:关机#/etc/inittab文件格式如下,这是遵循了CentOS5的风格。id:3:initdefault:

2、执行初始化系统脚本 /etc/rc.d/rc.sysinit 来初始化脚本

这个大家有机会可以读读,脚本主要的作用如下:

#获取网络环境与主机类型。首先会读取网络环境设置文件"/etc/sysconfig/network",获取主机名称与默认网关等网络环境。#打印文本欢迎信息。#挂载/etc/fstab文件中定义的其它文件系统。#激活swap。#检测根文件系统,并以读写方式重新挂载#决定是否启动SELinux和udev。#接口设备的检测与即插即用(pnp)参数的测试。#用户自定义模块的加载。用户可以再"/etc/sysconfig/modules/*.modules"加入自定义的模块,此时会加载到系统中。#加载核心的相关设置。按"/etc/sysctl.conf"这个文件的设置值配置功能。#设置系统时间(clock)。#设置终端的控制台的字形。#设置raid及LVM等硬盘功能。#以方式查看检验磁盘文件系统。#进行磁盘配额quota的转换。#重新以读取模式载入系统磁盘。#启动quota功能。#启动系统随机数设备(产生随机数功能)。#清楚启动过程中的临时文件。#将启动信息加载到"/var/log/dmesg"文件中。

3、然后执行 /etc/rc.d/rc 脚本

此脚本运行的时候此脚本的时候,会读取/etc/rc.d/rc3.d/下的所有脚本,来控制系统启动的时候启动或者关闭那些服务。

#这里面的脚本大致分为2类,以S开头的和以K开头的脚本。#S代表开机时启动的,K表示开机时不启动。#每个文件的命名格式,例如:S01sysstatS开机启动01启动次序sysstat启动脚本名#启动的定义是在每个脚本中定义的:例如##chkconfig:-8515#默认级别启动次序不启动次序

这些脚本是否开机自启动,可由 chkconfig 命令来管理。

#常用选项:#chkconfig--addSRV_SCRIPT可以将自己写的一些脚本,让此命令统一管理。例如:chkconfig--addhttpd#chkconfig--delSRV_SCRIPT将服务删除,意思就是服务不由chkconfig这种机制来管理#chkconfigSRV_SCRIPT{on|off}设置服务开机是否自启动,默认管理的级别是2345.#--level2345等,指定默认级别,可以与其他选项一起使用

4、执行/etc/rc.d/rc.local脚本,此脚本是启动过程中最后启动的一个脚本。

最后会执行 /bin/login 登录用户。至此系统启动过程完成。

人若软弱就是自己最大的敌人

Linux系统启动流程推荐

相关文章:

你感兴趣的文章:

标签云: