我们在使用Linux操作系统的时候,只需要按下电源键,等待,然后输入账号和密码就可以使用Linux操作系统了。那么在按下电源键输入账号和密码之前操作系统做了什么呢?以下是对这段时间发生的动作的描述。下面以CentOS6系列为例,讲解Linux的启动过程。一、Linux启动过程详解下图是启动过程的大致流程:2、POSTPOST(PowerOnSelfTest)首先检查各个设备。完成后会搜索有引导记录的设备,找到后读取操作系统的引导记录,然后将系统的控制权交给引导记录,引导记录就顺利完成了系统启动。3.MBRBootMBR(MasterBootRecord)MBR记录一般在磁盘0磁道1扇区,共512字节。前446字节为BootLoder,后4*1664字节用于存放分区信息,后2字节为校验信息,通常为5***A。4、GRUB(GRandUnifiedBootloader),加载内核是MBR中的前446字节,是BootLoader的一种,其作用是选择要启动的内核。1、GRUB程序的组成:主要由device.map、menust、stage1、stage2、stage1_5等一系列组成。我对这几个部分的理解是这样的:device.map:存放内核文件的根分区menu.lis:是grub.conf的链接文件,不过我觉得这个名字更贴近它的功能,就是菜单列表.炫耀可以选择的内核菜单。存储在stage2中。stage:grub引导程序太大,所以分为两个阶段引导,第一阶段存放在MBR中,第二阶段存放在内核文件系统中,在第一阶段之后可以找到第二阶段阶段被启动。但是第二段存放在内核文件系统中,此时文件系统还没有格式化,我们如何访问第二段的menu.lst呢??需要中间层stage1_5辅助stage1段访问stage2段。stage1_5通常位于stage1字段之后的63个扇区。由于stage2在内存中可以使用的文件系统是不确定的,这就是为什么会有多个stage1_5的原因。2、grub.conf文件参数含义default=1#默认启动的内核标题,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的根位置#指定内核文件的位置,同时指出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.imginitramfs-2.6.32-358.el6.x86_64.img的本质是什么????#initramfs是经过gzip压缩后的cpio格式的文件。它被用作内核启动时的临时根文件系统。#grub的stage2将initrd加载到内存中,然后释放内容到content中,#内核会执行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_initramfs3,grub的功能1)提供菜单,并提供交互界面e:进入编辑模式2)选择要启动的内核或系统,允许传递引导参数给内核选择界面可以隐藏#可以通过传递参数自启动like内核通过grub。#其中一个应用是:修改root密码(忘记密码),使用e选项,通过单用户指令。3)为编辑功能提供保护机制。启用内核文件以选择并运行指定的内核。您必须输入密码才能传递参数。先用e命令输入密码。[root@serverroot]#grub-md5-cryptPassword:Retypepassword:$1$Mp7Rp1$l2wzOILNUqpUhAR7zXvQb0#以上是生成的加密字符串#然后将信息添加到grub.conf文件中,格式如下:password--md5$1$Mp7Rp1$l2wzOILNUqpUhAR7zXvQb0#当然添加grub.conf文件的位置不同,加密效果也不同。#如果添加到标题中,整个菜单将被加密。#如果在标题中加上,对应操作系统的入口会被加密。#p#4。安装grub的方法1)使用grub-install命令#grub-install[--root-directory=/path/to/somewhere]DEVICE2)grub交互是一个命令这里我们做一个简化的grub,当然启动的时候可以开始狂欢吧。这些示例是在VMware虚拟机下完成的。第一步:准备一张新的磁盘并将其划分为2个区域。第二步:模拟启动时的引导目录和根目录,并挂载。如下[root@server~]#df-H|tail-n2/dev/sdd1518M11M481M3%/mnt/boot/dev/sdd22.2G71M2.0G4%/mnt/sysroot第三步:制作grub,生成grub配置文件Makegrub拷贝内核文件和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=10titleMiniLinuxroot(hd0,0)kernel/vmlinuzroroot=/dev/sda2selinux=0init=/bin/bashinitrd/initramfs.img第四步:生成根文件系统第五步:将命令和库复制到对应的目录中根目录,使用刚才的磁盘镜像作为另一个虚拟机的启动盘。#p#5。启动init进程init进程是系统启动的第一个进程。所有其他进程都由这个进程控制fork,也就是说init是其他进程的“祖先”,PID=1。当然,我们称之为空闲进程的PID=0进程是属于内核的。init启动后做了什么:1.读取/etc/inittab读取默认级别假设:读取默认级别为3/etc/init/*.conf#Startuplevel:(runlevel)#0:shutdown#1:Single-用户模式#2:多用户模式,不支持NFS功能#3:完全多用户模式,支持文本界面#4:保留模式#5:完全多用户模式,支持图形模式#6:关机#/etc/inittab文件格式如下,沿用了CentOS5的风格。编号:3:初始默认值:2。执行初始化系统脚本/etc/rc.d/rc.sysinit来初始化脚本。如果有机会,您可以阅读它。脚本的主要功能如下:#获取网络环境和主机类型。首先,它会读取网络环境设置文件“/etc/sysconfig/network”,获取主机名和默认网关等网络环境。#Promise文字欢迎信息。#挂载/etc/fstab文件中定义的其他文件系统。#Activateswap#检测根文件系统,重新挂载为读写模式#判断是否启动SELinux和udev。#接口设备检测和即插即用(pnp)参数测试。#加载用户定义的模块。用户可以在“/etc/sysconfig/modules/*.modules”中添加自定义模块,此时会加载到系统中。#加载核心的相关设置。根据“/etc/sysctl.conf”文件的设置值配置功能。#设置系统时间(clock)。#设置终端控制台的字形。#设置raid、LVM等硬盘功能。#查看并验证mode中的磁盘文件系统。#转换磁盘配额quota。#以只读方式重新加载系统盘。#启动配额功能。#启动系统随机数器(随机数生成函数)。#清除启动时的临时文件。#加载启动信息到“/var/log/dmesg”文件中。3.然后执行/etc/rc.d/rc脚本。这个脚本运行的时候会读取/etc/rc.d/rc3.d/下的所有脚本来控制启动或者关闭那些服务#这里的脚本大致分为2类,S开头的脚本和以S开头的脚本带K。#S表示在开机时启动,K表示不在开机时启动。#每个文件的命名格式,例如:S01sysstatSbootstart01startupsequencesysstatstartupscriptname#每个脚本中定义启动的定义:例如##chkconfig:-8515#默认级别的启动顺序不启动这些scripts是否开机自动启动可以通过chkconfig命令来管理。#常用选项:#chkconfig--addSRV_SCRIPT可以做一些自己写的脚本,统一管理这个命令。例如:chkconfig--addhttpd#chkconfig--delSRV_SCRIPT会删除服务,也就是说服务不会被chkconfig的机制管理#chkconfigSRV_SCRIPT{on|off}设置服务是否开机自动启动,默认managementlevelis2345#--level2345等,指定默认级别,可以和其他选项一起使用4.执行/etc/rc.d/rc.local脚本,这是最后启动的脚本启动过程。***将执行/bin/login以登录用户。至此系统启动过程完成。博客链接:http://guoting.blog.51cto.com/8886857/1530109
