Linux 引导流程解析 第5天

2012-08-11 22:02:56 0  category: linux
固件 firmware(CMOS/BIOS)介于软件和硬件之间→POST 加电自检
firmware 硬件检测
案例:时间同步
1.软件时钟 $date
2.硬件时钟 $hwclock (BIOS 时钟)
$ date
$ hwclock
$ hwclock --help
--hctosys 将系统时间设置为硬件时间
--systohc 将硬件时间设置为软件时间
NTP 网络时间协议
设置软硬件时钟
man hwclock
$ hwclock --set --date="9/22/96 16:45:05"
man date
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
$ date 022515432011.05
2011 年 02 月 25 日 星期五 15:43:05 CST
BootLoader
GRUB
载入内核
硬盘读取数据的第一个位置-MBR 主引导记录 Master Boot Recorder
bootloader 自举程序 GRUB LILO(服务器已不用)再入内核
Windows fdisk /mbr
kernel
作用:
1.驱动硬件(操作系统层面,每个内核内占空间最大的是硬件驱动)
2.驱动 init 进程
内核存放在/boot 目录
vmlinuz-2.6.18-194.el5
vmlinuz:z 标识压缩之意
2.6.18 —— version
94.el5 —— release
6- 偶数,正式版 奇数,测试版
init
init 启动后读取 inittab 文件,执行缺省运行级别,从而继续引导过程。在 UNIX 系统中,
init 是第一个可以存在的进程,它的 PID 恒为 1,但它必须向一个更高级的功能负责;PID
为 0 的是内核调度器(Kernel scheduler),从而获得 CPU 时间。
父子进程关系:
父进程终止,子进程自然终止
a
1、父亲死了,儿子死了--孤儿进程
|
自动把父进程指向 init
b
2、儿子死了,父亲不知道--僵尸进程(用 kill 处理)
Zombie
/etc/inittab
inittab 文件格式:id:runlevels:action:process
id-数字标识,一般为两个字母或数字。
runlevels-指定运行级别 0-6 可指定多个
0-关机
1-单用户模式(类似 Windows 安全模式)只有 root 登录、没有图形界面
S s
2-多用户模式,不启用 NFS,命令行界面
3-完整多用户模式,命令行界面
NFS-网络文件系统 Network File System Linux/UNIX 文件共享
Sun NIS 网络信息系统 资源集中管理服务 Information System
4-自己定制
5-多用户的图形界面(默认) X11 X11R6 xfree86
6-重启
init 切换运行级别
# init [0123456sS] 或 #telinit[0123456sS]
$init 0 关机
$init 6 重启
$runlevel 查看当前运行级别
切换过用户后和未切换过用户的$runlevel 输出结果不一样 S 或 s 表示为单用户模式
action:指定运行状态
action 常用取值:
initdefault:指定系统缺省启动的运行级别
sysinit:系统启动执行 process 中指定的命令
wait:执行 process 中指定的命令,并等其结束在运行其他命令。
once:执行 process 中指定的命令,不等待其结束
ctrlaltdel:按下 Ctrl+Alt+Del 时执行 process 指定的命令
powerfail:当出现电源错误时执行 process 指定的命令,不等待其结束。
powerokwait:当电源恢复时执行 process 指定的命令。
respawn:一旦 process 指定的命令中止,便重新运行该命令。
process:要执行的操作(命令或脚本)
initdefault
id:3:initdefault:
Window,则将 3 改为 5.
指定系统默认运行级别为 3 ,如果想系统启动后自动运行 X
/etc/rc.d/rc.sysinit
si::sysinit:/etc/rc.d/rc.sysinit
启动脚本/etc/rc.d/rc.sysinit,
完成系统服务程
序启动,如系统环境变量设置、设置系统时钟、加载字体、检查加载文件系统、生成系统启
动信息日志文件等。
runlevels 为空,标识任何运行级别都可以执行
/etc/rc.d/rc
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
判断默认运行级别,调用/etc/rc.d/rc 脚本,执行相应运行级别目录中的服务程序,
完成相应级别的初始化设置
/etc/rc.d/init.d 目录下包含各个运行级别的服务程序脚本
/etc/rc.d/rcN.d
N=0-6
$ls /etc/rc.d
$ls /etc/rc3.d
$ ls -ld /etc/rc3.d
lrwxrwxrwx 1 root root 10 02-22 23:10 /etc/rc3.d -> rc.d/rc3.d
/etc/rc.d/rc[0123456].d 中分别存放对应于运行级别的服务程序脚本的符号链接,

