CentOS6启动过程总结与GRUB问题修复

一、CentOS 6 的启动流程

  • 第一步:加电自检(POST)

    主要检查硬件设备是否存在并能正常运行,如:CPU、内存、硬盘、风扇、输入输出设备等。自检功能主要是通过BIOS来实现的,BIOS程序是装载在一个硬件芯片CMOS上的,加电过程就是给CMOS通电,然后启动BIOS程序,BIOS程序会根据CMOS上面的一些配置信息区读取其他的硬件设备信息并检测其是否存在并能正常运行,之后进行硬件设备的初始化。


  • 第二步:选择启动顺序,加载MBR

    按照BIOS中设置的Boot Sequence查找Boot Loader程序所在的设备。Boot Loader是一个程序,它依赖于一个硬件之上,这个硬件就是硬盘,准确的说为第一个可以启动的硬盘的第一个扇区内,即MBR(Master Boot Record,主引导记录)。

    Boot Loader的主要功能就是去识别、加载操作系统中的核心文件,并提交到内存中运行,进而来启动对应的操作系统。另一个主要功能是提供菜单信息(可以提供不同的启动项来加载不同的操作系统),并将启动管理功能转交给其他的加载程序。


  • 第三步:加载系统内核(Kernel)文件,执行系统初始化信息

    Boot Loader程序读取操作系统的内核文件后,会将其解压后装载到内存当中,然后接管BIOS的工作开始测试并加载各个设备(CPU、硬盘、网卡等)。

    因为内核文件(Kernel)通常是存放在系统上的/boot目录中,并且是以vmlinuz开头的文件,此时内存程序还没有加载到硬盘,因此无法读取系统上的内核文件,而如果先去加载硬盘则必须有硬盘的驱动程序,因此这将会产生一个先后顺序的问题,为了解决这个问题,Linux采用GRUB启动管理程序来识别硬盘信息,RTUB程序的执行过程需要三个阶段,具体的执行过程将在下面的第二章节介绍。


  • 第四步:启动第一个执行程序/sbin/init

    在内核、硬件及驱动信息加载完毕后,内核会呼叫用户控件的第一个执行程序/sbin/init,init程序主要功能是准备软件运行环境,包括系统的主机名称、网络配置、文件系统格式等其他服务的启动管理。而这些所有的操作都是通过init的配置文件来定义的。

    CentOS 5 中 init 的配置文件为:/etc/inittab

    CentOS 6 中 init 的配置文件为:/etc/inittab,/etc/init/*.conf

    在init的配置文件中有个一非常重要的配置项目,那就是默认的系统启动级别。启动级别是为系统维护的目的而设定的,其实现方式是关闭或启动对应级别下的服务。以下为init的7个运行级别:

    • 0:halt,关机

    • 1:Single user,单用户模式,此级别允许以root用户身份登录,而无需认证,相当于windows的安全模式

    • 2:Multiuser,多用户模式,需要用户认证,会启动网络功能,但不会启动NFS

    • 3:Full multiuser,完全多用户模式,文本界面

    • 4:unused,预留级别,目前无特别的使用目的

    • 5:X11,正常级别,也是完全多用户模式,图形界面

    • 6:reboot,重启

通常使用较多的默认级别为35,服务器上一般默认使用3级别,不同级别之间是可以进行切换的,切换方式为:init [0-6],可以使用 who -r 或 run_leave命令查看运行级别。

wKioL1fbZGiB9PNvAAAr7jBHg2Y168.png


  • 第五步:运行系统初始化脚本

    根据 init 的配置文件,先获取默认的 runlevel,然后再执行 /etc/rc.d/rc.sysinit 脚本完成系统初始化。

    系统初始化脚本所做的事情主要有:

        1、设定主机名(读取/etc/sysconfig/network文件)

        2、激活 SELinux 和 udev

        3、打印文本欢迎信息

        4、挂载所有定义在/etc/fstab文件中的文件系统

        5、激活 swap 设备

        6、检测跟文件系统,并实现以读写方式重新挂载

        7、设置系统时钟

        8、根据 /etc/sysctl.conf 文件设定内核参数的值

        9、激活LVM和RAID设备

        10、加载额外的设备驱动程序

        11、清理操作


  • 第六步:启动系统服务

    按照默认级别的参数N,执行 /etc/rcN.d/ 目录下设定的关闭和启动相应的服务。


  • 第七步:打印登录提示符


二、GRUB程序的三个阶段

  • stage1:运行Boot Loader主程序,这个程序必须要被安装在启动区(MBR)。因为MBR空间有限,因此在MBR当中仅安装Boot Loader的最小主程序,并没有安装Boot Loader的相关配置文件。

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

  • stage2:通过Boot Loader加载所有配置文件及相关的环境参数信息,这些配置文件及相关的环境参数都存放于磁盘分区上的/boot目录下。

grup的配置文件路径为:/boot/grub/grub.conf,内容如下:

wKioL1faePKy5kGQAACiXfzGebc014.png

  • default:设定默认启动的内核和操作系统,如果同时安装了多个操作系统或内核,0表示定义的第一个title系统,1表示定义的第二个title系统,依次类推;

  • timeout:设定系统启动时选择操作系统菜单的等待时间,单位是秒(s);

  • splashimage:设定系统启动时grub菜单的背景图片。图片格式为xpm,14bits颜色,大小为640*480,需要gzip压缩;

  • hiddenmenu:隐藏选择菜单,默认情况下是不显示菜单信息,如果想要显示菜单,将该配置注释即可;

  • title:定义一个操作系统或系统内核,且包括下面内容:

        root:指明引导当前操作系统或内核文件所在的分区;

        kernel:指定文件路径、根文件系统所在设备,以及传递给内核的参数。由于启动过程中需要挂载跟目录,因此需要指定根目录所在的分区。内核参数 rhgb表示色彩显示,quiet表示静默模式加载内核;

        initrd:指定用于辅助内核完成系统启动的ramdisk文件路径;


三、关于GRUB的调试

1、破解root用户密码

  • 第一步:系统启动时按任意键进入GRUB菜单,动作一定要快,默认是5s的倒计时

wKiom1fafSGj6foOAAAVKwxN_RI809.png

如上图所示,可以使用上下键选择要启动的操作系统(这里只用一个);

e可以对选择的项进行编辑;

按“a”可以对选择的项进行内核参数修改;

按“c”可以进入命令行模式;

  • 第二步:根据提示,选择相应的菜单,然后按“a”,在原有内核参数的最后加上“1sSsingle”的任意一个参数,表示进入单用户模式,然后按回车键启动系统


    wKioL1faghigfFBPAAAREr8mquc797.png

  • 第三步:以单用户模式进入系统后,使用passwd命令修改root用户密码,修改完之后重启系统即可使用新的root用户密码登录系统。


2、为GRUB菜单设置保护密码

默认情况下进入GRUB菜单后不需要任何密码就可以进行编辑,相对来说是比较危险的,因此可以修改 grub.conf 配置文件为GRUB菜单设置密码保护,在 grub.conf 文件中的title字段上面新增一行pwssword PASSWD,password支持命令口令和加密口令,具体设置如下图所示:

wKiom1fah8fg4Ed-AABoxwUN8wE791.png

md5加密口令的生成命令为:grub-md5-crypt

wKiom1faiLTzAcJWAAApcsZJgUs817.png

grub.conf文件中新增password后,再次进入GRUB菜单时如果想要编辑则必须按“p”键,然后通过密码验证后才能编辑,如下图所示:

wKiom1faid6waloVAAAWC8UPl78090.png

同理,在grub.conf 配置文件中的title内添加password,可以保护内核,即进入系统时需要输入密码验证后才能启动。


3、取消图形界面的启动,使用文本界面启动

系统默认的启动方式是图形界面启动,因此看不到系统的启动过程,可以通过修改 grub.conf 配置文件设置成文本界面启动,生产环境下也建议使用文本界面启动,因为这种启动方式可以看到整个过程,如果哪个服务在启动过程中出错可以及时发现。修改方法是把kernel参数中的rhgbquiet删除。

wKioL1fallnSKeAVAAB5idi-PKI674.png


4、如果/boot下的文件损坏或丢失的恢复方法

  • 第一步:使用安装光盘进入救援模式,进入时需要根据提示手动选择语言、键盘等

wKiom1famNTyzZZyAAa4ZGyYKkA940.png

加载救援模式的过程中会提示硬盘上的系统已经被找到并挂载到/mnt/sysimage下,因此进入救援模式后可以使用 chroot /mnt/sysimage 命令切换到硬盘上操作系统的根目录下,因为救援模式下提供的命令比较有限,好多命令都不支持。

wKiom1famyPhYgoOAAATgrSR3yc805.png

如果进入到救援模式后,没有发现硬盘上的根文件系统,则需要使用相关命令查找并分析根文件系统所在硬盘分区位置,如果硬盘使用的是普通分区,则可以通过 blkid 命令和 fdisk -l 命令分析出根文件系统的分区位置,而如果硬盘使用的是LVM分区,则可以使用 lvscan 命令查看分区,并且需要使用 vgchange -ay 命令激活VG卷组。

分析出根文件系统所在分区后挂载根文件系统,然后检查并修改fstab文件,如果该文件丢失,则手动创建一份,按照相应格式在其中添加挂载根文件系统的条目,然后重启系统,直到能够自动检测出硬盘上的系统并挂载到/mnt/sysimage下为止。


  • 第二步:进入到硬盘的根文件系统后,使用mount命令挂载光盘,比如将光盘挂载到/mnt/cdrom上:

wKioL1fanS6hJ8VzAAAYA8RfmJA421.png

  • 第三步:使用rpm命令安装kernel包,安装时会提示kernel已安装,需要使用--force--replacepkgs选项强制安装。安装完之后会在/boot目录下自动生成initramfs文件和vmlinuz文件

wKioL1faoVGAAOvAAAApESdi_UY378.png

vmlinuz-2.6.32-642.el6.x86_64initramfs-2.6.32-642.el6.x86_64.img 是系统启动时必要的两个文件,缺一不可。

vmlinuz-2.6.32-642.el6.x86_64:内核文件,如果只是该文件丢失,可以从光盘或者相同版本的操作系统上拷贝。

initramfs-2.6.32-642.el6.x86_64.img:虚拟文件系统,通过Boot Loader程序能够将其加载到内存中,然后这个文件会被解压缩并且在内存中模拟一个跟文件系统,这个跟文件系统能够提供一个可以运行的程序,通过该程序可以加载在启动过程中所需要的核心模块(RAID、LVM、SCSI等文件系统与磁盘的驱动程序),加载完成之后,会协助内核重新呼叫/sbin/init来执行后续的正常启动。如果只是该文件丢失,可以使用 mkinitrd /boot/initramfs-`uname -r`.img `uname -r` 重新生成 。

wKiom1fapZXBwlbyAAATyfHu-TE825.png

  • 第四步:使用 grub-install 命令修复grub,需要注意的是该命令需要指定/boot目录的父目录,如果/boot的父目录是根目录(/),则可以省略 --root-directory=DIR 选项。该命令也可以修复/boot/grub下的文件

wKiom1faqaSi6lEaAAAWXnrH6Ws273.png

  • 第五步:在/boot/grub下创建 grub.conf 配置文件,配置文件内容如下图所示

wKioL1fari3C92BrAABOwA6_X5I366.png

  • 第六步:使用exit命令退出硬盘中的文件系统,再使用reboot命令重启系统


5、grub.conf文件损坏的修复

如果grub.conf文件损坏,则操作系统将不能正常启动,此时手中如果有安装光盘的话可以通过救援模式重新创建grub.conf文件,但如果没有安装光盘的话,可以通过以下方式修复:

  • 第一步:如果grub.conf文件损坏,则系统系统时会自动进入grub的命令行模式,该模式下可以通过 help 命令查看帮助。使用root命令可以显示当前grub所在硬盘的分区位置;

wKiom1fatU_jZCf2AAAWOE3J3Ig390.png

  • 第二步:使用 root 命令指定内核存放的位置;

wKiom1fatcTBKl1VAAAGVFhYA70402.png

  • 第三步:使用 kernel 命令设置kernel文件路径及根文件系统所在设备,支持Tab命令补全;

wKioL1fatlnwLIMdAAAHXYFnyGc141.png

  • 第四步:使用 initrd 命令设置initramfs路径,支持Tab命令补全;

wKioL1fatuHwEylYAAAH3E0By2s850.png

  • 第五步:使用 boot 命令启动系统;

  • 第六步:系统启动后手工重新编写 /boot/grub/grub.conf 配置文件。



四、在U盘上自制 Linux 系统


根据 CentOS 6 的启动过程,可以在U盘上自制一个定制版的Linux系统,首先需要划分出一个/boot分区和一个根(/)分区,其次需要安装grub,然后将内核文件和initramfs文件放入到U盘的/boot目录下,最后创建必要的配置文件,具体步骤如下:

  • 第一步:使用 fdisk 命令为U盘创建/boot分区根分区,/boot分区(/dev/sdb1)大小为100M,根分区(/dev/sdb2)大小为6G

wKioL1fa0VXA_483AABWYK_y3G8161.png

  • 第二步:格式化分区,将/boot分区(/dev/sdb1)和根分区(/dev/sdb2)都格式化成ext4格式

wKioL1fa0cig41V4AABI4XgzxR0415.png

  • 第三步:分别将U盘上的boot(/dev/sdb1)分区和根分区(/dev/sdb2)挂载到当前系统的/mnt/boot/mnt/sysroot

wKioL1fa0iLgKMUjAABM2XY12S0752.png

  • 第四步:使用 grub-install 命令安装grub,注意需要指定所挂载U盘/boot分区的父目录为/mnt

wKioL1fa0sWD40bLAABoXnbfQYI094.png

  • 第五步:在/mnt/boot/grub目录下创建grub.conf配置文件,该配置文件中需要在kernel参数配置项中关闭selinux,并指定init程序为/bin/bash

wKioL1fa1F6DDGB9AABA66dqwFk198.png

  • 第六步:复制内核文件和initramfs文件到/mnt/boot目录下

wKiom1fa1KWyW9qvAAA5V-KiH9Y053.png

  • 第七步:在/mnt/sysroot目录下创建一级目录

wKioL1fa1iDBeGjVAACv_Gcm1iI957.png

  • 第八步:在/mnt/sysroot/bin目录下创建fstab的自动挂载文件

wKiom1fa1sbiYUH_AAAiSPQFtrg408.png

  • 第九步:复制bash命令及相关库文件,注意bash命令和库文件的路径一定要放对,可以使用which命令查看bash路径,使用ldd命令查看bash的依赖库

wKioL1fa2PWSej7WAABvfz6vBdo636.png

  • 第十步:参考第九步,根据需求复制相应的命令及库文件,可以使用脚本复制命令和库,脚本内容如下:

[root@localhost ~]# cat copycmd.sh 
#!/bin/bash
 
ch_root="/mnt/sysroot"
[ ! -d $ch_root ] && mkdir $ch_root
bincopy() {
    if which $1 &>/dev/null; then
        local cmd_path=`which --skip-alias $1`
        local bin_dir=`dirname $cmd_path`
        [ -d ${ch_root}${bin_dir} ] || mkdir -p ${ch_root}${bin_dir}
        [ -f ${ch_root}${cmd_path} ] || cp -n $cmd_path ${ch_root}${bin_dir}
        return 0
    else
        echo "Command not found."
        return 1
    fi
}
 
libcopy() {
    local lib_list=$(ldd `which --skip-alias $1` | grep -Eo '/[^[:space:]]+')
    for loop in $lib_list;do
        local lib_dir=`dirname $loop`
        [ -d ${ch_root}${lib_dir} ] || mkdir -p  ${ch_root}${lib_dir}
        [ -f ${ch_root}${loop} ] || cp -n $loop ${ch_root}${lib_dir}
    done
}
read -p "Please input a command: " command
while [ "$command" != "quit" ];do
    if bincopy $command ;then
        libcopy $command
    fi
    read -p "Please input a command or quit: " command
done


本文出自 “linux运维学习之路” 博客,请务必保留此出处http://fengliang.blog.51cto.com/3453935/1853079

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
前几天我博客记录了zabbix安装《 Ubuntu系统LNMP环境下安装配置zabbix3.04 》这里我们给大家分享一下zabbix-proxy安装配置。阿里云zabbix-service ,公司内网zabbix-proxy 下面开始: zabbix-proxy 服务器配置 1 、配置 zabbix 源 #wget http://repo.zabbix.com/zabbix/3.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.0-1+trusty
WEB 服务器的架设 , 在 linux 有一个很著名的架构叫 lamp : linux+apache+mysql+php,就知道apache的分量了。 在搭建 apache 服务钱需要做 DNS 服务器 DNS的搭建 http://wt7315.blog.51cto.com/10319657/1852795 http的详解 http://wt7315.blog.51cto.com/10319657/1837595 apache 后台进程: httpd 脚本: /etc/rc.d/init.d/httpd
1、路由配置 路由是互联网络的核心,没有路由的网络如同一座孤岛,掌握路由的配置是IT人员的必备技能。 例如:现在有三台主机需要通信,其中A和B在同一网段,C在另一网段,这两个网段有三个路由相隔,如何实现他们之间的通信呢? 主机A:IP=192.168.1.100/24 主机B:IP=192.168.1.63/24 主机C:IP=10.2.110.100/16 R1的接口0:IP=192.168.1.1/24,接口1:IP=110.1.24.10/24 R2的接口0:IP=110.1.24.20/24,接口

linux下使用quagga配置ospf协议 - 2016-09-12 18:09:22

环境:三台redhat6.5(VM虚拟机) 一、ospf协议 OSPF(Open Shortest Path First开放式最短路径优先)是一个内部网关协议(Interior Gateway Protocol,简称IGP),用于在单一自治系统(autonomous system,AS)内决策路由。是对链路状态路由协议的一种实现,隶属内部网关协议(IGP),故运作于自治系统内部。 PS:这里不过多讲解ospf协议,可在网上自行查找学习 二、配置 首先下载安装软件包,其他yum源以及网络配置就不再介绍了,三

远程桌面排错(已解决) - 2016-09-12 18:09:20

最近遇到了一个比较棘手的问题,用户远程桌面无法连接,我的博文中之前也写到了一篇远程桌面排错,但是这次的和之前的大不相同 = = 原因排查步骤 1)首先当然是查看报错,这个是我自己机器上截图的,报错信息都一样 2)首先查看服务器是否开启了远程访问 3)查看目标是否可以ping通 4)查看服务是否正常启动 5)如果要正常远程到目标必须可以telnet到目标的远程端口,默认为3389,这个端口不通,我们之前已经将防火墙关闭了 6)本机上telnet 127.0.0.1 3389,这么做的话可以排除外界因素的干扰
随着php脚本语言使用的普及,目前webserice服务大部分都在用nginx+(php-fpm)的结构,了解了其工作过程后才可以在各个方面想办法做调整优化和故障排查,从以下几点总结一下这种模型。 一、nginx 和 php-fpm 的关系和分工 nginx 是 web 服务器, php-fpm 是一个 PHPFastCGI 进程管理器,两者遵循 fastcgi 的协议进行通信, nginx 负责静态类似 html 文件的处理, php-fpm 负责 php 脚本语言的执行,这么设计的目的是为了解耦前端
数据库的运维中,经常会遇到delete drop truncate的操作,那么如何去把握它们的用法和区别呢? 比如当数据库空间爆满,已经增长到存储空间单个存储文件的最大值 32G 。你需要通过一些办法释放掉表空间或者扩容表空间来解决问题。 一般当系统中大量使用分区表,而针对分区表清除数据,是不会释放表空间的,必须把分区 drop 掉,才会释放空间。 下面我们具体了解一下这三个命令: 一、delete 1、delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在re
最近有一个服务器升级的项目,得知用户需求是03服务器上的文件、DNS、DHCP要迁移到Server 2012上,文件服务器最重要的当然是保留权限的设置,DHCP和DNS服务器实现迁移相对来说很简单 于是我便模拟了以下环境先进行测试,项目完成之后再做总结 = = 环境介绍 DC 192.168.124.250 Migration 192.168.124.251(Server 2012 R2 Datacenter,将03的服务器迁移到此服务器) FDDS 192.168.124.252(Server 2003
CentOS6中关于网络配置的命令有很多,本文将介绍几个平时最长用的几个命令,以及网卡IP地址的配置和简单路由配置。 1、经常使用的查看IP地址命令为 ifconfig,不跟参数的情况下默认查看所有已启用的网卡信息,如下图所示: 如果想查看具体某块网卡信息,则可以在ifconfig后面跟上网卡设备,如只查看eth0的信息则执行:ifconfig eht0 即可。 禁用某块网卡:结合down命令可以禁用某块网卡,如要禁用eth0网卡,则执行:ifconfig eth0 down 即可,这种禁用只是临时性的,
为Windows Server 2012 R2指定授权服务器 在Windows Server 2008 R2的终端服务中,可以手动指定授权服务器,而在Windows Server 2012 R2中,默认只能通过"远程桌面连接服务"管理器,指定授权服务器,而要使用远程桌面连接服务管理器,则需要安装一系列的组件,但大多数的时候,我们只是想配置一台"远程桌面会话主机",不想要安装"远程桌面网关服务"、"远程桌面Web代理"这些组件,那么,有没有办法和Windows Server 2008 R2一样,为Windo