9.Linux系统引导流程

时间:2022-05-01 05:13:42

一、Linux系统引导流程

当我们按下主机电源键的那时候开始,主板上的CMOS/BIOS模块将进行固件自检,以此检查各个硬件是否正确连接。

在Linux引导流程中,一般可以分为以下几个主要过程:

1、固件firmware(CMOS/BIOS)  ->  POST(Power On Self Test),即加电自检

2、自举程序BootLoader(GRUB) -> 将系统载入内核

3、载入内核Kernel  ->  驱动硬件

4、启动进程init  ->  服务启动

5、读取执行配置文件/etc/inittab

1、固件firware(CMOS/BIOS)

在按下电源键后,LINUX进行加电自检。在这个过程中,我们可以随时按下F2或F11等按钮,进入BIOS设置,对一些常见的固件设置进行设置。常用的固件设置包括:

· 安全设置

· 可引导介质列表

· 可引导介质搜索顺序(启动顺序)

· 等等

这一部分其实跟进入Windows的BIOS是基本上一样的。

此外,我们还可以在进入系统的时候使用一些命令查看硬件和软件的时钟。

硬件时钟是指CMOS上的时间,软件时钟是指系统上的时间,当两个时间不同时,可能会出现某些错误,因此我们必须了解如何设置这两个时间。常用的命令如下:

//执行以下命令必须先切换到root用户(只有root用户可以执行时钟命令)
[chanshuyi@localhost ~]$ su root
Password:

# hwclock  查看硬件时钟
# date       查看软件时钟

# hwclock –hctosys 用硬件时间设置系统时间(软件时间)
# hwclock –systohc 用软件时间设置硬件时间

#hwclock –set –date=”8/9/2003 16:45:05”
设置硬件时间为2013年8月9日16:45:05。其中时间格式为:MMDDYYYY hh:mm:ss

#date 121511302010.38
设置软件时间为2010年12月15日11:30:38秒。时间格式为:MMDDHHmmYYYYSS

注:查看命令帮助时,可以先用“命令 --help”查看剪短帮助。当查找不到想要的帮助信息时,可以用“man + 命令”查看更详细的帮助信息。

2、自举程序BootLoader(GRUB)

在Linux中,当CMOS/BIOS加点自检完成后,它就会去读取磁盘第一个扇区的bootloader程序(在Linux中对应的bootloader程序是GRUB)。在Linux中广泛使用的Bootloader就是GRUB。 在Windows下也有一个bootloader叫ntldr,即NT loader。所有bootloader最重要的一个功能就是将系统载入内核。在Linux下所说的grub是一个配置文件,它的文件路径是/boot/grub/grub.conf(它有一个软链接文件,存放在/etc/grub.conf下),它的文件内容如下:

