Linux学习博客7

简述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机制为基础:

Linux学习博客7_第1张图片
CentOS_boot.png

  1. BIOS
    BIOS(Basic Input/Output System),基本输入输出系统,该系统存储于主板的ROM芯片上,计算机在开机时,会最先读取该系统,然后会有一个加电自检过程,这个过程其实就是检查CPU和内存,计算机最基本的组成单元(控制器、运算器和存储器),还会检查其他硬件,若没有异常就开始加载BIOS程序到内存当中。BIOS主要的一个功能就是存储了磁盘的启动顺序,BIOS会按照启动顺序去查找第一个磁盘头的MBR信息,并加载和执行MBR中的Bootloader程序,若第一个磁盘不存在MBR,则会继续查找第二个磁盘(PS:启动顺序可以在BIOS的界面中进行设置),一旦BootLoader程序被检测并加载内存中,BIOS就将控制权交接给了BootLoader程序。

  2. MBR
    MBR(Master Boot Record),主引导记录,MBR存储于磁盘的头部,大小为512bytes,其中,446bytes用于存储BootLoader程序,64bytes用于存储分区表信息,最后2bytes(魔术字)用于MBR的有效性检查。

  3. 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所在磁盘的文件系统。
  1. 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程序。
  1. 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)。
  1. 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 命令行用法

  1. 进入GRUB的命令行模式
    开机后grub引导菜单
    Linux学习博客7_第2张图片
    grub1.png
  • 输入c即可进入grub命令行模式
grub>
  • 输入e可对进入选定的菜单项的编辑
    Linux学习博客7_第3张图片
    grub2.png
  1. 获取GRUB命令行帮助
    在grub>提示符的后面输入help
grub> help


如果需要得到某个指令的帮助,就在 help 后加空格跟指令,比如:
grub>help kernel
  1. 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文件信息
  1. root (hd[0-n,y) 指令来指定/boot所在的分区
比如我们确认/boot在(hd0,0)
grub> root (hd0,0)
  1. 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]
  1. 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
  1. boot命令来引导系统
grub>boot
  1. grub的保护机制
    grub可以通过设置密码来保护配置文件不被轻易的修改,方法为:
  • 在配置文件的title之上添加 password --md5 md5生成的密码 (用于启动时保护配置文件编辑)
  • 在配置文件的某个title之内添加password --md5 md5生成的密码 (用于保护此项内核不被轻易启动 或编辑)
  • 生成md5密码的命令:grub-md5-crypt
  1. grub-install重建grub
重建grub到第一硬盘mbr
grub-install /dev/sda
  1. 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文件主要由三个部分组成:

  1. 命令段:用于配置系统
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"
  1. 软件包段:选择要安装的软件包组及软件包
@core    #安装
@base    #安装
lftp    #安装
-zsh    #这里说明不安装,但如果有其他安装的文件需要依赖其时,也会安装
  1. 脚本段:安装前后执行的脚本
%pre    #安装过程开始之前执行的脚本;所能够执行的操作较少,因为是anaconda加载的简洁版的shell环境
%post    #所有软件包安装完成之后执行的脚本;由于是此时系统已安装完成,所以是完整的shell环境

利用ks文件安装系统

在boot提示符指定本机的网络参数和kickstart配置文件,配置文件中又设定了安装源(一般自建http、ftp服务器和yum源),执行下面的命令后,系统会自动结合kickstart文件,实现快速安装系统

  1. 利用光盘引导后,在CentOS安装界面按ESC键进入boot提示符
    Linux学习博客7_第4张图片
    kickstart1.png

在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
  1. 指定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文件制作

  1. 利用图形化工具system-config-kickstart制作ks文件
运行system-config-kickstart
~]# system-config-kickstart
Linux学习博客7_第5张图片
ks1.jpg
Linux学习博客7_第6张图片
ks2.jpg
Linux学习博客7_第7张图片
ks3.jpg
Linux学习博客7_第8张图片
ks4.jpg
Linux学习博客7_第9张图片
ks5.jpg
Linux学习博客7_第10张图片
ks6.jpg
Linux学习博客7_第11张图片
ks7.jpg
Linux学习博客7_第12张图片
ks8.jpg
Linux学习博客7_第13张图片
ks9.jpg
Linux学习博客7_第14张图片
ks10.jpg
  1. 制作包含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
光盘映像制作完成

你可能感兴趣的:(Linux学习博客7)