第15章,系统启动和内核管理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第15章,系统启动和内核管理相关的知识,希望对你有一定的参考价值。

更多内容请点击:

Linux学习从入门到打死也不放弃,完全笔记整理(持续更新,求收藏,求点赞~~~~) 

http://blog.51cto.com/13683480/2095439


第15章,系统启动和内核管理

 

本章内容

               Centos5和6的启动流程

                     服务管理

                     Grub管理

               自制Linux

               启动排错

               编译安装内核

               Centos7启动流程

                     Unit介绍

                     服务管理和查看

                     启动排错

                     破解口令

                     修复grub2

 

Linux组成:---------------------------------------------------------------------

               Linux:kernel+rootfs

                             kernel:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能

                             rootfs:程序和glibc

                            库:函数集合,function,调用接口

                                           过程调用:procedure,无返回值

                                           函数调用:function

                             程序:二进制执行文件

               内核设计流派:

                            单内核(monolithic kernel):linux

                                           把所有功能集成于同一个程序

                            微内核(micro kernel):windows,solaris

内核:

               linux内核特点:

                            支持模块化:.ko

                                           如:文件系统,硬件驱动,网络协议等

                             支持内核模块的动态装载和卸载

               组成部分

                            核心文件:/boot/vmlinuz-VERSION-release

                                           ramdisk:辅助的伪根文件系统

                                                  centos5:/boot/initrd-VERSION-release.img

                                                  centos6,7:/boot/initramfs-VERSION-release.img

                            模块文件:/lib/modules/VERSION-release

 

