简述linux操作系统启动流程
以CentOS 5、6为例
系统启动流程大体可以表示为POST加电自检-->BIOS根据其中的启动顺序-->MBR设备的bootloader(GRUB)-->启动Kernel(中间可能需要借助ramdisk加载根文件系统并进行rootfs转换)-->Init-->Runlevel关闭和启动对应的服务进程。
上述过程从Init开始就是用户空间的启动操作了,CentOS 5、6、7的Init启动机制有所不同,所以Init的启动过程会有所区别:
CentOS 5:systemV
CentOS 6:Upstart
CentOS 7:systemd
下面的过程以systemV的Init机制为基础:
BIOS
BIOS(Basic Input/Output System),基本输入输出系统,该系统存储于主板的ROM芯片上,计算机在开机时,会最先读取该系统,然后会有一个加电自检过程,这个过程其实就是检查CPU和内存,计算机最基本的组成单元(控制器、运算器和存储器),还会检查其他硬件,若没有异常就开始加载BIOS程序到内存当中。BIOS主要的一个功能就是存储了磁盘的启动顺序,BIOS会按照启动顺序去查找第一个磁盘头的MBR信息,并加载和执行MBR中的Bootloader程序,若第一个磁盘不存在MBR,则会继续查找第二个磁盘(PS:启动顺序可以在BIOS的界面中进行设置),一旦BootLoader程序被检测并加载内存中,BIOS就将控制权交接给了BootLoader程序。MBR
MBR(Master Boot Record),主引导记录,MBR存储于磁盘的头部,大小为512bytes,其中,446bytes用于存储BootLoader程序,64bytes用于存储分区表信息,最后2bytes(魔术字)用于MBR的有效性检查。GRUB
Grand Unified Bootloader,多系统启动程序,其执行过程可分为三个步骤:
- Stage1:这个其实就是MBR中的启动引导程序,由于只有446字节不能实现复杂的功能,它的主要工作就是查找并加载第二段Bootloader程序(stage2),但系统在没启动时,MBR根本找不到文件系统,也就找不到stage2所存放的位置,因此,就有了stage1_5
- Stage1_5:安装在MBR之后的磁盘扇区,该步骤就是为了识别文件系统,进而可以进入stage2
- Stage2:GRUB程序会根据/boot/grub/grub.conf文件查找Kernel的信息,然后开始加载Kernel程序,当Kernel程序被检测并在加载到内存中,GRUB就将控制权交接给了Kernel程序。
PS:实际上这个步骤/boot还没被挂载,GRUB直接识别grub所在磁盘的文件系统。
- Kernel
内核,Kernel是Linux系统最主要的程序,实际上,Kernel的文件很小,只保留了最基本的模块,并以压缩的文件形式存储在硬盘中,当GRUB将Kernel读进内存,内存开始解压缩内核文件。
- 讲内核启动,应该先讲下initrd这个文件:
initrd(Initial RAM Disk),它在stage2这个步骤就被拷贝到了内存中,这个文件是在安装系统时产生的,是一个临时的根文件系统(rootfs)。因为Kernel为了精简,只保留了最基本的模块,因此,Kernel上并没有各种硬件的驱动程序,也就无法识rootfs所在的设备,故产生了initrd这个文件,该文件装载了必要的驱动模块,当Kernel启动时,可以从initrd文件中装载驱动模块,直到挂载真正的rootfs,然后将initrd从内存中移除。 - Kernel会以只读方式挂载根文件系统,当根文件系统被挂载后,开始装载第一个进程(用户空间的进程),执行/sbin/init,之后就将控制权交接给了init程序。
- Init
该程序就是进行OS初始化操作,实际上是根据/etc/inittab(定义了系统默认运行级别)设定的动作进行脚本的执行,第一个被执行的脚本为/etc/rc.d/rc.sysinit,这个是真正的OS初始化脚本,这个脚本的任务有:
- 激活udev和selinux;
- 根据/etc/sysctl.conf文件,来设定内核参数;
- 设定系统时钟;
- 装载硬盘映射;
- 启用交换分区;
- 设置主机名;
- 根文件系统检测,并以读写方式重新挂载根文件系统;
- 激活RAID和LVM设备;
- 启用磁盘配额;
- 根据/etc/fstab,检查并挂载其他文件系统;
- 清理过期的锁和PID文件
上述都执行完后,根据配置的启动级别,执行对应目录底下的脚本,最后执行/etc/rc.d/rc.local这个脚本(所以很多自定义的启动脚本可以写入这个文件中),至此,系统启动完成。
关于init程序的配置文件路径,除了/etc/inittab外,还有/etc/init/*.conf,及/usr/lib/systemd/system/(CentOS7)。
- Runlevel
运行级别,不同的级别会启动的服务不一样,init会根据定义的级别去执行相应目录下的脚本,Linux的启动级别分为以下几种
0:关机模式
1:单一用户模式(直接以管理员身份进入)
2:多用户模式(无网络)
3:多用户模式(命令行)
4:保留
5:多用户模式(图形界面)
6:重启
在不同的运行级别下,/etc/rc.d/rc这个脚本会分别执行不同目录下的脚本
Run level 0 – /etc/rc.d/rc0.d/
Run level 1 – /etc/rc.d/rc1.d/
Run level 2 – /etc/rc.d/rc2.d/
Run level 3 – /etc/rc.d/rc3.d/
Run level 4 – /etc/rc.d/rc4.d/
Run level 5 – /etc/rc.d/rc5.d/
Run level 6 – /etc/rc.d/rc6.d/
这些目录下的脚本只有K*和S*开头的文件,K开头的文件为开机需要执行关闭的服务,S开头的文件为开机需要执行开启的服务。
简述grub启动引导程序配置及命令行接口详解
grub启动引导程序配置
grub的配置文件/boot/grub/grub.conf,该配置文件的信息如下:
grub.conf:
#boot=/dev/sda
default=0 #设定默认启动的title的编号,从0开始
timeout=5 #等待用户选择的超时时间
splashimage=(hd0,0)/boot/grub/splash.xpm.gz #GRUB的背景图片
hiddenmenu #隐藏菜单
title CentOS (2.6.18-194.el5PAE) #内核标题
root (hd0,0) #内核所在的设备hd表示硬盘,第一个0是硬盘号,第二个0是分区号
kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/ #内核文件路径以及传递给内核的参数
initrd /initrd-2.6.18-194.el5PAE.img #ramdisk文件路径
grub 命令行用法
- 进入GRUB的命令行模式
开机后grub引导菜单
- 输入c即可进入grub命令行模式
grub>
- 输入e可对进入选定的菜单项的编辑
- 获取GRUB命令行帮助
在grub>提示符的后面输入help
grub> help
如果需要得到某个指令的帮助,就在 help 后加空格跟指令,比如:
grub>help kernel
- cat查看文件内容
有时我们不知道Linux的/boot分区,以及/ 根分区所在的位置,要查看/etc/fstab的内容来得知,这时,我们就要用到cat (hd[0-n],y)/etc/fstab 来获得这些内容,注意要灵活使用tab键命令补齐的功能
grub> cat (hd0, #输入hd0,然后再按tab键会跳出hd0有的分区
grub> cat (hd0,2)/etc/fstab #显示所在分区的/etc/fstab文件信息
- root (hd[0-n,y) 指令来指定/boot所在的分区
比如我们确认/boot在(hd0,0)
grub> root (hd0,0)
- kernel 指令,用来指定Linux的内核,及/所在的分区
- 如果我们已经通过root (hd[0-n],y) 指定了/boot所在的分区,语法有两个:
-
- 如果/boot和Linux的/位于同一个分区,应该是下面的一种格式;
grub> kernel /boot/vmlinuz在这里按tab键来补齐,就看到内核全称了 ro root=根所在的路径
-
- 如果/boot有自己独立的分区,应该是;
grub> kernel /vmlinuz在这里按tab键来补齐,就看到内核全称了 ro root=根所在的路径
例如
grub> kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=[fstab文件中查询到的root所在的挂载UUID]
- initrd 命令行来指定initrd文件
grub> initrd /boot/initr #在这里tab来补齐有可能是initrd,也可能是initramfs
grub> initrd /boot/initrmfs-2.6.32-696.el6.x86_64.img
如果/boot是独立的一个分区
grub> initrd /initr #在这里tab来补齐
grub> initrd /initrmfs-2.6.32-696.el6.x86_64.img
- boot命令来引导系统
grub>boot
- grub的保护机制
grub可以通过设置密码来保护配置文件不被轻易的修改,方法为:
- 在配置文件的title之上添加 password --md5 md5生成的密码 (用于启动时保护配置文件编辑)
- 在配置文件的某个title之内添加password --md5 md5生成的密码 (用于保护此项内核不被轻易启动 或编辑)
- 生成md5密码的命令:grub-md5-crypt
- grub-install重建grub
重建grub到第一硬盘mbr
grub-install /dev/sda
- grub救援模式
如果系统无法启动,利用CentOS安装光盘进入Rescue installed system救援模式
进入命令行后,使用命令
#chroot /mnt/sysimage #挂载原系统的根,此路径在进入救援模式后有提示
挂载根后即可进行各种命令行操作了,例如重装grub
#grub-install /dev/sda
实现kickstart文件制作与光盘镜像制作
关于kickstart
kickstart是一个定义了Linux安装过程的配置文件,比如系统语言、键盘选项、要在系统中使用的时区、如何对磁盘进行分区、应该安装哪些软件包等。有了这个文件可以解放双手,让Linux安装过程按照我们预先定义的要求进行自动化安装,同时部署大量主机时十分有用。一般centos系统安装后,会在root目录下生成一个名为anaconda-ks.cfg的kickstart配置文件
ks文件主要由三个部分组成:
- 命令段:用于配置系统
install #出现install可代表下面为安装配置命令段
cdrom #安装介质
lang zh_CN.UTF-8 #安装语言
keyboard us #键盘类型
selinux --enforcing #是否开启selinux
timezone --utc Asia/Shanghai #时区、系统时钟是否使用UTC时间
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
- 软件包段:选择要安装的软件包组及软件包
@core #安装
@base #安装
lftp #安装
-zsh #这里说明不安装,但如果有其他安装的文件需要依赖其时,也会安装
- 脚本段:安装前后执行的脚本
%pre #安装过程开始之前执行的脚本;所能够执行的操作较少,因为是anaconda加载的简洁版的shell环境
%post #所有软件包安装完成之后执行的脚本;由于是此时系统已安装完成,所以是完整的shell环境
利用ks文件安装系统
在boot提示符指定本机的网络参数和kickstart配置文件,配置文件中又设定了安装源(一般自建http、ftp服务器和yum源),执行下面的命令后,系统会自动结合kickstart文件,实现快速安装系统
- 利用光盘引导后,在CentOS安装界面按ESC键进入boot提示符
在boot提示符后键入安装命令
例如指定了网络配置、ks文件路径
boot:linux ip=192.168.1.106 netmask=255.255.255.0 gateway=192.168.1.1 dns=192.168.1.1 ks=http://10.1.1.100/centos6-x86_64.cfg
- 指定kickstart配置文件的路径
支持以下格式:
CD ks=cdrom:/directory/ks.cfg
硬盘驱动器 ks=hd:device/directory/ks.cfg
FTP服务器 ks=ftp://server.mydomain.com/directory/ks.cfg
HTTP服务器 ks=http://server.mydomain.com/directory/ks.cfg
HTTPS服务器 ks=https://server.mydomain.com/directory/ks.cfg
NFS服务器 ks=nfs:server.mydomain.com:/directory/ks.cfg
其它设备 ks=file:/device/directory/ks.cfg
kickstart文件制作
- 利用图形化工具system-config-kickstart制作ks文件
运行system-config-kickstart
~]# system-config-kickstart
- 制作包含ks文件的光盘映像
将制作好的ks文件和安装光盘中的isolinux文件夹都复制到一个文件夹下例如/tmp/mykickstart下
]# ls
isolinux ks.cfg
编辑/isolinux/isolinux.cfg文件
]# vim /isolinux/isonux.cfg
在文件中添加新的label并设置成默认选项,将原来的默认default行删除
label linux
menu label ^Install CentOS based mykickstart
menu default
kernel vmlinuz
append initrd=initrd.img ks=cdrom:/ks.cfg
#此处指定了ks文件所在的路径
在ks.cfg和isolinux文件夹共同的父目录的父目录即/tmp下执行
]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6.9 by mykickstart" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /tmp/centos6.9_by_ks.iso mykickstart
]# ls
mykickstart centos6.9_by_ks.iso
光盘映像制作完成