Linux操作系统启动流程
POST -->
BootSequence(BIOS) -->
Bootloader(mbr) -->
kernel(ramdisk) -->
rootfs(switch_root) --> /sbin/init(/etc/inittab;/etc/init/*.conf;/usr/lib/systemd/system/) -->
设置默认运行级别;运行系统初始化脚本,完成系统初始化;关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务 -->
设置登录终端 -->
启动[图形]终端
以上流程分两部分:
- 内核空间的启动流程:
-
POST(power on system test):加电自检;给CMOS加电,通过启动其上的BIOS(Basic Input Output System即基本输入输出系统)程序去读取硬件信息并检测其是否存在。
-
Boot Sequence:按次序查找个引导设备,第一个有引导程序的设备即为本次启动要用到的设备。
-
Bootloader(mbr): 引导加载器,程序。提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权移交给内核。(注意:BootLoader只能放在基本磁盘分区上,而不能存放于逻辑磁盘)
-
kernel(ramdisk):自身初始化
<1>探测可识别到的所有硬件设备
<2>加载硬件驱动程序(有可能会借助于ramdisk加载驱动)- ramdisk (虚拟文件系统): Linux内核特性之一;使用缓冲和缓存来加速对磁盘上的文件访问;即把内存当磁盘来用。
- 配置文件:
* CentOS 5:/boot/initrd-VERSION-release.img ;程序工具:mkinitrd
为当前正在使用的内核重新制作ramdisk文件:mkinitrd /boot/initramfs-(uname -r)
* CentOS 6,7:/boot/initramfs-VERSION-release.img;程序工具:dracut
为当前正在使用的内核重新制作dracut /boot/initramfs-(uname -r)
-
rootfs:挂载根文件系统(readonly以只读方式挂载根文件系统);
-
switch_root:切换根文件
- 用户空间的启动流程:
-
/sbin/init: 运行用户空间的第一个应用程序/sbin/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 -
设置默认运行级别:
* 运行级别:为了系统的运行或维护等目的而设定的机制
* 共分7个级别:0-6
* 0:关机,shutdown
* 1:单用户模式(single user),root用户无需认证,维护模式
* 2:多用户模式(multi user),会启动网络功能,但不会启动NFS,维护模式
* 3:多用户模式,完全功能模式,文本界面
* 4:预留级别,目前无特别使用目的,但习惯以同3级别功能使用
* 5:多用户模式,完全功能模式,图形界面
* 6:重启,reboot- 默认级别为:3或5;服务器基本上默认使用3级别
- 级别切换:init #
- 级别查看:who -r或者runlevel
- 默认级别为:3或5;服务器基本上默认使用3级别
-
运行初始化脚本,完成系统初始化:/etc/inittab(只针对CentOS5系统)
* 每行定义一种action,以及与之对应的process
init配置文件/etc/inittab中的格式:
id:runlevels:action:process
* id:一个任务的标识符
* runlevels:在哪些级别启动此任务:#,###, 也可以为空,表示所有级别
* ation:在什么条件下启动任务
* wait:等待切换至此任务所在的级别时执行一次
* respawn:此任务终止时就自动重新启动之
* initdefault:设定默认运行级别,此时process省略
* sysinit:设定系统初始化方式,此处一般指定/etc/rc.d/rc.sysinit脚本
* process:启动的任务- init的处理流程:init是通过自上而下的读取inittab文件依次执行的
* CentOS6在此设置默认的runlevel:id:5:initdefault:
- init是根据/etc/rc.d/rc.sysinit中的内容进行系统初始化,/etc/rc.d/rc.sysinit所做的事情:
(1) 设置主机名;
(2) 设置欢迎信息;
(3) 激活udev和selinux;
(4) 挂载/etc/fstab文件中定义的所有文件系统;
(5) 检测根文件系统,并以读写方式重新挂载根文件系统;
(6) 设置系统时钟;
(7) 根据/etc/sysctl.conf文件来设置内核参数;
(8) 激活lvm及软raid设备;
(9) 激活swap设备;
(10) 加载额外设备的驱动程序;
(11) 清理操作;
- init是根据/etc/rc.d/rc.sysinit中的内容进行系统初始化,/etc/rc.d/rc.sysinit所做的事情:
- init的处理流程:init是通过自上而下的读取inittab文件依次执行的
- 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务:
* 例如 /etc/rc.d/rc3/ 目录下的服务脚本所控制的服务:
* K:要停止的服务;K##,优先级数字越小,越是优先关闭;依赖的服务先关闭,而后关闭被依赖的服务
* S* :要启动的服务;S##*,优先级数字越小,越是优先启动,被依赖的服务先启用,而后启动依赖的服务
* rc脚本:接受一个运行级别数字为参数
脚本框架: for srv in /etc/rc.d/rc#.d/k*.d;do $srv stop done for srv in /etc/rc.d/rc#.d/s*.d;do $src start done
- 注意:正常级别下,最后启动的一个服务SS99local 没有连接至/etc/init.d下的某脚本,而是连接至/etc/rc.d/rc.local脚本;因此,不便或不需要写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。
- 设置启动终端,启动[ 图形 ] 终端;
tty1:2345:respawn:/usr/sbin/mingetty tty1
... ...
tty6:2345:respawn:/usr/sbin/mingetty tty6
(1)mingetty会调用login程序;
(2)打开虚拟终端的程序除了mingetty之外,还有诸如getty等;
tty7:5:respawn:/etc/X11 #启动图形终端
-
chkconfig 命令:管控/etc/init.d/目录下每个服务脚本在各级别下的启动或关闭状态
查看:chkconfig --list [name] 添加:chkconfig --add name 能被添加的服务的脚本定义格式之一: #!/bin/bash # # chkconfig: LLL NN NN # description: 删除:chkconfig --del name 修改指定的链接类型: chkconfig [--level LEVELS] name <on|off|reset> --level LEVELS:指定要控制的级别;默认为2345;
GRUB启动引导程序配置(Boot Loader)
grub:GRand Unified Bootloader
在系统启动流程中,BIOS读取相关信息之后,接下来就是去第一个可以启动的设备当中的MBR中读取Boot loader信息。
- grub 0.X:grub legacy
- grub 2.X:grub2
- grub legacy:
- stage1:mbr
- stage1_5:mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统
- stage2:磁盘分区(/boot/grub/)
配置文件:/boot/grub/grub.conf
stage2及内核等通常放置于一个基本磁盘分区 - 功用:
(1):提供菜单,并提供交互式接口
e:编辑模式;用于编辑菜单
c:命令模式;交互式接口
(2): 加载用户选择的内核或者操作系统;允许传递参数给内核;可隐藏此菜单。
(3):为菜单提供了保护机制;为编辑菜单进行认证;为启用内核或操作系统进行认证。
- 如何识别设备:(hd#,#)
- hd# : 磁盘编号,用数字表示,从0开始编号
-
:分区编号,用数字表示,从0开始编号
grub的命令接口
help:获取帮助列表
help KEYWORD:获取详细帮助信息
find (hd0,0)/PATH/TO/SOMEFILE
root (hd0,0) 设置谁为根
kernel /PATH/TO/RERNEL_FILE:内核路径;设置本次启动时用到的内核文件,额外还可以添加许多内核支持使用的cmdline参数;
例如: init=/path/to/init,selinux=0
initrd /PATH/TO/LNITRAMS_FILE:设定为选定的内核提供额外文件的ramdisk
boot:引导启动选定的内核
...
配置文件:/etc/grub/grub.conf
配置项:
default=#:设定默认启动的菜单项;菜单项(title)编号从0开始
timeout=#:指定菜单项等待选项选择的时长
spashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径
passwd [--md5] STRING: 菜单编辑认证
hiddenmenu: 隐藏菜单
title TITLE :定义菜单项“标题”,可以出现多次;
root (hd0,0):grub查找stage2及kernel文件所在设备分区;为grub的根
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS] :启动内核
initrd /PATH/TO/IMTRAMFS_FILE :内核匹配的ramfs文件
passwd [--md5] STRING:启动选定内核或操作系统时进行认证
grub-md5-crypt #密码串生成工具
[root@localhost ~]# grub-md5-crypt
Password:
Retype password:
\$1$XJZYv/$NB0d91w7u2UIhXa0434I8.
grup出现问题无法启动系统后如何修复
- 本机grub安装(grub破坏后未重启)
<1> grub-install --root-directory=/ /dev/sda
<2>grub
grub>root (hd#,#)
grub>setup (hd#)
示例:
[root@localhost ~]# dd if=/dev/sda of=/boot/mbr.bak count=1 bs=512 #备份MBR
[root@localhost ~]# dd if=/dev/zero of=/dev/sda count=1 bs=200 #破坏MBR前200个bs,即把grub.conf破坏了
恢复方法1: [root@localhost ~]# grub
grub> root (hd0,0)
root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd0)"... 27 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> quit
quit
方法2: [root@localhost ~]# grub-install --root-directory=/ /dev/sda
Installation finished. No error reported.
This is the contents of the device map //boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
#this device map was generated by anaconda
(hd0) /dev/sda
- grub破坏后重启,需要紧急救援模式来修复,步骤如下:
<1> 用安装光盘启动,在安装界面选择Rescue installed system 进入紧急救援模式(或者,在此界面按ESC键,在boot: 之后输入linux rescue 进入)
<2>然后根据提示选择语言和键盘格式
<3>选择是否配置网卡
<4>提示硬盘上的系统已经被找到并挂载在/mnt/sysimage 下,continue用读写模式加载
<5>输入chroot /mnt/sysimage
切换磁盘根目录
<6>运行grub-install --root-directory=/ /dev/sda
修复grub
注意:此处演示为centos6系统,如果centos7系统需要使用grub2-install --root-directory=/ /dev/sda
实现kickstart文件制作与光盘镜像制作
在我们CentOS系统安装完成后 会在/root 目录下生成一个anaconda-ks.cfg文件,此文件就是kickstart,我们可以以此文件为模板来定制自己的kickstart文件。
可以使用 ks指明kickstart文件的位置
如:ks=cdrom:/PATH/TO/KICKSTART_FILE
kickstart文件的格式
-
命令段:指定各种安装前配置选项,如键盘类型等;分为:
- 必备命令
- 可选命令
-
程序包段:指明要安装的程序包,以及包组,也包括不安装的程序包;
%package #指明程序包段开始 @group_name #安装一个包组 package # 安装单个程序包 -package #明确指明不安装的 %end #程序包段结束
-
脚本段:
- %pre:安装前脚本
运行环境:运行安装介质上的卫星Linux系统环境; - %post:安装后脚本
运行环境:安装完成的系统;
- %pre:安装前脚本
命令段中的必备命令:
- authconfig:认证方式的配置;
authconfig --enableshadow --passalgo=sha512
- bootLoader:定义bootloader的安装位置及相关配置;
bootloader --location=mbr --driveorder=sda --append="nomodeset crashkernel=auto rhgb quiet"
- keyboard:设置键盘类型;
keyboard us
- lang:设置语言类型;
lang en_US.UTF-8
- part: 分区布局;
part /boot --fstype=ext4 --size=500 part pv.008002 --grow --size=1
- rootpw:管理员密码;
rootpw --iscrypted $6$UQONRau1iY1OvJbk$NB0k1D1LpHCbV6ioFOyq3LAH/L6tSF79upN.zg48ZV8y5NzBzOoXNlqaRZEIkPn.tDdPFnuxrAnS/e3UX
- timezone:指定时区;
timezone --utc Etc/UTC
- 补充:分区相关的其他指令
- clearpart:清楚分区;
clearpart --linux --drives=sda
- volgroup:创建卷组;
volgroup VolGroup --pesize=4096 pv.008002
- logvol:创建逻辑卷;
logvol /home --fstype=ext4 --name=lv_home --vgname=VolGroup --grow --size=100
- clearpart:清楚分区;
命令段中的可选命令:
- install OR upgrade:安装或升级
- text:安装界面类型,text为tui,默认为gui
- network:配置网络接口;
network --onboot yes --device eth0 --bootproto dhcp --noipv6
- firewall:防火墙;
firewall --disabled
- selinux:SELinux;
selinux --disabled
- halt、poweroff或reboot:安装完成之后的行为;
- repo:指明安装时使用的repository;
repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100
- url:指明安装时使用的repository;为url格式。
定制kickstart文件
yum install system-config-kickstart
system-config-kickstart
检查语法错误:
# ksvalidator
......
示例:
[root@localhost ~]# yum install system-config-kickstart #安装system-config-kickstart
[root@localhost ~]# system-config-kickstart #运行kickstart之后打开一个kickstart configurator的配置界面
在此图形界面中即可配置kickstart
创建光盘镜像
[root@localhost ~]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6 x86_64 boot" -c isolinux/boot.cat -b isolinux/isolinux.bin -o /root/boot.iso myboot/
网友评论