一、电脑的启动过程

(一)大概过程
开机找到BIOS--》找到硬盘的MBR--》加载引导程序(lilo  grub等) --》加载kernel内核(挂载设备和硬件和必要的内核模块)--》启动用户空间程序。

(二)详细过程

(1)BIOS:开机--》bios启动,载入基本输入输出设备--》找到CPU,内存,和基本的IDE和SCSI硬盘
(2)根据设备的启动顺序找到硬盘(或其他存储设备如光盘、USB等)中的MBR(存放引导文件和分区引导的地方即bootloader,常用的bootloader程序有GRUB,lilo)--》通过grub等引导程序会列出操作系统列表,并标识出操作系统的引导文件所在的分区。
(3)引导文件找到操作系统的内核,并加载内核Kernel-->内核通过initrd文件进入虚根,用以访问存于文件系统中的内核模块,并加载相关设备的驱动和模块,加载完成后切换到实根--》后启动/sbin/init进程,内核开始初始化内存,并设置内核与相关模块。

(4)最后系统根据运行级别确定启动或停止哪些服务。根据/etc/inittab中设定的运行级来启动相关的服务和脚本。

(5)进入用户空间程序。



(三)几个关键概念:


1、mbr

MBR:位于0磁道,0扇区,共512字节。
其中446字节用于存放bootloader。常用的bootloader程序有grub,lilo等。
64字节用于存放分区,其中16字节存放一个分区,所以硬盘只能划分四个主分区,要想划分更多的分区,就需要用到扩展分区。
2字节标注MBR是否有效。


2、内核

linux内核设计:   单内核+模块

内核在/boot分区目录下

模块在/lib/modules/内核版本号相同的目录/   此目录下。

inux内核是单内核,单内核会让内核文件相当大,因为需要把所有的驱动都加载进来。所以Linux虽是单内核为了更优化,做成了核心内核和外围模块的模 式。启动时只是启动了内核核心。

而动态加载的内核外围模块有:驱动程序、文件系统(因为不仅仅只有一种文件系统)、加密文件等。


3、虚根

因为核心内核加载外围模块,就需要先加载存放外围模块这个磁盘的驱动,并能访问文件系统。而驱动又存于硬盘的文件系统的模块目录中。而没有驱动又无法识别出硬盘和文件系统,就没法加载模块。所以 内核就先设置了一个中间层叫虚拟根,有基本的/proc  /sys   /dev等目录,此虚根可以访问相关的模块文件,可以加载驱动,等加载完相关模块后会切换到实根。可以用chroot命令切换根目录。

kernel-->initrd-->ROOTFS, 即内核通过initrd找到文件系统才能找需要挂载的模块。