Centos5,6 启动流程:----------------------------------------------------------------

               

               post--mbr引导--bootloader加载grub--加载内核--启动init--读取默认运行级别--

               --执行rc.sysinit系统初始化脚本--根据运行级别执行rc N,开启运行级别下默认开启的服务

               --执行/etc/rc.d下rc.local--执行/bin/login,等待用户登录

 

               POST加电自检

               boot sequence 按照启动顺序查找第一个拥有启动功能的设备

               读取MBR前446个字节的bootloador,也就是grub第一阶段

               第一阶段的目的是在磁盘分区表之后的扇区上寻找grub1.5阶段

               grub1.5阶段读取boot分区文件系统驱动,并且找到boot分区,读取grub第2阶段

               grub第2阶段会根据事先写好的配置文件加载选定内核 和ramdisk或ramfs

               内核启动之后首先会进行自身初始化,加载硬件驱动程序(可能借助于ramdisk或者ramfs)

               内核完成初始化之后,找根,借助grub.conf第二阶段配置文件root=找到根

               借助ramdisk或者ramfs加载真正的根文件系统驱动,之后只读挂载真正的根文件系统

               启动第一个进程/sbin/init,centos5  /etc/inittab centos6 /etc/inittab /etc/init/*.conf

               根据运行配置文件运行默认运行级别

               运行/etc/rc.d/rc.sysinit 初始化脚本

                            1     设置主机名

                            2     设置欢迎信息

                            3     激活udev和selinux

                            4     挂载/etc/fstab文件中定义的文件系统

                            5     检测根文件系统,并以读写方式重新挂载根文件系统

                            6     设置系统时钟

                            7     激活swap设备

                            8     根据/etc/sysctl.conf文件设置内核参数

                            9     激活lvm及software.conf文件设置内核参数

                            10   加载额外设备的驱动程序

                            11    清理操作

               根据选择的运行级别,执行rc N,关闭/开启 对应级别的服务以及/etc/rc.d/rc.local

               执行/bin/login,等待用户登录

               登录之后开启shell获取控制权

        

 

启动流程:

               POST:power-on-self-test,加电自检,是bios功能的一个主要部分。负责完成对cpu、

                      主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测

                            ROM:bios(basic input and output  system),保存着有关计算机系统最重要的

                                    基本输入输出程序,系统信息设置,开机加电自检程序和系统启动自举程序等

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

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

               

               bootloader:引到加载器,引到程序

                            window:ntloader,仅是启动os

                             linux:功能丰富,提供菜单,雨荨用户选择要启动系统或不同的内核版本,把用户选定的

                                    内核装载到内存中的特定空间中,解压,展开,并把系统控制权移交给内核

                                           lolo:linux loader

                                           grub:grand unified  bootloader

                                           

               MBR:446 bootloader ,64  分区表,2 55AA标识符

               

               Grub:    stage1 bootloader

                            stage1.5  0扇区之后的扇区

                            stage2           磁盘文件系统上,boot目录下

               

               kernel 自身初始化:

                             探测可识别到的所有硬件设备

                             加载硬件驱动程序(借助于ramdisk加载驱动)

                             以只读方式挂载根文件系统

                             运行用户空间的第一个应用程序:/sbin/init

                             

               ramdisk:

                            与内核一起被grub加载进内存,放在内存指定的地方,模拟磁盘上的微型根文件系统

                             centos5,6上为gz压缩之后的cpio文件,如要查看,改名解压 使用cpio -tv <  查看

                            centos7  直接为cpio文件,没有压缩

                             

                            centos 5  initrd

                                           工具程序:mkinitrd

                            centos 6,7      initramfs

                                           工具程序,mkinitrd,dracut

                             

ramdisk管理:

               ramdisk文件的制作:

mkinitrd         1.      mkinitrd命令

                             为当前正在使用的内核重新制作ramdisk文件

                            mkinitrd  /boot/initramfs-`uname -r`.img $`uname -r`

dracut                   2     dracut命令

                             为当前正在使用的内核重新制作ramdisk文件

                            dracut  /boot/initramfs-`uname -r`.img $`uname -r`

               PS:   mkinitrd 本是是一个脚本  根据参数:   $(uname -r)  来生成initramfs文件

init程序:

               init程序的类型:

                            sysv:init  centos5之前

                                           配置文件:     /etc/inittab

                            upstart:init,centos  6

                                           配置文件:     /etc/inittab,/etc/init/*.conf

                             systemd:systemd,centos7

                                           配置文件:     /usr/lib/systemd/system

                                                                /etc/systemd/system

               PS:          init命令通过   /var/lock/subsys/文件存在与否来判断服务是否是开启状态                                               

 

/etc/inittab 文件:

                            初始运行级别(0-6)          centos6 只剩这一项了

                            系统初始化脚本,/etc/rc.d/rc.sysinit

                            rc N  运行对应级别的脚本目录

                             捕获某个关键字顺序

                            定义UPS电源终端、恢复脚本

                            在虚拟控制台生成getty,mingetty会自动调用login程序

                            在运行级别5初始化X

               

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

                     id:runlevel:action:process

               

               action:

                             wait:切换至此级别运行一次

                             respawn:此process终止,就重新启动

                             initdefault:设定默认运行级别;process省略

                             sysinit:设定系统初始化方式,此处一般为指定  /etc/rc.d/rc.sysinit

               

               ca::ctrlaltdel:/sbin/shutdown -t3 -r now    ctrl+alt+del 重启

               

/etc/rc.d/rc.sysinit 初始化脚本

                            1     设置主机名

                            2     设置欢迎信息

                            3     激活udev和selinux

                            4     挂载/etc/fstab文件中定义的文件系统

                            5     检测根文件系统,并以读写方式重新挂载根文件系统

                            6     设置系统时钟

                            7     激活swap设备

                            8     根据/etc/sysctl.conf文件设置内核参数

                            9     激活lvm及software.conf文件设置内核参数

                            10   加载额外设备的驱动程序

                            11    清理操作

                    

CentOS 6 /etc/inittab和相关文件      

                      /etc/inittab

                                    设置系统默认的运行级别

                                    id:3:initdefault:

                     /etc/init/control-alt  -delete.conf

                      /etc/init/tty.conf

                     /etc/init/start  -ttys.conf

                      /etc/init/rc.conf

                     /etc/init/prefdm.conf           ·

 

rc N :

               N为运行级别,读取/etc/rc.d/rcN.d/中的文件

                     K*,K##*: 关闭服务,数字越小,越先运行;数字越小的服务,通常为依赖到别的服务

                     S*,S##*: 开启服务,数字越小,越先运行;数字越小的服务,通常为被依赖到的服务

 

        注意:     正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个

                             服务脚本,而是指向了/etc/rc.d/rc.local脚本

        ?           不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行

                             的命令,可直接放置于/etc/rc.d/rc.local文件中

                      /etc/rc.d/rc.local在指定运行级别脚本后运行

                     可以根据情况,进行自定义修改

 

init:服务管理命令----------------------------------------------------------------

chkconfig命令:

               查看服务在所有级别的启动或者关闭设定

                            chkconfig [--list]  name

               添加服务:

                             SysV的服务脚本放在/etc/rc.d/init.d 下(centos6   /etc/init.d为软链接      centos5为硬链接)

                            chkconfig --add  name

                                    #!/bin/bash

                                    #chkconfig:LLLL nn mm       

                                                  LLLL:运行级别

                                                  nn:S##编号,开启的顺序

                                                  mm:K##编号,关闭的顺序

                                                         

               删除:     

                            chkconfig --del  name

               修改服务的默认启动/关闭

                            chkconfig [--level  LLLL] name <on | off |reset >

                                   LLLL  为运行级别,默认2345

               

ntsysv      [--level=LLLL] 字符下的窗口界面,修改服务的默认启动或者关闭

 

service命令:

               通过chkconfig --add 添加的服务,可以被service命令手动管理

               设置开启,关闭,重启,查看     

                            service SERVERNAME  start|stop|restart|status

               查看所有服务当前状态:

                            service  --status-all

                             

 

grub:--------------------------------------------------------------------------

 

安装grub:

                     grub-install  --root-directory=DIR /dev/DISK

                                    安装grub stage1 和stage1.5到/dev/DISK 磁盘上,并复制GRUB相关文件到

                             DIR/boot目录下

                             

                     grub命令:交互式

                                    grub>root(hd#,#)

                                    grub>setup(hd#)

 

grub legacy                        

               配置文件:/boot/grub/grub.conf  <--/etc/gurb.conf

               stage2及内核等通常放置于一个基本磁盘分区

               功用:

                            1     提供启动菜单、并提供交互式接口

                                          a     内核参数

                                          e     编辑模式,用于编辑菜单

                                          c      命令模式,交互式接口

                            2     加载用户选择的内核或操作系统

                                           允许传递参数给内核

                                           可以隐藏启动菜单

                            3     为菜单提供了保护机制

                                           为编辑启动菜单进行认证(可设置密码)

                                           为启动内核或操作系统进行认证(设置密码)

 

               grub的命令行接口:

                            help | help  KEYWORD

                            find  (hd0,0)/path/to/file

                             root(hd0,0)

                             kernerl

                             initrd

                            boot  引导启动选定的内核

               

               内核参数文档:

                            cat  /usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt

                            需安装kernel-doc包

                            cat  /proc/cmdline  查看内核参数

                                           

               识别硬盘设备:

                             (hd#,#)

                              hd#:磁盘编号,用数字表示;从0开始编号

                             #:分区编号,用数字表示,从0开始编号

                             (hd0,0)第一块硬盘的第一个分区

               手动在grub命令行接口启动系统

                     root  (hd0,0)

                      kernerl

                      initrd

                     boot

 

配置文件:/boot/grub/grub.conf    

               default=#               设定默认启动的菜单项;title编号从0开始

               timeout=#             指定菜单项等待选项选择的时间。单位为秒

               splashimage=(hd#,#)/grub/abc.xpm.gz            菜单背景图片文件路径

               password [--md5|--encrypted] STRING           启动菜单编辑认证密码可以明文

               hiddenmenu:      隐藏菜单

               title TITLE               定义菜单项“标题”  ,可以有多个

                            root(hd#,#)    查找stage2及kernel文件所在的设备分区,为grub的根

                            kernel  [/boot]/kernel-   使用启动的内核

                            initrd  [/boot]/initramfs-       使用的ramfs文件

                            password  [--md5|--encrypted] STRING            启动内核编辑的认证密码可以明文

                             

grub加密:

               生成grub口令

                            grub-md5-crypt          md5

                            grub-crypt                   sha512

               修改grub.conf文件:

                            password  [--md5|--encrypted] STRING

               破解root口令

                             启动系统时,设置其运行级别为1

                                    进入单用户模式,编辑grub菜单,kernel后加 1 s S single 都可以

                            使用passwd命令修改密码

                             

设置grub背景图片

               1     提供一张图片,640*480尺寸 pic.jpg

               2     安装ImageMagick工具包,使用       convert工具转化格式为xpm  色深14

                     convert -resize 640x480  -colors 14 pic.jpg pic.xpm

                     可以使用head 查看pic.xpm属性

               3     使用gzip 压缩pic.xpm  复制pic.xpm.gz到grub目录下

               4     修改grub.conf      splashimage=(hd0,0)/grub/pic.xpm.gz

               

 

自制linuz系统:-------------------------------------------------------------------

               1     分区并创建文件系统

                            fdisk /dev/sdb  分两个必要的分区

                             /dev/sdb1----boot

                             /dev/sdb2----root

                            mkfs.ext4  创建文件系统

               2     挂载boot

                            mkdir  /mnt/boot

                            mount /dev/sdb1  /mnt/boot

               3     安装grub

                            grub-install  --root-directory=/mnt /dev/sdb

               4     复制内核和initramfs文件

                     cp  /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/

                     cp  /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot

               5     创建grub.conf文件

                            vim  /mnt/boot/grub/grub.conf

                                           default=0

                                           timeout=5

                                           splasgimage=(hd0,0)/grub/pic.xpm.gz

                                          title  minicentos

                                                         root (hd0,0)

                                                         kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2  selinux=0  init=/bin/bash

                                                         initrd /initramfs-2.6.32-642.el6.x86_64.img

               6     复制root文件

                            mkdir  /mnt/sysroot

                            mount /dev/sdb2  /mnt/sysroot

                            mkdir -pv  {etc,lib,usr,home,root,proc,sys,boot,dev,mnt...}

               7     复制bash和相关库文件

                     复制相关命令及相关库文件

                     如:ifconfig,insmod,ping,mount,ls,cat,df,lsblk,blkid,insmod,lsmod,modinfo等

                     可是使用如下脚本复制

               

               8      如果需要使用网路功能,还需要复制驱动程序e1000           

                     cp  /lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko  /mnt/sysroot/lib/

                     自制系统开机之后:

                                    使用insmod /lib/e1000.ko 安装驱动

                                    使用ifconfig 配置IP即可

 

                    

救援环境,inittab文件误删除恢复

 

               centos6:毫无影响,正常启动,自行复制就可

               

               centos5:

                            现象:

                                           使用reboot命令无法重启,开机提示输入runlevel,之后启动处于停止状态

                            修复:

                                           救援模式,页面输入linux rescue进入

                                          chroot  /mnt/sysimage

                                          bikid  可以查看到光盘

                                          mount  /dev/hdc /mnt

                                          cd  /mnt/Server

                                          rpm  -ivh initscripts-8.45.30-2.el5.i386.rpm  --force|--replacepkgs

                            也可以使用   

                                   rpm2cpio  /mnt/Server/initscripts-8.45.30-2.el5.i386.rpm |cpio -idv ./etc/inittab  /etc/

 

 

/proc目录

               /proc:

                             内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出

               参数:

                            只读:输出信息

                             可写:可接受用户指定"新值"来实现对内核某功能或特性的配置

               /proc/sys

                            1     sysctl命令用来查看或设定此目录中诸多参数

                                          sysctl  -w path.to.paremeter=VALUE

                                          sysctl  -w kernel.hostname=HOSTNAME

                            2     echo 命令用于查看或设定此目录中诸多参数

                                          echo  "VALUE" > /proc/sys/PATH/TO/PARAMETER

                                          echo  "websrv" > /proc/sys/kernel/hostname

               

               PS:          如果使用sysctl命令修改,使用"."作为分隔

                            如果使用echo 1|0 > 修改,使用"/"作为分隔

        

sysctl命令:

               默认配置文件:/etc/sysctl.conf

                     1     设置某参数

                                   sysctl -w  parameter=VALUE

                     2     通过读取配置文件设置参数

                                   sysctl -p  /path/file

                     3     查看所有生效参数

                                   sysctl  -a

               

               常用的几个参数:

                             net.ipv4.ip_forword                           路由转发功能

                             net.ipv4.icmp_echo_ignore_all      禁ping

                            vm.drop_caches                                清除缓存

                             

/sys目录

               sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有

                             内核对硬件特性的设定信息;有些参数时可以修改的,用于调整硬件工作特性

               

               udev通过此路径下输出的信息动态为个设备创建所需要设备文件,udev是运行用户空间程序

               

               专用工具:     udevadmin hotplug

               udev为设备创建设备文件时,会读取其实现定义好的规则文件,一般在

                                    /etc/udev/rules.d

                                    /usr/lib/udev/rules.d

               

               

内核组成部分:

               分类:单内核,微内核        

                             kernel:一般为:/boot/vmlinuz-VERSION-release

                            kernel object  内核模块,一般位于  /lib/modules/VERSION-RELEASE/

                            辅助文件: ramdisk: /boot/initrd 或者 initramfs

                                    

               运行中的内核:     

                            uname  [option]

                            -n          显示节点名称

                            -r          显示VERSION-RELEASE

                            -a          显示所有信息

               

内核模块命令:

 

lsmod:

               显示由核心已经装载的内核模块

               显示的内容来自于:/prco/modules

moinfo

               显示模块的详细描述信息,当前没有装载也可以查看

                            modeinfo [-k kernel]  [modulename | filename]

                                   -n          只显示模块文件路径

                                   -p          只显示模块参数

                                   -a          作者

                                   -d          description     描述

                                   -l           license    遵守的协议类型

        

modprobe

               装载或卸载内核模块

                            modprobe  modname   装载

                                   -r                        卸载

               配置文件:     /etc/modprobe.conf      

                                    /etc/modprobe.d/*.conf

                                    

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

 

insmod 装载内核模块,不会自动解决依赖关系

                     insmod [filename] [module  options..]

                     insmod `modinfo -n  xfs`

rmmod    卸载模块

                     rmmod  xfs

        

                    

               

编译安装内核:--------------------------------------------------------------------

 

前提:

               1     准备好开发环境

                            包组:    Server Platform  Development     (centos7没有)

                                           Development Tools

                                           

               2     获取目标主机上硬件设备的相关信息

                            CPU:       cat /proc/cpuinfo,x86info  -a,lscpu

                            PCI: lspci -v -vv ,lsusb -v -vv     lsblk

                             

               3     获取目标主机系统功能的相关信息

                             例如:需要启用相应的文件系统

               4     获取内核源代码包

               

内核编译安装流程             

               完整编译:

                            安装开发包组

                            下载源码文件              解压并cd进入解压生成的目录

                             装备文本配置文件,".config" 可以从现有系统复制改名得到 (/boot下config-VERSION)

                            make menuconfig        配置内核选项,选择或者不选择相应模块

                            make [-j #]           编译,可选择cpu个数

                            make  modules—install 安装模块

                            make install                  安装核心

                                           vmlinuz-

                                           initramfs-              

                                           编辑grub配置文件

                             reboot

               

               部分编译:

                             只编译某子目录中的相关代码

                                          cd  进入解压目录,

                                          make  dir/       只能使用相对路径

                             只编译一个特定的模块:

                                          make  dir/file.ko

                                           

               交叉编译:

                             如何交叉编译内核:

                                           编译的目标平台与当前平台不相同

                                          make  ARCH=arch_name

                             获取特定目标平台的使用帮助

                                          make  ARCH=arch_name help

                                                  make ARCH=arm help 手机平台

                                                  

               清理:

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

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

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

               

卸载内核:

               删除/lib/modules/ 下不需要的内核

               删除/usr/src/linux 解压目录下不需要的内核源码

               删除/boot 目录下启动的内核和initramfs文件

               更改grub的配置文件,删除不需要的内核启动列表

               

               

练习:

? 1、破解root口令,并为grub设置保护功能

? 2、破坏本机grub  stage1,而后在救援模式下修复之

? 3、删除vmlinuz和initramfs文件后无法启动,两种方法恢复之

? 4、增加新硬盘,在其上制作能单独运行kernel和bash的系统

? 5、在U盘上定制linux,使其可启动系统,并具有网络功能

? 6、删除/etc/fstab和/boot目录的所有文件,并恢复之

? 7、编译安装kernel,启用支持ntfs文件系统功能             

               

               

               

systemd:-----------------------------------------------------------------------------         

               syetemd:centos7 上的第一个进程

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

                             服务器进程和其他进程

               新特性:

                             系统引导时实现服务并行启动

                            按需启动守护进程

                             自动化的服务依赖关系管理

                            同时采用socket式和D-bus总线式激活服务

                            系统状态快照

                             

               核心概念:unit

                             unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了

                            系统服务、监听socket、保存的系统快照以及其他与init相关的信息

               

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

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

                                    /etc/systemd/system            管理员建立的执行脚本,比上面的目录优先运行

               

               特性:     向后兼容sysv init 脚本

                             systemctl命令固定不变,不可扩展

                            非由systemd启动的服务,systemctl无法与之通信的控制

               

unit类型:

systemctl -t help         查看unit类型

                     service unit .service      用于定义系统服务

                     .target            用于模拟实现运行级别

                     .device           用于定义内核识别的设备

                     .mount          定义文件系统挂载点

                     .socket           用于标识进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动

                     .snapshot       管理系统快照

                     .automount    文件系统的自动挂载点

                     .path              用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,

                                           延迟激活服务,如spool目录

                    

管理服务:

               管理系统服务:service unit

               命令:     

                            systemctl  [start|stop|restart|status] name.service

               条件式重启:已启动才重启,否则不做操作

                            systemctl  try-restart name.service

               重载或重启服务:先加载,启动

                            systemctl  reload-or-restart name.service

               重载或条件式重启:

                            systemctl  reload-or-try-restart name.service

               

               禁止自动和手动启动:

                            systemctl mask  name.service              通过创建软链接指向/dev/null来禁止启动

               取消禁止

                            systemctl unmask  name.service

                             

               查看某服务当前激活与否的状态:

                            systemctl is-active  name.service 激活状态$?为0   非激活状态非0

               

               查看所有已激活的服务:

                            systemctl list-units  --type|-t service

                                          -t  service

               

               systemctl单独使用:

                            等于systemctl list-units       查看所有活动units

               

               查看所有服务:

                            systemctl list-units  -type|-t service --all|-a

                                           -at   service

                                           

               设定某服务开机启动:

                            systemctl enable  name.service

               设置某服务开机禁止启动

                            systemctl disable  name.service

               

               查看所有服务的开机自启状态:

                            systemctl  list-unit-files -t service

                             

               查看服务是否开机自启:

                            systemctl is-enabled  name.service

                            自启$?为0   否则为1

               

               用来列出该服务在那些运行级别下启用和禁用

                            ls  /etc/systemd/system/*.wants/name.service

               

               查看服务的依赖关系:

                            systemctl  list-dependencies name.service

               

               杀掉进程:

                            systemctl kill  unitname

 

服务状态:

                     使用systemctl -at service查看状态

                     loaded:               unit配置文件已处理

                     active(running) 一次或多次持续处理的运行

                     active(exited)     成功完成一次性的配置

                     active(waiting)   运行中,等待一个事件

                     inactive                 不运行

                     enabled                       开机启动

                     disabled                开机不启动

                     static                             开机不启动,但可被另一个启动的服务激活

               

service unit 文件格式

               /etc/systemd/system:           系统管理员和用户使用

               /usr/lib/systemd/system:      发行版打包使用

               以"#"开头的行后面的内容被任务是注视

               相关布尔值,1,yes,on,true都是开启,0,no,of,false都是关闭

               时间单位默认是秒,所以要用毫秒ms 分钟m  等需要显式说明

               

               servic unit file 通常由三部分组成:

               

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

                             Dsecription: 描述信息

                            After:                 定义unit的启动次序,表示当前unit应该晚于哪些unit启动,与Before相反

                             Requires:            依赖到的其他units,强依赖,被依赖的unit无法激活时

                                                         当前unit也无法激活

                            Wants:               弱依赖

                             Conflicts:            定义units间的冲突关系

                             

               [Service]: 与unit类型相关的专用选项,service|socket 等

                            Type:             定义影响Execstart及相关参数的功能的unit进程启动类型

                                    simple: 默认值,这个daemon主要由ExceStart接的指令串来启动,启动后

                                                         常驻于内存中

                                    forking:        有ExceStart启动的程序通过spawns延伸出其他子程序来作为此daemon

                                                         的主要服务,原生父进程在启动结束后就会终止

                                    oneshot:      与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中

                                    dbus:           与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作。

                                                         因此通常也要同时设定BusName=  才行

                                    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

 

服务Unit文件示例:

                     ? vim  /etc/systemd/system/bak.service

                                    [Unit]

                                    Description=backup /etc

                                    Requires=atd.service

                                    [Service]

                                    Type=simple

                                    ExecStart=/bin/bash -c "echo /testdir/bak.sh|at  now"

                                    [Install]

                                    WantedBy=multi-user.target

                     ?systemctl  daemon-reload

                     ?systemctl start bak                       

 

target units

               unit配置文件: .target

               查看所有target

                            ls  /usr/lib/systemd/system/*.target

                            systemctl  list-unit-files -t target -a

                             

               运行级别

                             /usr/lib/systemd/system/runlevel0.target ->  poweroff.target

                             /usr/lib/systemd/system/runlevel1.target ->  rescue.target

                             /usr/lib/systemd/system/runlevel2.target ->  multi-user.target

                             /usr/lib/systemd/system/runlevel3.target ->  multi-user.target

                             /usr/lib/systemd/system/runlevel4.target ->  multi-user.target

                             /usr/lib/systemd/system/runlevel5.target ->  graphical.target

                             /usr/lib/systemd/system/runlevel6.target ->  reboot.target

 

               查看依懒性:

                            systemctl  list-dependencies graphical.target

 

 

               级别切换:     init N ==> systemctl isolate name.target

                             

                            注意:只有/lib/systemd/system/*.target 文件中AllowIsolate=yes,才能切换

                                           (修改文件需执行 systemctl daemon-reload  才能生效)

 

               查看target:

                                   runlevel         链接指向systemctl

                                   who  -r

                                   systemctl  list-units -t target

               

               获取默认运行级别:

                            /etc/inittab ===>  systemctl get-default

                            ll  /etc/systemd/system/default.target

               

               修改默认运行级别:

                            systemctl  set-default name.target

                             

               进入默认target:

                            systemctl  default

                             

其他命令:

               切换至紧急救援模式:

                            systemctl  rescue

               切换至emergency模式

                            systemctl  emergency

               其他常用命令:

                            传统命令:    init  poweroff halt reboot 都称为systemctl的软链接

                            关机:    systemctl hatl  、systemctl poweroff

                            重启:    systemctl reboot  

                            挂起:    systemctl  suspend

                            休眠:    systemctl  hibernate

                            休眠并挂起:systemctl hybrid-sleep

                             

CentOS 7 引到顺序:

                     POST开机自检

                     boot sequence  选择启动设备

                     引导装载程序,grub2

                     加载装载程序的配置文件:/boot/grub2/grub.cfg,给出内核选项

                     加载内核,以及initramfs

                     内核初始化

                     开启第一个进程:systemd

                     执行initrd.target所有单元,包括挂载/etc/fstab

                     切换根文件系统

                     systemd 执行默认target配置,配置文件/etc/systemd/system/default.target

                     systemd 执行sysinit.target 初始化系统及basic.target  准备操作系统

                     systemd 执行multi-user.target 下的本机与服务器服务

                     systemd  执行  multi-user.target下  /etc/rc.d/rc.local

                     systemd 执行multi-user.target下     getty.target及登录服务

                     systemd 执行graphical 需要的服务

                    

设置启动内核参数:

                     启动时,在linux16行后添加 systemd.unit=multi-user.target  启动进入3模式

                      systemd.unit=rescue.target

                      systemd.unit=emergency.target

                     rescue.target 比emergency 支持更多的功能,例如日志等

                    

centos7 破解root口令

                     方法1:

                                    启动项e键修改

                                    找到lunux16 内核这一项,rd.break,ctrl+x启动

                                   mount -o  rw,remount /sysroot

                                   chroot  /sysroot

                                   passwd  修改密码

                                    如果selinux启动状态,则需要touch  /.autorelabel

                                    exit

                                    reboot

                     方法2:

                                    启动项e键修改

                                    找到linux16,行尾添加 rw  init=/sysroot/bin/sh ,ctrl+x启动

                                   chroot  /sysroot

                                   passwd  修改密码

                                    如果selinux启动状态,则需要touch  /.autorelabel

                                    exit

                                    reboot

 

修复grub2

               主要配置文件:       /boot/grub2/grub.conf

                            辅助配置文件:/etc/default/grub

               修复配置文件:

                            grub2-mkconfig >  /boot/grub2/grub.cfg

               修复grub2

                            grub2-install  /dev/sda        BIOS环境

                            grub2-install  UEFI环境

               调整默认启动内核:

                            vim  /etc/default/grub

                             GRUB_DEFAULT=0

                            grub2-mkconfig >  /boot/grub2/grub.cfg

                             

练习:

? 为编译安装的httpd服务,实现service unit文件

? 破解centos7  口令

? 修改默认的启动内核为新编译内核

? 启动时临时禁用SELinux

? 启动时进入emergency模式

? 卸载编译安装的新内核

 

 

笔记整理完成时间:2018年5月19日17:37:21

        

 

        


以上是关于第15章,系统启动和内核管理的主要内容,如果未能解决你的问题,请参考以下文章

[架构之路-44]:目标系统 - 系统软件 - Linux下的网络通信-4-Linux内核网络协议栈网络配置命令网络服务启动

[架构之路-25]:目标系统 - 系统软件 - bootloader uboot内存映射与启动流程

Linux命令应用大词典-第37章 Linux系统故障排错

推荐系统实践(项亮)— 第3章 推荐系统冷启动问题

第3阶段——内核启动分析之挂载根文件系统和mtd分区介绍

第14章 Linux开机详细流程