接到 vinit.d 目录中的相应脚本。
S10network
S-启动 start K-关闭 kill
10-优先级,数字越小优先权越高,数字相同按脚本创建时间执行
network-服务名称
案例:系统启动时关闭蓝牙功能
$ cd /etc/rc.d/rc3.d
$ mv S25bluetooth s25bluetooth (在/etc/rc.d/rcN.d 中修改默认启动
的服务为不启动时, S 改为 s 比改为 K 好,

以后还可以看出那些服务是改过
的启动状态。)
开启最少的服务,给用户最少的权限
x:5:respawn:/etc/X11/prefdm -nodaemon 启动 X window
Linux 服务器启动脚本存放的目录:
/etc/rc.d/init.d
/etc/init.d-> rc.d/init.d
$ /etc/rc.d/init.d/vsftpd
用法:/etc/rc.d/init.d/vsftpd {start|stop|restart|condrestart|status}
start 启动 stop 停止 restart 重启 condrestart 重启前检测服务器是否启动该服
务 status 查看服务状态
# /etc/rc.d/init.d/vsftpd start
# /etc/rc.d/init.d/vsftpd restart
# /etc/rc.d/init.d/vsftpd stop
# /etc/rc.d/init.d/vsftpd status
service 服务名称 start|stop|restart
$ service nfs restart
设置自启动程序
vi /etc/rc.d/init.d/msg.script
date >> /root/msg.today
who >> /root/msg.today
free >> /root/msg.today
chmod u+x /etc/rc.d/init.d/msg.script
ln -s /etc/rc.d/init.d/msg.script /etc/rc.d/rc3.d/S100msg.script
chkconfig
$chkconfig --list sshd
chkconfig --list 服务名称 查看服务启动状态
chkconfig --level 运行级别 服务名称 on|off
$chkconfig --list sshd
$chkconfig --level 245 sshd off
$chkconfig --list sshd
$chkconfig --level 2 sshd on
$chkcoonfig --list sshd
ntsysv
$ntsysv --list 运行级别
$ntsysv --level 2
dmesg
主要检测 kernel 内核引导期间信息
$dmesg
添加硬件:网卡、硬盘
1.固件中查看是否支持
2.内核是否能够识别——硬件驱动
$dmesg | grep eth0
$dmesg | grep eth1
$dmesg | grep hda
$dmesg | grep sdb
$dmesg | grep sdb
/var/log/messages 主要检测 rc 启动系统服务程序时的信息
$ grep syslogd /var/log/messages
Ctrl+Alt+F1~F6 切换到命令终端 图形界面到字符界面
GRUB:
GRUB 配置选项
/boot/grub/grub.conf
[root@helen ~]# ls -l /etc/grub.conf
lrwxrwxrwx 1 root root 22 02-22 23:16 /etc/grub.conf -> ../boot/grub/grub.conf
grep -v "字串" 文件名 排除含有字串的行
$grep -v "^#" /boot/grub/grub.conf 显示结果中不包含注释行
default:定义缺省启动的系统(Linux-0,Windows-1)
timeout 定义缺省等待时间
splashimage 定义 GURB 界面图片
hiddenmenu 隐藏菜单
title 标题
root 指定内核所在分区/boot,没给/boot 划分分区时内核就在/分区下。
kernel 指定内核所在位置,ro 只读 root 指定根分区设备名或卷标。
root /dev/ha1(旧 Linux)
root=LABEL=/(新 Linux,可改为 root=hda1)
initrd 指定镜像文件所在的位置
GRUB 命令
功能键:
e:编辑当前的启动菜单项
c:进入 GRUB 的命令行方式
b:启动当前的菜单项
d:删除当前行
Esc:返回 GRUB 启动菜单界面,取消对当前单项所做的的任何修改
总结
firmware
检测硬件
|
BootLoader GRUB 载入内核
|
kernel
驱动硬件
|
init
|
/etc/inittab
|
initdefault
|
/etc/rc.d/rc.sysinit
|
/etc/rc.d/rc
|
/etc/rc.d/rcN.d
|
/etc/X11/prefdm
单用户模式应用
案例:root 密码忘记
进入单用户模式重新设置 root 密码,方法如下:
开机按任意键进入 GRUB 界面,按 e 进入编辑行模式,选中 kernel 行,再次按 e 键,在新的
界面的最后一行输入空格 1 或空格 s,再按 b 健,即可进入单用户模式,登录后无需输入密
码,使用$psswd root 修改 root 密码后使用$exit 退出单用户模式。

 

