Linux引导流程如下所示:
固件(firmware)的加电自检
读取MBR中的BootLoader(Grub)
载入内核(Kernel)
启动init进程
读取inittab
判定默认运行级别initdefault
执行rc.sysinit
执行rc
启动对应运行级别的文件
启动完成
固件的加电自检
固件:一个介于软件和硬件之间的东西,比如CMOS/BIOS。你不能称之为软件,因为它固化在主板上,但也不能称之为硬件,因为它是一段软件代码。可以说是一个固化在硬件上的代码。
固件的加电自检只是从物理层面检测硬件是否正常,如果正常,则进行后续流程,读取bootloader
硬件时钟与软件时钟的同步
一些软件可能因为时钟不同步而产生error
查看软件时钟的命令:date
查看硬件时钟的命令:hwclock
这两个时间应该是一样的。
如何同步?
硬件时钟复制到软件时钟:hwclock --hctosys
软件时钟复制到硬件时钟:hwclock --systohc
设置时钟(如果硬件时钟和软件时钟都不对)
设置软件时钟:date [MMDDhhmm[[CC]YY][.ss]]
例如:date 010511212015.12
设置软件时钟为2015年1月5号11点21分15秒
设置硬件时钟:hwclock --set --date="1/25/05 16:45:05"
MBR-主引导记录
MBR(Master boot record)主引导记录
MBR位于0柱面0磁头1扇区
固件在完成自检之后,就会读取硬盘中的MBR中的bootloader。
关于MBR中的bootloader,
Linux中广泛应用的bootloader为GRUB
(windows中使用的是ntldr(NT loader))
GRUB最重要的作用是载入系统内核
内核
Linux内核的版本号:如2.6.18
2表示主版本号
6表示次版本号-如果为奇数,则表示为测试版,如果为偶数,则为正式版
18表示末版本号
内核是单独的一个文件,名称如:vmlinuz-2.6.18-194.el5
并且是一个可执行文件
通常放在 /usr/src/linux下
内核只做两件事情:驱动硬件,启动init进程
init进程
init进程是系统启动的第一个进程,它的PID恒为1
init将会读取配置文件/etc/inittab,完成后续配置
init的ppid为0,即init的父进程为内核调度器(Kernel scheduler),它的PID为0
内核调度器负责进程间的切换和CPU时间的分配
父进程终止,子进程也会终止
如果父进程结束,子进程还在,则称这个子进程为孤儿进程,如果Linux发现了孤儿进程,则会将孤儿进程的父进程指定为init
如果子进程结束,父进程不知道,则称这个子进程为僵尸进程。
运行级别:
0 - halt 关机
1 - single user mode 单用户模式,只允许root登陆,没有图形界面,类似Windows的安全模式
2 - Multiuser
3 - Full multiuser mode 字符界面的多用户模式,2和3基本相同,是大多数服务器使用的模式
4 - unused 未使用,用户可以自定义
5 - X11 X是Xwindow的缩写,为图形化的多用户模式
6 - reboot 如果设置为此级别,会导致系统不断重启
查看当前运行级别:runlevel
设置系统运行界别:telinit和init
init [0123456Ss]或者telinit [0123456Ss]
S和s表示single
inittab文件剖析
grep -v "^#" /etc/inittab | more
inittab每一行都采用如下格式:
id:runlevel:action:process
其中:
id:标识符,一般为两个字母或数字
run-levels:运行级别,可以指定多个
action:指定运行状态
process:指定要运行的脚本或命令
栗子:
id:5:initdefault:
initdefault:指定系统默认启动的运行级别
所以,整行的含义就是指定系统默认的运行级别为5
si::sysinit:/etc/rc.d/rc.sysinit
sysinit:系统启动执行process中指定的命令
/etc/rc.d/rc.sysinit完成了系统环境变量设置等基本操作
10:0:wait:/etc/rc.d/rc 0
11:0:wait:/etc/rc.d/rc 1
...
判断默认运行级别,调用rc脚本,执行相应运行级别目录中的服务程序,完成相应运行级别的初始化设置
如果当前运行级别为3,则会执行/etc/rc.d/rc3.d目录中的文件。
上述目录中的文件格式大多类似于:
S12syslog
S表示start,开头可能是K(kill)
即在这个运行级别启动所有S开头的,终止所有K开头的
数字12表示启动顺序,较小的先启动
syslog为脚本名称
其他常用的action
wait:执行process中指定的命令,等到命令执行完成之后才能运行其他命令
once:执行process中指定的命令,不等待其结束
ctrlaltdel:重启
快捷键:
ctrl+alt+F1-F6:启动终端,默认总共有六个终端,在终端界面按下ctrl + alt + F7会回到图形界面
对应与inittab中的:
1:2345:respawn:/sbin/mingetty tty1
...
6:2345:respawn:/sbin/mingetty tty6
其中action:respawn表示一旦process指令的命令终止,则重新运行该命令
手动启动关闭服务
在/etc/rc.d/init.d文件夹中找到要启动的服务脚本,运行即可
以sshd服务为例
sshd start 启动sshd服务
sshd stop 终止sshd服务
sshd restart 重启sshd服务
sshd status 查看sshd的状态
设置自启动服务
启动自己写的服务
例如,自己写了一个脚本msg.script,放在/etc/rc.d/init.d/
想让它在3号运行级别启动
可以使用命令:
ln -s /etc/rc.d/init.d/msg.script /etc/rc.d/rc3.d/S100msg.script
这样就在系统引导时启动S100msg.script,从而达到目的
启动存在的服务
在rcX.d (X = 0,1,2,3,4,5,6)中把K改成S
如果不想启动,可以把开头的S改成s
查看系统当前服务的自启动状况:
chkconfig --list
如果为on,表示在此运行级别自启动,off表示不自启动
单独查看某个服务的状况
chkconfig --list sshd
指定某服务的启动状况:
chkconfig --level 2345 sshd off
表示sshd服务在运行级别2345不会自启动
ntsysv --level 3
设置某运行级别的启动服务
GRUB
grub的配置文件默认为:
/boot/grub/grub.conf
还有一个软链接:
/etc/grub.conf
grub.conf文件解析:
default=0
默认启动第一个系统(如果为双系统,可能有第二个系统)
timeout=5
定义选择启动系统等待的时间
splashimage=(hd0,0)/grub/splash.xpm.gz
定义启动的背景图片
其中(hd0,0),hd表示硬盘,hd0表示第一个硬盘,第二个0表示这个硬盘的第一个分区
hiddenmenu
隐藏菜单
title定义菜单项的名称,如:
title CentOS
root指定/boot所在的位置
kernel定义了内核所在的位置
initrd指定镜像所在的位置
grub命令
在grub界面
e:编辑当前的启动菜单项
c:进入GRUB 的命令行方式
b:启动当前的菜单项
d:删除当前行
Esc:返回GRUB启动菜单界面,取消所作的任何修改
应用:
查看引导期间的错误信息
dmesg | grep eth0
查看网卡eth0在引导期间的错误信息
dmesg | grep sda
查看硬盘sda在引导期间的错误信息
查看日志文件
linux所有日志文件都放在/var/log中
grep sshd /var/log/messages
查看sshd在messages中的信息
root密码忘记怎么办?
进入单用户模式重新设置密码
具体来说:
开机进入GRUB界面,按下e进入编辑行模式,选中kernel行,再次按下e,在新的界面的最后一行输入1或者s,即可以运行级别1启动(单用户模式)
进入单用户模式之后即可修改
设置grub密码
由于使用上述方式,任何能够接近装有Linux操作系统机器的人都可以修改root密码,从而得到机器中的资料,并修改机器配置,所以,有时需要给grub设置密码
有两种方式:
1,使用GRUB自带的grub-md5-crypt命令
# grub-md5-crypt
Password:
XXXXX(这是一个经过加密的秘文)
2,在GRUB交互命令行界面中使用md5crypt命令
#grub
grub>md5crypt
Password:
XXXXX(这是一个经过加密的秘文)
将你得到的秘文复制下来
打开grub.conf文件
在title的上方(hiddenmenu下面)加入一行:
password --md5 XXX(复制下来的经过加密的秘文)
保存,这样grub密码设置完毕。
GRUB修复
如果开机之后进入grub界面但是没有菜单,只有一个grub>提示符,解决方法如下:
如果没有正常进入grub命令行,可以在grub界面按下c。
在grub命令行中输入:
grub>cat /boot/grub/grub.conf (查看grub.conf文件,可以找错。。。)
之后:
grub>root (hd0,0)
grub>kernel (hd0,0)/vmlinuz-2.4.18-14 ro root=LABEL=/
grub>initrd (hd0,0)/initrd-2.4.18-14.img
grub>boot
总结一下:
Linux引导流程如下所示:
固件(firmware)的加电自检
读取MBR中的BootLoader(Grub)
载入内核(Kernel)
启动init进程
读取inittab
判定默认运行级别initdefault
执行rc.sysinit
执行rc
启动对应运行级别的文件
启动完成