# 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/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
password --md5 $1$HRvb$omlc/8yCiCaR0reqyM.kn1
title CentOS (2.6.32-431.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=98c8f16d-e03b-4a4b-a942-75bbacbae9aa 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
        initrd /initramfs-2.6.32-431.el6.x86_64.img

其中“#”号开头的行表示注释。

default = 0

表示缺省启动哪个系统。(因为硬盘可能装有多个系统,0表示第一个系统,1表示第二个系统,以此类推)

timeout = 5

表示留在启动界面多久之后没反应便自动进入默认选项

splashimage=(hd0,0)/grub/splash.xpm.gz

表示启动界面的图片

hiddenmenu

用于启动时隐藏菜单,除非在timeout之前按下ESC才能看到菜单

password --md5 $1$HRvb$omlc/8yCiCaR0reqyM.kn1

其中后面的“$1....kn1”字符串是设置grub密码后返回的一串密文,以后会说到。

title CentOS (2.6.32-431.el6.x86_64)

引导条目的名称。通常使用操作系统的名称做为标识,你可以自行更改这个名称。

root (hd0,0)

操作系统内核和引导文件所在的磁盘分区,并设置根目录(root)为硬盘的第一个分区(即root = /boot)。(hd0,0) 表示第一块硬盘的第一个分区,(hd0,2) 表示第一块硬盘的第3个分区,依次类推。

kernel

系统内核及 boot 命令用到的参数。

initrd

系统引导程序

注:kernel和initrd中指定的文件都是相对于root中所设置的硬盘分区,例如本例中的(hd0,0)是机器上的/boot分区,kernel的位置实际上是/boot//vmlinuz-2.6.32-431.el6.x86_64

其中title/root(hd0,0)/kernel/initrd这4行是一个整体,它代表一个系统引导信息。如果有多个系统,那么就会有多个tiel/root/kernel/initrd信息。

当自举程序grub读取到grub.conf配置文件时,根据grub.conf文件的配置,决定将哪个系统载入内核。

内核会做两件事情,一是在操作系统的层次上驱动所有硬件,二是启动init进程并由init进程去完成接下来的系统引导。

3、启动init进程

启动init进程后,init进程会去读取/etc/inittab配置文件。

读取Inittab配置文件时,init进程根据initdefault判断系统的运行级别。

之后读取/etc/rc.d/rd.sysinit脚本来完整系统的一些初始化命令(这个脚本是无论选择什么运行级别都会执行的,因此可以将需要初始化的一些指令放在这个脚本后面来执行)。

之后读取/etc/rd.d/rc脚本,根据缺省的运行级别initdefault的值,决定运行/etc/rc.d/rcN.d目录下的特定脚本(这个目录下的文件,以大写S开头的表示Start需要初始化,大写K的表示Kill不需要初始化的),来完成特定运行级别下的一些初始化命令(N指运行级别)。

当执行完rcN.d脚本后,系统就会进入相应的界面,提示我们输入用户名和密码,此时Linux的系统引导就结束了。

注:一些系统默认安装的目录都放在:/etc/rc.d/init.d目录下。

其中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:5:initdefault:

其中最后一行“id:5:initdefault:”代表的意义是缺省启动Linux第5个运行级别。

这里设计两个知识点,一个是inittab文件中条目的格式,一个是Linux的运行级别。

· Linux的运行级别

0 – 表示关机,等于shutdown

1 - 单用户模式,只有root可以登录,且没有图形界面。一般情况下需要修复Linux的时候才进入此种模式。类似于Windows的安全模式。

2 – 多用户模式。与3共同,但与3相比没有NFS服务,即Network File System(Unix系列的一个文件共享机制)。是广泛使用的服务器模式。

3 – 多用户模式

4 – 没有使用的一种模式。你可以自己定义

5 – x11  系统默认启动的模式(图形化的多用户模式,与3相比就是多了图形化界面)

6 – 重启

在命令行下,如果要查看当前运行级别以及切换运行级别,可以用如下命令:

//查看当前的运行级别
#runlevel
S 3 (S是指上次的运行级别,3是指现在的运行级别)

//运行级别的切换
#init [0123456Ss]   或  #telinit [0123456Ss]

0123456分别代表对应的运行级别,S和s表示单用户模式即运行级别1。

· inittab文件中的条目格式

在inittab中,所有条目采用如下格式:id:run-levels:action:process

id:条目的标识符,包含4个字符以内的字母或数字(但在inittab文件中一般都是用两位字符)

run-levels:指定运行级别,可以指定多个

action:指定运行状态

process:指定要运行的可执行程序的完整路径

其中action的常用取值有:

initdefault:指定系统缺省启动的运行级别

sysinit:系统启动执行process中指定的命令

wait:执行process中指定的命令,并等其结束之后再运行其他命令

once:执行process中指定的命令,不等待其结束

ctrlaltdel:按下Ctrl+Alt+Del时执行process指定的命令

powerfail:当出现电源错误时执行process指定的命令,不等待其结束

powerokwait:当电源恢复时执行process指定的命令

respawn:一旦process指定的命令中止,便重新运行该命令

比如:上面的

“id:5:initdefault:”  

initdefault表示指定系统缺省启动的运行级别,5表示指定运行级别为5。表示默认启动运行级别5(即X WINDOW)

“id::sysinit:/etc/hello.script”

sysinit表示系统启动执行process的命令,(范围)是所有的运行级别(空表示所有运行级别),(哪个命令)hello.script脚本对应的命令。这样就表示在系统启动的时候,无论哪个运行级别都执行hello.script脚本。

“id:5:wait:check.script”

表示在运行级别为5的时候,等待执行check.script脚本执行完毕后再继续执行其他指令。

二、Linux启动服务管理

1、人工启动服务

我们可以用“服务名 stop/restart/status/condrestart/reload”来查看或更改系统的服务。

如:“stop /etc/rc.d/init.d/sshd”

其中restart = stop + start,如果该服务已经关闭了,那么执行stop环节时会失败。

而condrestart = {stop} + start,其中的stop是选择执行的。如果服务已经关闭,那么stop就不会执行。否则会执行stop关闭服务。

2、设置自启动服务

设置服务自启动有三种方法,分别是:

· ln -s  设置软链接到对应的rcN.d目录下

范例:“ln -s /etc/rc.d/init.d/msg.script /etc/rc.d/rc3.d/S100msg.script”

· chkconfig 命令

chkconfig –list 查看所有服务在所有运行级别下的启动状态

chkconfig –list sshd 查看某个服务在所有运行级别下的启动状态

chkconfig --levels 2345 sshd off 设置sshd服务在2345运行级别下不启动

· ntsysv 命令

运行:“ntsysv --level 3”命令,查看所有运行级别3下的服务,用界面的方式设置启动与否。

其中已启动的用“*”表示,不想其启动用空格取消即可。

三、启动故障分析与解决

用dmesg命令可以检查引导期间的错误。配合grep命令可以快速查看某个硬件的引导是否出问题,如:

dmesg | grep hda  查看硬盘第一分区的引导是否出错

而查找系统日志/var/log/messages,可以查找可能被dmesg忽略的应用程序错误。

案例一:忘记root密码,进入单用户模式

因为进入单用户模式是只能用root用户进入,但是不需要密码。因此当我们忘记了root密码的时候,我们可以通过进入单用户模式更改密码,从而用新的密码进入系统。

步骤一:开机时按ESE键进入GRUB界面,按e进入编辑航模式,选择kernel行,再次按e键编辑,在新的界面的最后一行输入1或s,即可进入单用户模式。

步骤二:进入单用户模式后像更改其他密码一样,输入passwd root,再输入设置的密码即可。

因为只要接触到这台电脑的就可以随时重新设置密码,那会不会因此Linux系统就不安全呢?其实因为基本上所有的服务器都是所在机房中的,普通人是接触不到这些机器的,所以不用担心这个问题。另外,如果你还是担心的话,你可以给Linux设置一个GRUB密码,这样你在编辑GRUB条目的时候就必须先输入密码才能进入单用户模式。

案例二:设置GRUB密码

使用GRUB自带的grub-md5-crypt命令,如:

命令行下输入:“#grub-md-crypt ”之后按照提示即可。最后复制输出的加密后的密文字符串。

最后编辑grub配置文件,加入如下行:

password -md5 [密文字符串]

另外我们也可以通过:“md5crypg”命令生成加密后的密文字符串。

案例三:GRUB命令行下手动启动系统

当系统只能进入grub界面但没有菜单时,我们可以进入grub命令行下,通过输入grub.confing文件中的root/kernel/initrd三行命令,最后输入boot就可以手工引导系统来修复系统。

9.Linux系统引导流程

案例四:当无法进入命令模式的时候,如何修复系统

这种情况需要通过光驱启动,进入到命令行模式去排除错误

1、安装光盘到光驱,然后重启极其,在BIOS中设置用光驱引导

2、等安装界面弄出来后,按F5键,也就是linux rescue模式,然后在boot下输入linux rescue,然后就是回车一下,之后会进入 sh# 命令行下。