(内核载入从BIOS中取得的基本硬件相关数据(CPU和内存等),然后再查找各接口,以找到不同接口上的新硬件(如硬盘、网卡、显卡、USB等)--》如果探测到新硬件,则把相关信息加进/etc/sysconfig/hw.conf中,如设备驱动名称。
如需要特殊设备驱动,刚把技术规范加入/etc/modules.conf中。下次启动时会读取modules文件,装入所需的驱动。所以新设备如果没有驱动时,需要装入驱动。驱动一般在modules文件夹下。
(4)载入相关硬件后,内核开始初始化内存,并设置内核与相关模块。

(四)命令

dmesg  命令查询启动过程的交互信息
/proc  目录下提供了linux安装的硬件信息
lsmod  命令检查安装的模块。
rmmod  {模块名}  删除模块
insmod {模块名}  安装模块

 

(五)/etc/inittab中的六个运行级:

0: 停止、关闭linux,停止所有服务
1:单用户方式,不联网
2、多用户方式,不能访问NFS
3、多用户方式,启动计算机上的网络监控
5、图形登录
6、重新启动


redhtat7之后更改启动的方式有所改变:

1、systemctl set-default命令:设定新的运行级别:
systemctl set-default multi-user.target      设定默认为字符界面,也就是3
systemctl set-default graphical.target        图形界面   5


2、ln 软链接方式:

ln -sf /lib/systemd/system/multi-suer.target /etc/systemd/system/default.target  更改为3级

n -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target    更改为5级

 二、排错

(一)启动模式

1、单用户模式

也就是运行级 1  。只启用两个服务。 可用于根口令忘记; /etc/fstab文件损坏,文件系统无法装载等故障。

单用户的方式:

grub下:

(1)如果GRUB有口令,则先键入P键输口令
(2)选择想引导的版本,ELSMP版为支持 多处理器版,EL为单处理器版
(3)在想选择的版本上按e 键编辑
(4)到本行行末键入空格,然后输入single,回到引导行,输入b键开始引导。
可用的常用命令:

passwd root 更改根口令
检查卸载硬盘的命令 如 fsck
exit退出单用户模式后,不需要重启电脑。

lilo下:

必须按 ctrl+x退出图形屏幕,在 boot:提示符下输入  linux single即可。

 

2、救援模式

用引导盘或第一张光盘引导到安装模式下输入:  linux rescue

三个选项:

(1)contunue:linux会搜索硬盘中的安装文件,所有找到的文件系统都装载成/mnt/sysp_w_picpath的子目录。是一种自动救援模式。其实就是单用户模式。将/etc/fstab文件中相应文件系统都装载成/mnt/sysp_w_picpath的子目录。可以用fsck /dev/分区来检查磁盘;mount命令来重载分区设备。

(2)read-only: 只读,与上一方式差不多,只是找到的所有文件系统都装载成只读,是只读救援模式。可以在启动时,把单用户模式时输入的single改为emergency即可。

(3)skip: 跳过:则直接出现单用户方式中的shell提示,不查找可用的文件系统,是手工救援模式。


(二)MBR和GRUB

1、MBR概念

位于0磁道,0扇区,共512字节。
其中446字节用于存放bootloader。常用的bootloader程序有grub,lilo等。
64字节用于存放分区,其中16字节存放一个分区,所以硬盘只能划分四个主分区,要想划分更多的分区,就需要用到扩展分区。
2字节标注MBR是否有效。

2、grub概述

grub存于MBR中的bootloader区域,因为只有446字节大小,所以grub只把启动放于mbr中,只是用于找到/boot/grub目录,其他的文件放置于/boot/grub目录下。
grub分为三阶段:
stage1:存于mbr中,只为了引导然后找到/boot/grub目录
stage1.5:识别常见的不同文件系统。因为需要找到/boot/grub就需要先找到此分区,且识别出文件系统,所以需要此阶段。
stag2:/boot/grub目录。


3、/boot/grub/grub.conf配置文件详解

default=0  //默认启动哪个内核
timeout=5  //等待用户选择时间
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz  //grub背景图片
hiddenmenu         //隐藏菜单,去掉此项就不隐藏
password grub密码   //明文的。

password --md5   //加密的密码格式,然后保存,再用gurb -md5-crpt命令生成一个密码文件,再把生成的密码复制到 此处的后面,以后编辑GRUB就需要输密码
title Red Hat Enterprise Linux (2.6.32-358.el6.x86_64)    //要引导内核的标题,可以更改,第一行title是表示第0个内核。
        root (hd0,0)                                     //内核文件所在位置,对grub而言,所有类型的硬盘一律为hd.
        kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=UUID=e6f3c00e-91be-4c8d-b3da-a8685be82bd3 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        
//内核文件路径及传递给内核的参数:
   vmlinuz-2.6.32-358.el6.x86_64是内核版本,一定要写全。
   ro 是只读的意思
   root=LABEL= 后面是指定根文件系统所在分区,因为这里没有给根文件系统指定卷标,所以用uuid值指示根文件系统所在分区。
   rhgb  图形方式启动
   quiet 不输出启动信息


initrd /initramfs-2.6.32-358.el6.x86_64.img  //ramdisk文件路径  ,即虚拟根磁盘路径。


4、MBR修复(grub修复)
为防止MBR损坏,最好把MBR内容备份下来,然用把备份的内容放到其他机器或介质上保存。
MBR损坏,修复MBR
可通过借助别的主机修复和使用紧急救援模式两种模式修复MBR,主要讲紧急模式修复:
  (1)使用完整的系统安装光盘引导,进入rescue模式
  (2)安装grub:
           grub
           grub>root (hd0,0)  //指定/boot挂载在哪个地方,即内核所在的硬盘和分区。如果不知道可以用命令 find (hd0,0) /  来查找根在哪个硬盘的哪个分区,如果不是,就一个一个分区查找。

                                注:(hd0,0)中hd0是指第一个硬盘,linux中用hda表示,而grub用hd0表示,以此类推,具体看自己的linux内核安装在哪个硬盘;0指第一个分区。
           grub>setup (hd0)  //安装grub
           grub>quit
           sync               //同步到磁盘。
   

5、grub配置文件丢失修复
 
grub>root (hd0,0)       //指定/boot所在分区
grub>kernel /vmlinuz-2.6.32-358.el6.x86_64                         //注意,前面的内核版本一定要写全,如果不记得根分区此时也可以不添加。
grub>initrd /initramfs-2.6.32-358.el6.x86_64.img                  //指定Initrd文件,一定要完全相同。
grub>boot   //重新启动


进入系统,重建grub.conf文件。参照上面grub配置文件。


(三)其他常见错误修复

1、把默认级别设定为0,或6, 进行单用户模式,编辑intttab文件
2、/etc/rc.d/rc3.d      不小心删除了,  进入单用户模式,修改目录系统
3、服务故障
如果某个服务无法启动,进入单用户模式下,先关掉此服务。然后再启动电脑,然后修复此服务后再启用此服务。或重启进入交互模式(敲I键),手工确认是否启动某服务。
4、/etc/rc.local  语法错误,也进入单用户模式下,修改此脚本。

5、用户无法登录系统(bash程序故障)

光盘安装:
   进入紧急救援模式
     mkdir /media/cdrom
     mount /dev/hdc   /media/cdrom   //在紧急救援模式下,光驱被映射成了  /dev/hdc
       找到bash包安装。

         rpm  -ivh --replacepkgs --root /mnt/sysp_w_picpath  bash-3.2-32.e15.i386.rpm   // -root 指定安  装位置为实根/mnt/sysp_w_picpath下。

chroot  /mnt/sysp_w_picpath   //切换到实根


6、命令无法运行
手动指定PATH

或修改/etc/profile文件