美文网首页
Linux学习博客7

Linux学习博客7

作者: sky_c146 | 来源:发表于2018-01-21 21:39 被阅读0次

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

    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引导菜单
      grub1.png
    • 输入c即可进入grub命令行模式
    grub>
    
    • 输入e可对进入选定的菜单项的编辑
      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提示符
      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
    
    ks1.jpg ks2.jpg ks3.jpg ks4.jpg ks5.jpg ks6.jpg ks7.jpg ks8.jpg ks9.jpg 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

          本文链接:https://www.haomeiwen.com/subject/dogqaxtx.html