美文网首页
系统启动和内核管理.

系统启动和内核管理.

作者: 毛利卷卷发 | 来源:发表于2018-06-24 21:48 被阅读0次

    cenos6启动流程

    CentOS6启动流程.jpg
    1. 加载BIOS的硬件信息,获取第一个启动设备
    2. 读取第一个启动设备MBR的引导加载程序(grub)的启动信息
    3. 加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
    4. 核心执行init程序,并获取默认的运行信息
    5. init程序执行/etc/rc.d/rc.sysinit文件
    6. 启动核心的外挂模块
    7. init执行运行的各个批处理文件(scripts)
    8. init执行/etc/rc.d/rc.local
    9. 执行/bin/login程序,等待用户登录
    10. 登录之后开始以Shell控制主机

    POST

    Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测

    ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等

    RAM:CMOS互补金属氧化物半导体,保存各项参数的设定

    按次序查找引导设备,第一个有引导程序的设备为本次启动设备

    Boot Sequence

    选择要启动的硬件设备,选择了之后就可以读取这个设备上位于MBR里头的bootloader了。这一步的实现是这样的:根据BIOS中对启动顺序的设定,BIOS自己会依次扫描各个引导设备,然后第一个被扫描到具有引导程序(bootloader)的设备就被作为要启动的引导设备

    GRUB

    POST --> Boot Sequence(BIOS) --> Boot Loader --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 --> 系统初始化脚本rc.sysinit --> 关闭或启动对应级别的服务 --> 启动终端

    1. 提供菜单
    2. 启动内核
    3. 转交给别的loader(linux)

    stage1:mbr
    stage1_5:mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统
    stage2:磁盘分区(/boot/grub/)

    安装grub

    1. grub-install

      安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到 /boot/grub目录下

    2. grub

      grub> root (hd#,#)

      grub> setup (hd#)

      交互式,指定根,安装grub到磁盘,根据/boot/grub/下的grub文件进行修复,如无此类文件,还是要通过grub-install进行修复

    /boot/grub/grub.conf <-- /etc/grub.conf

    [root@centos6 grub]# cat grub.conf 
    # grub.conf generated by anaconda
    #
    # Note that you do not have to rerun grub after making changes to this file
    # NOTICE:  You have a /boot partition.  This means that
    #          all kernel and initrd paths are relative to /boot/, eg.
    #          root (hd0,0)
    #          kernel /vmlinuz-version ro root=/dev/sda2
    #          initrd /initrd-[generic-]version.img
    #boot=/dev/sda
    default=0
    timeout=5
    splashimage=(hd0,0)/grub/splash.xpm.gz
    hiddenmenu
    title CentOS 6 (2.6.32-696.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=7e51be47-2999-407e-8e20-1c48096a3a8c rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-696.el6.x86_64.img
    

    default=#:设定默认启动的菜单项;落单项(title)编号从0开始
    timeout=#:指定菜单项等待选项选择的时长
    splashimage=(hd#,#)/PATH/XPM_FILE:菜单背景图片文件路径
    password [--md5] STRING:启动菜单编辑认证
    hiddenmenu:隐藏菜单
    title TITLE:定义菜单项“标题”, 可出现多次
    root (hd#,#):查找stage2及kernel文件所在设备分区;为grub的根
    kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
    initrd /PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件
    password [--md5|--encrypted ] STRING:启动选定的内核或操作系统时进行认证

    grub加密

    grub-md5-crypt:md5加密

    grub-crypt:sha512加密

    default=0
    timeout=5
    password magedu 解锁grub编辑时,需要密码
    password --md5 xxxxxx 使用grub-md5-crypt生成
    password --encrpted xxxxx 使用grub-crypt
    title redhat 6
    root (hd0,0)
    kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=bfd90cd4-8516-4a60-8f1a-f7c3511a6b3f rhgb quiet selinux=0
    initrd /initramfs-2.6.32-696.el6.x86_64.img
    password magedu #这里的作用,进入内核时就会要求验证密码

    kernel

    自身初始化:

    1. 探测可识别到的所有硬件设备
    2. 加载硬件驱动程序(借助于ramdisk加载驱动)
    3. 以只读方式挂载根文件系统
    4. 运行用户空间的第一个应用程序:/sbin/init

    ramdisk

    ramdisk是用于实现系统初始化的、基于内存的磁盘设备,即加载至内存(的某一段空间)后把内存当磁盘使用,并在内存中作为临时根文件系统提供给内核使用,帮助内核挂载真正的根文件系统。而之所以能够帮助内核挂载根文件系统是因为在ramdisk这个临时文件系统的/lib/modules目录下有真正的根文件系统所在设备的驱动程序;除此之外,这个临时文件系统也遵循FHS,例如有这些固定目录结构:/bin, /sbin, /lib, /lib64, /etc, /mnt, /media, …

    ramdisk文件的制作:

    1. mkinitrd /boot/initramfs-(uname -r).img(uname -r)
    2. dracut /boot/initramfs-(uname -r).img(uname -r)

    init初始化

    /sbin/init --> (/etc/inittab) --> 设置默认运行级别 --> 运行系统初始脚本、完成系统初始化 --> (关闭对应下需要关闭的服务)启动需要启动服务 --> 设置登录终端

    1. 读取其初始化文件/etc/inittab
    2. 初始运行级别(RUN LEVEL)
    3. 系统初始化脚本
    4. 对应运行级别的脚本目录
    5. 捕获某个关键字顺序
    6. 定义UPS电源终端/恢复脚本
    7. 在虚拟控制台生成getty
    8. 在运行级别5初始化X

    /etc/inittab

    运行级别:为系统运行或维护等目的而设定

    0:关机
    1:单用户模式(root自动登录), single, 维护模式
    2:多用户模式,启动网络功能,但不会启动NFS;维护模式
    3:多用户模式,正常模式;文本界面
    4:预留级别;可同3级别
    5:多用户模式,正常模式;图形界面
    6:重启

    默认级别: 3, 5

    切换级别:init #

    查看级别:runlevel ; who -r

    CentOS5的/etc/inittab

    每一行定义一种action以及与之对应的process

    d:runlevel:action:process

    action:

    wait:切换至此级别运行一次
    respawn:此process终止,就重新启动之
    initdefault:设定默认运行级别;process省略
    sysinit:设定系统初始化方式,此处一般为指定
    /etc/rc.d/rc.sysinit
    ca::ctrlaltdel:/sbin/shutdown -t3 -r now

    id:3:initdefault:
    si::sysinit:/etc/rc.d/rc.sysinit
    l0:0:wait:/etc/rc.d/rc 0
    l1:1:wait:/etc/rc.d/rc 1...
    l6:6:wait:/etc/rc.d/rc 6

    CentOS6的/etc/inittab

    设置系统默认的运行级别

    /etc/rc.d/rc.sysinit

    系统初始化脚本

    1. 设置主机名
    2. 设置欢迎信息
    3. 激活udev和selinux
    4. 挂载/etc/fstab文件中定义的文件系统
    5. 检测根文件系统,并以读写方式重新挂载根文件系统
    6. 设置系统时钟
    7. 激活swap设备
    8. 根据/etc/sysctl.conf文件设置内核参数
    9. 激活lvm及software raid设备
    10. 加载额外设备的驱动程序
    11. 清理操作

    /etc/rc.d/rcN.d/

    关闭或启动这个运行级别下的服务,(注意:关闭在前,启动在后)

    [root@centos6 ~]# ls /etc/rc.d/rc3.d/
    K01smartd          K69rpcsvcgssd      K95firstboot     S13irqbalance        S26udev-post
    K02oddjobd         K73winbind         K99rngd          S13rpcbind           S28autofs
    K05wdaemon         K74ntpd            S01sysstat       S15mdmonitor         S50bluetooth
    K10psacct          K75ntpdate         S02lvm2-monitor  S22messagebus        S55sshd
    K10saslauthd       K75quota_nld       S05rdma          S23NetworkManager    S80postfix
    K15htcacheclean    K76ypbind          S08ip6tables     S24nfslock           S82abrtd
    K15httpd           K84wpa_supplicant  S08iptables      S24rpcgssd           S83abrt-ccpp
    K30spice-vdagentd  K87restorecond     S10network       S25blk-availability  S90crond
    K50dnsmasq         K88sssd            S11auditd        S25cups              S95atd
    K50kdump           K89netconsole      S11portreserve   S25netfs             S99certmonger
    K60nfs             K89rdisc           S12rsyslog       S26acpid             S99local
    K61nfs-rdma        K92pppoe-server    S13cpuspeed      S26haldaemon
    

    K表示关闭,S表示开启,##表示运行次序,数字越小,越先运行,数字越小的服务,通常为被依赖到的服务

    注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本

    不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中

    管理服务

    chkconfig
    • --list [name]:查看服务在所有级别的启动或关闭设定情形
    • --add name:添加服务
    • --del name:删除服务
    • [--level levels] name <on|off|reset>:指定要设置的级别;省略时表示2345
    自定义服务
    [root@centos6 grub]# ls /etc/init.d/
    abrt-ccpp         crond         irqbalance      nfs           rdisc        single
    abrtd             cups          kdump           nfslock       rdma         smartd
    abrt-oops         dnsmasq       killall         nfs-rdma      restorecond  spice-vdagentd
    acpid             firstboot     lvm2-lvmetad    ntpd          rngd         sshd
    atd               functions     lvm2-monitor    ntpdate       rpcbind      sssd
    auditd            haldaemon     mdmonitor       oddjobd       rpcgssd      sysstat
    autofs            halt          messagebus      portreserve   rpcidmapd    udev-post
    blk-availability  htcacheclean  netconsole      postfix       rpcsvcgssd   wdaemon
    bluetooth         httpd         netfs           pppoe-server  rsyslog      winbind
    certmonger        ip6tables     network         psacct        sandbox      wpa_supplicant
    cpuspeed          iptables      NetworkManager  quota_nld     saslauthd    ypbind
    

    可以直接使用/etc/init.d/SOMESERCICE来启动、关闭、重启和查看指定的服务,当然也可以使用service命令来管理服务

    xinetd

    瞬态服务被xinetd进程所管理,当被管理的服务被请求时,唤醒服务,无请求时自动交给xinetd管理

    常见故障

    1. 故障原因:未使用grub-install安装过grub相关文件,删除/boot/grub/中除grub.conf以外的所有文件

      故障现象:启动不受影响

    2. 故障原因:使用grub-install安装过grub相关文件,删除/boot/grub/中除grub.conf以外的所有文件

      故障现象:菜单进不去,直接提示ERROR 15

      解决办法:

      1. 进入rescue
      2. chroot /mnt/sysimage
      3. grub-install /dev/sda
      4. sync;exit
      5. reboot
    3. 故障原因:破坏硬盘的前446字节,即破坏grub的stage1阶段,dd if=/dev/zero of=/dev/sda bs=1 count=446

      故障现象:菜单进不去,直接提示ERROR 15

      解决办法:见2

    4. 故障原因:破坏stage1.5,dd if=/dev/zero of=/dev/sda bs=1 count=10240 seek=512

      故障现象:菜单进不去,光标一直闪烁

      解决办法:见2

    5. 故障原因:删除/boot/grub/grub.conf

      故障现象:不进菜单,直接进入grub命令行

      解决办法:见2,或者直接在grub命令行操作

      1. root (hd0,0)

      2. kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/sda2 rhgb quiet selinux=0

      3. initrd /initramfs-2.6.32-696.el6.x86_64.img

      4. boot

        注意:第一步先按照顺序挂载上,然后第二部使用tab补全,看文件就可以判断出是不是boot目录

    6. 故障原因:删除/boot/grub/下的所有文件

      故障现象:菜单进不去,直接提示ERROR 15

      解决办法:

      1. 进入rescue

      2. chroot /mnt/sysimage

      3. grub-install /dev/sda

      4. vim /boot/grub/grub.conf

        default=0
        timeout=5
        title redhat
        root (hd0,0)
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=bfd90cd4-8516-4a60-8f1a-f7c3511a6b3f rhgb quiet
        initrd /initramfs-2.6.32-696.el6.x86_64.img

      5. exit;reboot

    7. 故障原因:删除整个/boot

      故障现象:不进入菜单,直接希纳是ERROR 15

      解决办法:

      1. 进入rescue

      2. chroot /mnt/sysimage

      3. grub-install /dev/sda

      4. mount /dev/cdrom /media

      5. cp /media/isolinux/vmlinuz /boot/vmlinuz-$(uname -r)

      6. mkinitrd /boot/initramfs-(uname -r).img(uname -r)

      7. vim /boot/grub/grub.conf

        default=0
        timeout=5
        title redhat
        root (hd0,0)
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=bfd90cd4-8516-4a60-8f1a-f7c3511a6b3f rhgb quiet
        initrd /initramfs-2.6.32-696.el6.x86_64.img

      8. exit;reboot

    8. 故障原因:删除/etc/fstab,删除/etc/init/rcS.conf,删除/etc/rc.d/rc.sysinit,删除/boot下的所有文件

      故障现象:不进入菜单,直接希纳是ERROR 15,并且进入救援模式无法找到根并进行自动挂载

      解决办法:

      1. 进入rescue

      2. 编写/etc/fstab

        UUID=b6d6d6ca-8f04-43a3-84a4-d34d2b2f50d1 /boot ext4 defaults 0 2
        UUID=bfd90cd4-8516-4a60-8f1a-f7c3511a6b3f / ext4 defaults 0 1
        UUID=50950a59-83cb-4688-80ec-d9883019fcce /app ext4 defaults 0 0
        UUID=5a1ff0b5-5c19-42e3-8b6a-65e7d332ee0c swap swap defaults 0 0

      3. 重新进入rescue

      4. chroot /mnt/sysimage

      5. grub-install /dev/sda

      6. 恢复内核文件及ramdisk

        cp /media/isolinux/vmlinuz /boot/vmlinuz-$(uname -r)

        mkinitrd /boot/initramfs-(uname -r).img(uname -r)

      7. vim /boot/grub/grub.conf

        default=0
        timeout=5
        title redhat
        root (hd0,0)
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=bfd90cd4-8516-4a60-8f1a-f7c3511a6b3f rhgb quiet
        initrd /initramfs-2.6.32-696.el6.x86_64.img

      8. rpm -qf /etc/init/rcS.conf /etc/rc.d/rc.sysinit

      9. mount /dev/cdrom /media

        cp /media/Packages/initscripts-9.03.58-1.el6.centos.x86_64.rpm /app

        rpm2cpio initscripts-9.03.58-1.el6.centos.x86_64.rpm |cpio -id

        cp etc/init/rcS.conf /etc/init

        cp etc/rc.d/rc.sysinit /etc/rc.d

      10. exit;reboot

    9. 故障原因:基于lvm,将/etc/fstab及/boot下的所有文件删除

      故障现象:不进入菜单,直接希纳是ERROR 15,并且进入救援模式无法找到根并进行自动挂载

      解决办法:

      1. 进入rescue
      2. lvscan;vgchange -ay
      3. 同上
    10. 故障原因:删除//etc/inittab

      故障现象:一直加载系统

      解决办法:有备份直接救援模式恢复即可,下面是无备份的解决办法

      1. 进入rescue

      2. chroot /mnt/sysimage

      3. rpm -qf /etc/inittab

      4. exit退出chroot模式

      5. mount /dev/sr0 /mnt/source

      6. rpm -ivh --replacepkgs | force /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm

        rpm2cpio /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm| cpio -idv ./etc/inittab;cp etc/inittab /mnt/sysimage/etc

      7. reboot

    自制Linux

    1. 分区并创建文件系统,至少分两个区,一个/boot,一个/

      fdisk /dev/sdb
      mkfs.ext4 /dev/sdb1;mkfs.ext4 /dev/sdb2
      
    2. 创建对应目录并挂载

      mkdir /mnt/sysimage;mount /dev/sdb2 /mnt/sysimage/
      mkdir /mnt/sysimage/boot;mount /dev/sdb1 /mnt/sysimage/boot/
      
    3. 安装grub

      grub-install --root-directory=/mnt/sysimage /dev/sdb
      
    4. 恢复内核和initramfs文件

      cp /boot/vmlinuz-2.6.32-696.el6.x86_64 /mnt/sysimage/boot/
      cp /boot/initramfs-2.6.32-696.el6.x86_64.img /mnt/sysimage/boot/
      
    5. 建立grub.conf

      default=0
      timeout=5
      title redhat
      root (hd0,0)
           kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/sda2 rhgb quiet selinux=0 init=/bin/bash
           initrd /initramfs-2.6.32-696.el6.x86_64.img
      
    6. 利用脚本复制bash和相关命令及相关库文件,如:ifconfig,insmod,ping,mount,ls,cat,df,lsblk,blkid等

      #!/bin/bash
      copy_cmd() {
              local cmd_destdir=$destdir$(dirname $(which $1))
              if [ ! -d $cmd_destdir ];then
                      mkdir -pv $cmd_destdir
              fi
              cp -v $(which $1) $cmd_destdir
      }
      
      copy_libfile() {
              ldd $(which $1) |grep -oE "/.* " | while read libfile
              do
                      local lib_destdir=$destdir$(dirname $libfile)
                      local lib_destfile=$destdir$libfile
                      if [ -e $lib_destfile ];then
                              continue
                      elif [ -d $lib_destdir ];then
                              cp -v $libfile $lib_destdir
                      else
                              mkdir -pv $lib_destdir
                              cp -v $libfile $lib_destdir
                      fi
              done
      }
      
      destdir=/mnt/sysimage
      
      if [ ! -d $destdir ];then
              mkdir $destdir
      fi
      while true;do
              echo -ne "\e[33mPlease input a execute command:\e[0m"
              read cmd
              if [ "$cmd" == quit ];then
                      exit
              fi
              which $cmd &> /dev/null || { echo $cmd not exist;continue; }
              copy_cmd $cmd
              copy_libfile $cmd
      done
      
    7. 拷贝网卡模块文件

      cp /lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysimage/lib64/
      
    8. 创建根下其他目录

      mkdir /mnt/sysimage/{etc,dev,proc,sys,home,var,mnt,media,root,tmp,lib}
      
    9. chroot /mnt/sysimage;sync

    10. 启动后配置网卡

      insmod /lib64/e1000.ko
      ifconfig eth0 xxx.xxx.xxx.xxx/16
      

    内核

    uname

    显示系统信息,常用选项:

    • -n:显示节点名称
    • -r:显示VERSION-RELEASE
    • -a:显示所有信息

    lsmod

    显示由核心已经装载的内核模块,显示的内容来自于:/proc/modules文件

    modinfo

    显示模块的详细描述信息,常用选项:

    • -n:只显示模块文件路径
    • -p:显示模块参数
    • -a:author
    • -d:description
    • -l:license

    modprobe

    装载内核模块,-r选项卸载内核模块

    depmod

    内核模块依赖关系文件及系统信息映射文件的生成工具

    insmod

    装载指定模块文件,不自动解决依赖模块

    rmmod

    卸载模块

    编译内核

    1. 安装开发包组 yum groupinstall "Development Tools"
    2. 下载源码包,并解压到/usr/local/src下,tar xvf linux-4.17.3.tar.xz -C /usr/local/src
    3. 安装所需的其他rpm包,yum -y install ncurses-devel elfutils-libelf-devel openssl-devel
    4. 使用make menuconfig启动一个基于curses的文本窗口界面,可以用来配置内核参数,比如启用NTFS文件系统,会生成一个.config文件,一般情况下在安装完操作系统的时候,会在其/boot目录下生成一个config-VERSION-RELEASE的内核参数配置文件,可以复制过来作为初始化使用
    5. 使用make [-j 8]来编译,-j选项用来指定内核的数目
    6. 使用make modules_install来安装模块
    7. 使用make install安装内核相关的文件,然后重启即可

    清理编译文件

    make clean:清理大多数编译生成的文件,但会保留config文件等

    make mrproper:清理所有编译生成的文件、config及某些备份文件

    make distclean:mrproper、patches以及编译器备份文件

    卸载内核

    1. 删除/lib/modules/目录下不需要的内核库文件
    2. 删除/usr/src/linux/目录下不需要的内核源码
    3. 删除/boot目录下启动的内核和内核映像文件
    4. 更改grub的配置文件,删除不需要的内核启动列表

    centos7启动流程

    内核启动流程

    1. POST,加电自检
    2. 根据 boot sequence加载启动的硬盘
    3. 加载磁盘的第0个扇区第0个磁道(前512个字节),读取boorloader,也就是前446个字节,执行grub的第一个阶段,然后执行grub的1.5阶段,加载/boot目录所在分区的驱动,读取/boot/grub下的内容,执行grub的第二个阶段,将内核和ramdisk读取到内存,借助ramdisk将真正的根挂载

    /sbin/init

    centos5:SysVinit启动流程的时候是串行的,即使服务之间没有依赖关系

    centos6:Upstart启动服务的时候,依赖的服务之间才是串行的,不依赖的服务之间是并行的

    centos7:Systemd启动服务的时候,所有的服务之前都是并行的,如果B服务依赖于A服务,那么B服务在启动的时候,A服务会主动发送一个信号欺骗B服务自己已经启动,B是能够正常启动的,虽然它们之间存在依赖关系,但是只有在真正的使用B服务的时候,才会用到A服务提供到的能力

    systemd

    系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其他进程

    特点:

    1. 系统引导时实现服务并行启动
    2. 按需启动守护进程
    3. 自动化的服务依赖关系管理
    4. 同时采用socket式与D-Bus总线式激活服务
    5. 系统状态快照

    unit

    unit表示不同类型的systemd对象,通过配置文件进行标识和配置,文件中主要包含了系统服务、监听的socket,保存的系统快照以及其他与init相关的信息

    配置文件

    /usr/lib/systemd/system:每个服务主要的启动脚本设置,类似于之前的/etc/init.d/

    /run/systemd/system:系统执行过程中所产生的服务脚本,比上面目录优先运行

    /etc/systemd/system:管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面的目录优先运行

    类型

    可以使用 systemctl -t help查看unit的类型

    Service unit: 文件扩展名为.service, 用于定义系统服务
    Target unit: 文件扩展名为.target,用于模拟实现运行级别
    Device unit: .device, 用于定义内核识别的设备
    Mount unit: .mount, 定义文件系统挂载点
    Socket unit: .socket, 用于标识进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动
    Snapshot unit: .snapshot, 管理系统快照
    Swap unit: .swap, 用于标识swap设备
    Automount unit: .automount,文件系统的自动挂载点
    Path unit: .path,用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务,如:spool目录

    systemctl

    在centos7中推荐使用systemctl来管理服务,当然依然兼容之前版本中的service来管理服务。用法:systemctl COMMAND SERVICENAME.service

    systemctl start name.service:启动服务

    systemctl stop name.service:停止服务

    systemctl restart name.service:重启服务

    systemctl status name.service:查看服务状态

    systemctl try-restart name.service:条件式重启,已启动才重启,否则不做操作

    systemctl reload name.service:重载

    systemctl mask name.service:禁止自动或手动启动服务

    systemctl unmask name.service:取消禁止

    systemctl enable name.service:开机启动服务

    systemctl disable name.service:开机不启动服务

    systemctl is-active name.service:查看某服务当前激活与否的状态

    systemctl list-units -t service:查看所有已经激活的服务

    systemctl list-units -t service -a:查看所有服务

    systemctl list-unit-files --type service:查看所有服务的开机自启状态

    systemctl is-enabled name.service:查看服务是否开启

    systemctl list-dependencies name.service:查看服务依赖关系

    systemctl kill unitname:杀死进程

    systemctl rescue:切换至紧急救援模式

    systemctl emergency:切换至emergency

    systemctl halt/poweroff:关机

    systemctl reboot:重启

    systemctl suspend:挂起

    systemctl hibernate:休眠

    systemctl hybrid-sleep:休眠并挂起

    服务状态

    loaded:unit配置文件已处理
    active(running):一次或多次持续处理的运行
    active(exited):成功完成一次性的配置
    active(waitinig):运行中,等待一个事件
    inactive:不运行
    enabled:开机启动
    disabled:开启不启动
    static:开机不启动,但是可以被另一个启动的服务激活

    service unit格式
    [root@centos7 ~]# cat /usr/lib/systemd/system/crond.service 
    [Unit]
    Description=Command Scheduler
    After=auditd.service systemd-user-sessions.service time-sync.target
    
    [Service]
    EnvironmentFile=/etc/sysconfig/crond
    ExecStart=/usr/sbin/crond -n $CRONDARGS
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    
    [Install]
    WantedBy=multi-user.target
    
    unit

    定义与Unit类型无关的通用选项,用于提供unit的描述信息、unit行为以及依赖关系

    Description:描述信息
    After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反
    Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活
    Wants:依赖到的其它units,弱依赖
    Conflicts:定义units间的冲突关系

    Service

    与特定类型相关的专用选项

    Type:定义影响ExecStart及相关参数的功能的unit进程启动类型
    simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中
    forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会终止
    oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中
    dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作.因此通常也要同时设定BusNname= 才行
    notify:在启动完成后会发送一个通知消息。还需要配合 NotifyAccess 来让 Systemd 接收消息
    idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务
    EnvironmentFile:环境配置文件
    ExecStart:指明启动unit要运行命令或脚本的绝对路径
    ExecStartPre: ExecStart前运行
    ExecStartPost: ExecStart后运行
    ExecStop:指明停止unit要运行的命令或脚本
    Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务

    Install

    定义由”systemctl enable”以及”systemctl disable”命令在实现服务启用或禁用时用到的一些选项

    Alias:别名,可使用systemctl command Alias.service
    RequiredBy:被哪些units所依赖,强依赖
    WantedBy:被哪些units所依赖,弱依赖
    Also:安装本服务的时候还要安装别的相关服务

    注意:对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启:systemctl daemon-reload

    运行级别

    在systemd中,运行级别由unit文件中的.target文件来定义

    [root@centos7 system]# ll /usr/lib/systemd/system/runlevel?.target
    lrwxrwxrwx. 1 root root 15 May 15 12:54 /usr/lib/systemd/system/runlevel0.target -> poweroff.target
    lrwxrwxrwx. 1 root root 13 May 15 12:54 /usr/lib/systemd/system/runlevel1.target -> rescue.target
    lrwxrwxrwx. 1 root root 17 May 15 12:54 /usr/lib/systemd/system/runlevel2.target -> multi-user.target
    lrwxrwxrwx. 1 root root 17 May 15 12:54 /usr/lib/systemd/system/runlevel3.target -> multi-user.target
    lrwxrwxrwx. 1 root root 17 May 15 12:54 /usr/lib/systemd/system/runlevel4.target -> multi-user.target
    lrwxrwxrwx. 1 root root 16 May 15 12:54 /usr/lib/systemd/system/runlevel5.target -> graphical.target
    lrwxrwxrwx. 1 root root 13 May 15 12:54 /usr/lib/systemd/system/runlevel6.target -> reboot.target
    

    使用systemctl list-unit-files --type target -all查看所有target的状态

    使用systemctl list-dependencies graphical.taget查看依赖性

    级别切换:依然可以使用init来切换,也可以使用systemctl isolate name.target来切换

    获取默认运行级别:systemctl get-default

    设置默认运行级别:systemctl set-default multi-user.target

    grub2

    在centos7中使用了grub2替代了grub legacy

    引导顺序

    1. UEFi或BIOS初始化,运行POST开机自检
    2. 选择启动设备,引导装载程序, centos7是grub2
    3. 加载装载程序的配置文件:/etc/grub.d/、/etc/default/grub、/boot/grub2/grub.cfg
    4. 加载initramfs驱动模块
    5. 加载内核选项
    6. 内核初始化,centos7使用systemd代替init
    7. 执行initrd.target所有单元,包括挂载/etc/fstab
    8. 从initramfs根文件系统切换到磁盘根目录
    9. systemd执行默认target配置,配置文件/etc/systemd/system/default.target
    10. systemd执行sysinit.target初始化系统及basic.target准备操作系统
    11. systemd启动multi-user.target下的本机与服务器服务
    12. systemd执行multi-user.target下的/etc/rc.d/rc.local
    13. Systemd执行multi-user.target下的getty.target及登录服务
    14. systemd执行graphical需要的服务

    设置内核参数

    开机grub设置内核参数,只影响当次启动。在linnux16行后添加 systemd.unit=NAME.target

    修复grub2

    修复grub2:

    BIOS:grub2-install /dev/sda
    UEFI:grub2-install

    修复配置文件:grub2-mkconfig > /boot/grub2/grub.cfg

    调整默认启动内核:vim /etc/default/grub

    常见故障

    1. 故障原因:默认启动级别被设置为reboot.target

      故障现象:开机无限重启

      解决办法:

      1. 在grub菜单下按e
      2. 在linux16这一行的最后加上 systemd.unit=multi-user.target,再按下Ctrl+x
      3. 进入系统设置默认的运行级别
    2. 故障原因:忘记root口令

      故障现象:进不去系统

      解决办法:

      方法一:

      1. 启动时任意键暂停启动
      2. 按e键进入编辑模式
      3. 将光标移动linux16开始的行,改为rw init=/sysroot/bin/sh
      4. 按ctrl+x启动
      5. chroot /sysroot
      6. passwd root
      7. touch /.autorelabel
      8. exit
      9. reboot

      方法二:

      1. 启动时任意键暂停启动
      2. 按e键进入编辑模式
      3. 将光标移动linux16开始的行,添加内核参数rd.break
      4. 按ctrl+x启动
      5. mount –o remount,rw /sysroot
      6. passwd root
      7. touch /.autorelabel
      8. exit
      9. reboot
    3. 故障原因:MBR前446字节被破坏

      故障现象:进不去菜单

      解决办法:

      1. 进入rescue
      2. 键入1,continue
      3. chroot /mnt/sysimage
      4. grub2-install /dev/sda
      5. exit;reboot
    4. 故障原因:boot目录缺失

      故障现象:提示进入rescue模式

      解决办法:

      1. 进入rescue
      2. chroot /mnt/sysimage
      3. grub2-install /dev/sda
      4. mount /dev/sr0 /mnt
      5. rpm -ivh /mnt/Package/kernel-XXXX --force
      6. grub2-mkconfig > /boot/grub2/grub.cfg
      7. exit;reboot

    相关文章

      网友评论

          本文标题:系统启动和内核管理.

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