设置 GRUB 密码
1.使用 GRUB 自带的 grub-md5-crypt 命令
#grub-md5-crypt
Password:
$1$EszU60$Mc2BwxeWUH/8q3iqbRknz0
2.在 GRUB 交互命令行界面中使用 md5crypt 命令
#grub
grub>md5crypt
Password:
$1$EszU60$Mc2BwxeWUH/8q3iqbRknz0
同样的明文口令每次加密获得的 MD5 密文口令也是不同的。
编辑 GRUB 配置文件,加入如下行:
password --md5 $1$EszU60$Mc2BwxeWUH/8q3iqbRknz0
--md5 参数表示口令是 MD5 加密的。
[root@helen ~]# md5sum /etc/inittab
92a39a223f68e67e9e6c412443851aeb /etc/inittab
[root@helen ~]# echo "####" >> /etc/inittab
[root@helen ~]# md5sum /etc/inittab
2026e13e2a5328c059a10768b629d08a /etc/inittab
[root@helen ~]# grub-md5-crypt
Password: 123456
Retype password: 123456
$1$F2sl.0$7LBYwNXYNPV9jKVLSFU7g1
[root@helen ~]# vi /boot/grub/grub.conf
13 hiddenmenu
14 password --md5 $1$F2sl.0$7LBYwNXYNPV9jKVLSFU7g1
15 title CentOS (2.6.18-194.el5)
[root@helen ~]# reboot
[root@helen ~]# vi /boot/grub/grub.conf
title CentOS (2.6.18-194.el5)
password --md5 $1$F2sl.0$7LBYwNXYNPV9jKVLSFU7g1 (进入系统时输入密码)
root (hd0,0)
[root@helen ~]# reboot
GRUB 修复
当开机后进入 grub 界面但没有菜单,只剩下一个 grub>提示符,解决方法:
grub>cat/grub/grub.conf(为查看参数)
grub>root(hd0,6)
grub>kernel(hd0,6)/vmlinuz-2.6.18-14 ro root=LABEL=/ (最好用 TAB 键输入文件名)
grub>initrd(hd0,6)/initrd-2.6.18-14.img(最好用 TAB 键输入文件名)
grub>boot
[root@helen ~]# vi /boot/grub/grub.conf
13 hiddenmenu
(删除了下面的 title 行)
14 password --md5 $1$F2sl.0$7LBYwNXYNPV9jKVLSFU7g1
[root@helen ~]# reboot

 

Linux 修复模式
解决过程
1.把安装盘放到光驱,然后重新启动机器,在 BOIS 中把系统设置为光驱引导。
2.等安装界面出来后,按[F5]键进入 linux rescue 模式说明,然后在 boot 提示符下输入:
linux rescue
然后回车,进入修复模式。
[root@helen ~]# ls -l /etc/inittab
-rw-r--r-- 1 root root 1671 02-25 23:31 /etc/inittab
[root@helen ~]# cp /etc/inittab /backup (备份/etc/inittab)
[root@helen ~]# rm -f /etc/inittab
[root@helen ~]# reboot

 

重启之后用用光盘引导