1、简述linux操作系统启动流程
大家都知道Linux内核是一个操作系统中非常重要的一环,它是底层硬件与上层软件链接的枢纽,Linux系统的组成:内核+根文件系统
Linux内核特点:
支持模块化:.ko
支持模块运行时动态装载或卸载
组成部分:
1.核心文件:/boot/vmlinuz-VERSION-release
2.ramdisk:(动态创建临时根文件,里面是内核启动加载磁盘文件系统根必须的磁盘驱动程序等,在某些个人计算机上,可以设计无需此帮助,使用缓冲和缓存来加速对磁盘上的文件访问,把内存当硬盘使用)
ramdisk:ramdisk --> ramfs
CentOS 5: initrd 工具程序:mkinitrd
CentOS 6,7: initramfs 工具程序:dracut, mkinitrd
(文件位置)CentOS 6,7:/boot/initramfs-VERSION-release.img
3.模块文件:(包含许多内核需要加载的模块文件,如文件系统类型文件存放)
/lib/modules/VERSION-release
如我这里的vmlinuz-3.10.0-327.e17.x86_64 就是内核的核心文件
initramfs-3.10.0-327.el7.x86_64.img 就是相对应的ramdisk文件
而、lib/modules/就是相对应内核版本的模块文件
centos 系统启动流程
1.内核空间
(1)POST:加电自检;ROM:CMOS BIOS:Basic Input and Output System
ROM+RAM
(2)Boot Sequence:按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备;
*MBR:Master Boot Record
512bytes:
446bytes:bootloader
64bytes:fat
2bytes:55AA (有效)非55AA(无效)
(3)bootloader:引导加载器,程序 Linux:(放置于MBR中)
LILO:LIinux LOader
GRUB:Grand Uniform Bootloader
(这个过程是选择操作系统内核,将内核装载到内存特定空间中。把系统控制权给内核)
*GRUB
bootloader:1st stage
Partition:filesystem driver, 1.5 stage
Partition:/boot/grub, 2nd stage
(MBR)bootloadder—————(GRUB)Partition(第二阶段,提供交互式界面,选择内核类型)————加载内核
(4)加载内核(kernel)
开始自身初始化
探测可识别的所有硬件设备——加载硬件驱动(可能借助ramdisk)———只读挂载文件系统(读取根文件系统)————运行总父程序init(用户空间的老大)
*init程序的类型:
CentOS 5-:SysV init 配置文件:/etc/inittab
CentOS 6:Upstart 配置文件:/etc/inittab/etc/init/*.conf
CentOS 7:Systemd 配置文件:/usr/lib/systemd/system/, /etc/systemd/system/
总结
*内核空间(内核级别的启动流程)
POST(电自检)——Boot Sequence(查找引导设备)——(MBR)bootloadder—————(GRUB)Partition(第二阶段,提供交互式界面,选择内核类型)————加载内核————探测可识别的所有硬件设备——加载硬件驱动(可能借助ramdisk)———只读挂载文件系统(读取根文件系统)————运行总父程序init(用户空间的老大)
2.用户空间(分别从5,6,7版本说明)
centos 5 (级别适用于6,7)
*设置默认运行级别
运行级别:为了系统的运行或维护等目的而设定的机制;0-6:7个级别;
默认级别:3, 5
级别切换:init #
级别查看:(1)who -r (2)runlevel
配置文件:/etc/inittab
0:关机, shutdown
1:单用户模式(single user),root用户,无须认证;维护模式;
2、多用户模式(multi user),会启动网络功能,但不会启动NFS;维护模式;
3、多用户模式(mutli user),完全功能模式;文本界面;
4、预留级别:目前无特别使用目的,但习惯以同3级别功能使用;
5、多用户模式(multi user), 完全功能模式,图形界面;
6、重启,reboot
目录下的服务脚本所控制服务;
K*:要停止的服务;K##*,优先级,数字越小,越是优先关闭;依赖的服务先关闭,而后关闭被依赖的;
S*:要启动的服务;S##*,优先级,数字越小,越是优先启动;被依赖的服务先启动,而依赖的服务后启动;
inittab服务
配置文件地址:/etc/init.d/服务名
chkconfig 后台服务管理命令
/etc/init.d/* (/etc/rc.d/init.d/*)
脚本框架:#!/bin/bash# (级别)(启动优先级)(关闭优先级)
# chkconfig: LLL NN NN#
description: (非必要)
for srv in /etc/rc.d/rc#.d/K*; do
$srv stop
done
for srv in /etc/rc.d/rc#.d/S*; do
$srv start
done
脚本执行方式:# /etc/init.d/SRV_SCRIPT {start|stop|restart|status}# service SRV_SCRIPT {start|stop|restart|status}
每个服务脚本在各级别下的启动或关闭状态;
查看:chkconfig --list name
添加:chkconfig --add name
删除:chkconfig --del name
修改模式状态chkconfig --level number name <on|off|reset>
*系统初始化脚本:/etc/rc.d/rc.sysinit(相对于centos5来说)
(1) 设置主机名;
(2) 设置欢迎信息;
(3) 激活udev和selinux;
(4) 挂载/etc/fstab文件中定义的所有文件系统;
(5) 检测根文件系统,并以读写方式重新挂载根文件系统;
(6) 设置系统时钟;
(7) 根据/etc/sysctl.conf文件来设置内核参数;
(8) 激活lvm及软raid设备;
(9) 激活swap设备;
(10) 加载额外设备的驱动程序;
(11) 清理操作;
*终端配置文件
tty1:2345:respawn:/usr/sbin/mingetty tty1
... ...
tty6:2345:respawn:/usr/sbin/mingetty tty6
(1)mingetty会调用login程序;
(2)打开虚拟终端的程序除了mingetty之外,还有诸如getty等;
centos 6 服务配置
init程序:upstart,但依然为/sbin/init,其配置文件:
/etc/init/*.conf, /etc/inittab(仅用于定义默认运行级别)
注意:*.conf为upstart风格的配置文件;
rcS.conf
rc.conf
start-ttys.conf
CentOS 7 服务配置
init程序:systemd,配置文件:/usr/lib/systemd/system/*, /etc/systemd/system/*
完全兼容SysV脚本机制;因此,service命令依然可用;不过,建议使用systemctl命令来控制服务;
# systemctl {start|stop|restart|status} name[.service]
总结
*用户空间(用户级别的启动流程)
/sbin/init——/etc/inttab(访问配置文件)——设置默认运行级别—————运行系统初始化脚本,完成系统初始化————关闭K服务开启S服务————设置登录终端---------启动图形终端(非必要)
合并总结
*内核空间+用户空间(相对于centos5,6而言)
POST(电自检)——Boot Sequence(查找引导设备)——(MBR)bootloadder—————(GRUB)Partition(第二阶段,提供交互式界面,选择内核类型)————加载内核————探测可识别的所有硬件设备——加载硬件驱动(可能借助ramdisk)———只读挂载文件系统(读取根文件系统)————运行总父程序init(用户空间的老大)/sbin/init——/etc/inttab(访问配置文件)——设置默认运行级别—————运行系统初始化脚本,完成系统初始化————关闭K服务开启S服务————设置登录终端---------启动图形终端(非必要)
2、简述grub启动引导程序配置及命令行接口详解
我们知道Linux开机过程中遇到grub交互界面,来选择内核和系统类型,ramdisk等
对于(centos5,6来说)
grub legacy:
stage1: mbr
stage1_5: mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统;
stage2:磁盘分区(/boot/grub/)
配置文件:/boot/grub/grub.conf <-- /etc/grub.conf
stage2及内核等通常放置于一个基本磁盘分区;
功用:
(1) 提供菜单、并提供交互式接口
e: 编辑模式,用于编辑菜单;
c: 命令模式,交互式接口;
(2) 加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏此菜单
(3) 为菜单提供了保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
如何识别设备:
(hd#,#)
hd#: 磁盘编号,用数字表示;从0开始编号
#: 分区编号,用数字表示; 从0开始编号
(hd0,0)
grub的命令行接口
help: 获取帮助列表
help KEYWORD: 详细帮助信息
find (hd#,#)/PATH/TO/SOMEFILE:
root (hd#,#)
kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数;
例如:init=/path/to/init, selinux=0
initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk;
boot: 引导启动选定的内核;
手动在grub命令行接口启动系统:
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
配置文件:/boot/grub/grub.conf
配置项:
default=#: 设定默认启动的菜单项;落单项(title)编号从0开始;
timeout=#:指定菜单项等待选项选择的时长;
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;
hiddenmenu:隐藏菜单;
password [--md5] STRING: 菜单编辑认证;
title TITLE:定义菜单项“标题”, 可出现多次;
root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”;
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件;
password [--md5] STRING: 启动选定的内核或操作系统时进行认证;
grub-md5-crypt命令
内核保护密码设置明文,来是登入输入密码加载内核
进入单用户模式:
(1) 编辑grub菜单(选定要编辑的title,而后使用e命令);
(2) 在选定的kernel后附加
1, s, S或single都可以;
(3) 在kernel所在行,键入“b”命令;
安装grub:
(1) grub-install
grub-install --root-directory=ROOT /dev/DISK
(2) grub
grub> root (hd#,#)
grub> setup (hd#)