• Linux系统启动和内核管理


    Linux系统启动和内核管理
    CentOS 6 的启动管理
    Linux 组成:
    kernel (boot下)实现进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能等功能
    rootfs 包括程序和 glibc 库
    程序:二进制执行文件
    库:函数集合, function, 调用接口(头文件负责描述)
    内核设计流派
    宏内核(monolithic kernel):又称单内核和强内核,Unix,Linux
    把所有系统服务都放到内核里,所有功能集成于同一个程序,分层实现不同功能,系统庞大复杂,
    Linux其实在单内核内核实现了模块化,也就相当于吸收了微内核的优点
    微内核(micro kernel):Windows,Solaris,HarmonyOS
    简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护,每
    种功能使用一个单独子系统实现,将内核功能移到用户空间,性能差

    centos启动流程
    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控制主机

    1.硬件启动post(加电自检)
    POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内
    存、硬盘子系统、显示子系统、串并行接口、键盘等硬件情况的检测
    主板的ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出
    程序,系统信息设置、开机加电自检程序和系统启动自举程序等
    主板的RAM:CMOS互补金属氧化物半导体,保存各项参数的设定,按次序查找引导设备,第一个有引
    导程序的设备为本次启动设备
    2.bootloader 启动加载器
    (1)grub的功能和组成
    bootloader: 引导加载器,引导程序
    windows: ntloader,仅是启动OS
    Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装
    载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
    Linux的bootloader
    LILO:LInux LOader,早期的bootloader,功能单一
    GRUB: GRand Unified Bootloader, CentOS 6 GRUB 0.97: GRUB Legacy, CentOS 7 以后使用GRUB 2.02
    grub的启动阶段:
    primary boot loader :
    1st stage:MBR的前446个字节
    1.5 stage: mbr 之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统
    secondary boot loader :
    2nd stage,分区文件/boot/grub/

    #查询确定文件驱动所在位置(centos6在启动时需读取/boot/grub中的内核信息,该文件读取需要内核文件系统,由于内核此时并未启动,
    于是将文件驱动存放在1.5启动阶段。)
    modinfo ext4.ko 查看ext4驱动文件
    ll -h 驱动文件 查看驱动大小

    (2)grub 安装
    方法一:
    grub-install 安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到 DIR/boot目录下
    grub-install --root-directory=DIR /dev/DISK
    方法二:
    grub
    grub> root (hd#,#)
    grub> setup (hd#)

    修复grub的第1阶段故障
    #破坏第一阶段
    [root@centos6 grub]#hexdump -C -n 512 /dev/sda (查看硬盘前512字节)
    #破坏grub第1阶段(446个字节)
    [root@centos6 grub]#dd if=/dev/zero of=/dev/sda bs=1 count=446
    [root@centos6 grub]#hexdump -C -n 512 /dev/sda (查看是否被破坏)
    [root@centos6 grub]#hexdump -C -n 512 /dev/sda -v (可查看全部隐藏字节)
    [root@centos6 grub]#reboot (重启无法启动)
    #修复第一阶段
    光盘启动,进入rescue模式
    #chroot /mnt/sysimage 切根
    #grub-install /dev/sda grub安装
    #sync 实现同步(避免在缓存未写入磁盘)
    #exit

    修复grub的第1.5 阶段故障(1.5阶段破坏后找不到文件系统驱动无法启动)
    #破坏第二阶段
    [root@centos6 ~]#dd if=/dev/zero of=/dev/sda bs=1 count=446
    [root@centos6 ~]#grub
    grub> root (hd0,0)
    grub> setup (hd0)
    grub> quit
    [root@centos6 ~]#dd if=/dev/zero of=/dev/sda bs=512 count=25 seek=1
    [root@centos6 ~]#reboot (无法启动)
    #修复第二阶段
    光盘启动,进入rescue模式
    #chroot /mnt/sysimage
    #grub-install /dev/sda
    #sync
    #按 ctrl+alt+delete 三个键重启动

    (3)grub legacy 管理
    配置文件:/boot/grub/grub.conf <-- /etc/grub.conf
    stage2及内核等通常放置于一个基本磁盘分区
    grub legacy 功用:
    (1) 提供启动菜单、并提供交互式接口
    a:内核参数
    e:编辑模式,用于编辑菜单
    c:命令模式,交互式接口
    (2) 加载用户选择的内核或操作系统
    允许传递参数给内核
    可隐藏启动菜单
    (3) 为菜单提供了保护机制
    为编辑启动菜单进行认证
    为启用内核或操作系统进行认证

    grub的命令行接口
    help: 获取帮助列表
    help KEYWORD: 详细帮助信息
    find (hd#,#)/PATH/TO/SOMEFILE:
    root (hd#,#)
    kernel /PATH/TO/KERNEL_FILE: 设定本次启动的内核文件;额外还可添加许多内核支持使用的
    cmdline参数
    例如:max_loop=100 selinux=0 init=/path/to/init
    initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk
    boot: 引导启动选定的内核
    cat /proc/cmdline 内核参数
    内核参数文档:
    /usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt

    grub legacy识别硬盘设备
    (hd#,#)
    hd#: 磁盘编号,用数字表示;从0开始编号
    #: 分区编号,用数字表示; 从0开始编号
    示例:
    (hd0,0) 第一块硬盘,第一个分区

    手动在grub命令行接口启动系统
    grub> root (hd#,#)
    grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
    grub> initrd /initramfs-VERSION-RELEASE.img
    grub> boot

    grub legacy配置文件:/boot/grub/grub.conf
    default=#: 设定默认启动的菜单项;落单项(title)编号从0开始
    timeout=#:指定菜单项等待选项选择的时长
    splashimage=(hd#,#)/PATH/XPM_FILE:菜单背景图片文件路径
    password [--md5| --encrypt] 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口令
    grub-md5-crypt
    grub-crypt
    破解root口令:
    (1) 编辑grub菜单(选定要编辑的title,而后使用a 或 e 命令)
    (2) 在选定的kernel后附加1, s, S,single 都可以进入单用户模式
    (3) 在kernel所在行,键入“b”命令

    加载 kernel
    kernel 自身初始化过程
    1. 探测可识别到的所有硬件设备
    2. 加载硬件驱动程序(借助于ramdisk加载驱动)
    3. 以只读方式挂载根文件系统
    4. 运行用户空间的第一个应用程序:/sbin/init
    Linux内核特点:
    支持模块化:.ko(内核对象),如:文件系统,硬件驱动,网络协议等
    支持内核模块的动态装载和卸载
    内核组成部分:
    核心文件:/boot/vmlinuz-VERSION-release
    ramdisk:辅助的伪根系统,加载相应的硬件驱动,ramdisk --> ramfs 提高速度
    CentOS 5 /boot/initrd-VERSION-release.img
    CentOS 6 以后版本 /boot/initramfs-VERSION-release.img
    模块文件:/lib/modules/VERSION-release

    ramdisk文件的制作:
    mkinitrd命令
    mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
    dracut命令
    dracut /boot/initramfs-$(uname -r).img $(uname -r)

    init初始化
    POST --> BootSequence (BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> init(systemd)
    init程序的类型:
    SysV: init, CentOS 5之前
    配置文件:/etc/inittab
    Upstart: init,CentOS 6
    配置文件:/etc/inittab, /etc/init/*.conf
    Systemd:systemd, CentOS 7
    配置文件:/usr/lib/systemd/system
    /etc/systemd/system

    运行级别
    运行级别:为系统运行或维护等目的而设定;0-6:7个级别,一般使用3, 5做为默认级别
    0:关机
    1:单用户模式(root自动登录), single, 维护模式
    2:多用户模式,启动网络功能,但不会启动NFS;维护模式
    3:多用户模式,正常模式;文本界面
    4:预留级别;可同3级别
    5:多用户模式,正常模式;图形界面
    6:重启
    切换级别:
    init #
    查看级别:
    runlevel
    who -r
    定义运行级别
    /etc/inittab
    CentOS 6 init程序为 upstart, 其配置文件/etc/inittab, /etc/init/*.conf,配置文件的语法 遵循 upstart
    配置文件语法格式
    /etc/inittab 设置系统默认的运行级别
    /etc/init/control-alt-delete.conf
    /etc/init/tty.conf
    /etc/init/start-ttys.conf
    /etc/init/rc.conf
    /etc/init/prefdm.conf

    初始化脚本 sysinit
    /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)清理操作

    服务管理
    service 命令:手动管理服务
    service 服务 start|stop|restart
    service --status-all

    /etc/rc.d/rc 控制服务脚本的开机自动运行
    rc N --> 意味着读取/etc/rc.d/rcN.d/
    K: K##:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
    S: S##:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务

    配置服务开机启动
    chkconfig命令
    ntsysv命令
    #查看服务在所有级别的启动或关闭设定情形:
    chkconfig [--list] [name]
    #添加服务
    SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)
    #!/bin/bash
    chkconfig: LLLL nn nn  #LLLL 表示初始在哪个级别下启动,-表示都不启动
    description : 描述信息
    chkconfig --add name
    #删除服务
    chkconfig --del name
    #修改指定的运行级别
    chkconfig [--level levels] name <on|off|reset>
    说明:--level LLLL: 指定要设置的级别;省略时表示2345

    非独立服务
    服务分为独立服务和非独立服务
    瞬态(Transient)服务被超级守护进程 xinetd 进程所管理,也称为非独立服务进入的请求首先被xinetd代理
    配置文件:
    /etc/xinetd.conf
    /etc/xinetd.d/<service>
    用chkconfig控制非独立服务开机启动
    示例:chkconfig tftp on

    开机启动文件 rc.local
    /etc/rc.d/rc.local
    注意:正常级别下,最后启动一个服务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在指定运行级别脚本后运行

    CentOS 启动过程总结
    /sbin/init --> (/etc/inittab) --> 设置默认运行级别 --> 运行系统初始脚本/etc/rc.d/rc.sysinit、完成系统
    初始化 --> (关闭对应下需要关闭的服务)启动需要启动服务/etc/rc#.d/Sxxxx,/etc/rc.d/rc.local--> 设置登录终端

    /proc /目录和内核参数管理
    /proc目录:内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出
    帮助:man proc
    内核参数:
    只读:只用于输出信息
    可写:可接受用户指定“新值”来实现对内核某功能或特性的配置
    /proc/sys设置
    sysctl命令用于查看或设定此目录中诸多参数
    sysctl -w path.to.parameter=VALUE
    sysctl -w net.ipv4.ip_forward=1 等价于echo 1 > /proc/sys/net/ipv4/ip_forward echo命令通过重定向方式也可以修改大多数参数的值

    内核参数配置文件
    etc/sysctl.conf 默认配置文件
    /etc/sysctl.d/*.conf
    /run/sysctl.d/*.conf
    /usr/local/lib/sysctl.d/*.conf
    /usr/lib/sysctl.d/*.conf
    /lib/sysctl.d/*.conf
    /etc/sysctl.conf

    sysctl命令:
    (1) 临时设置某参数
    sysctl -w parameter=VALUE
    (2) 通过读取配置文件设置参数
    sysctl -p [/path/to/conf_file] (读取配置文件,默认配置文件无需加入文件)
    (3) 查看所有生效参数
    sysctl -a
    常用的内核参数:
    net.ipv4.ip_forward
    net.ipv4.icmp_echo_ignore_all
    net.ipv4.ip_nonlocal_bind   #允许应用程序可以监听本地不存在的IP
    vm.drop_caches
    fs.file-max = 1020000
    #访问端口会生成套接字文件,生成fd,即生成新的文件
    #ipv4 2^32*65536 支持的远程用户访问(并发量)
    #apache:10k
    #nginx: 3-50k
    #ulimit -a 查看可打开的进程

    /sys/ 目录 (偏硬件配置)
    使用sysfs文件系统,为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内
    核对硬件特性的设定信息;有些参数是可以修改的,用于调整硬件工作特性
    udev通过此路径下输出的信息动态为各设备创建所需要设备文件,udev是运行用户空间程序
    专用工具:udevadmin, hotplug
    udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d
    及/usr/lib/udev/rules.d目录下
    例:/sys/class/scsi_host/host

    内核模块管理和编译
    单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制
    内核组成部分:
    kernel:内核核心,一般为bzImage,通常在/boot目录下
    名称为 vmlinuz-VERSION-RELEASE
    kernel object:内核对象,一般放置于
    /lib/modules/VERSION-RELEASE/ 存放内核功能不常用的文件(不核心模块)
    辅助文件:ramdisk
    initrd:从CentOS 5 版本以前
    initramfs:从CentOS6 版本以后

    内核版本
    运行中的内核:
    uname命令:
    uname - print system information
    uname [OPTION]...
    -n: 显示节点名称
    -r: 显示VERSION-RELEASE
    -a:显示所有信息

    内核模块命令
    lsmod命令:
    显示由核心已经装载的内核模块(内存中生效的内存模块)
    显示的内容来自于: /proc/modules文件
    modinfo命令:
    功能:管理内核模块
    配置文件:/etc/modprobe.conf, /etc/modprobe.d/*.conf
    显示模块的详细描述信息
    modinfo [ -k kernel ] [ modulename|filename... ]
    常用选项:
    -n:只显示模块文件路径
    -p:显示模块参数
    -a:作者
    -d:描述
    装载或卸载内核模块
    modprobe [ -C config-file ] [ modulename ] [ module parame-ters... ]
    modprobe [ -r ] modulename…

    depmod命令:内核模块依赖关系文件及系统信息映射文件的生成工具
    insmod命令:可以安装模块,需要指定模块文件路径,并且不自动解决依赖模块
    insmod [ filename ] [ module options... ]
    范例:
    insmod `modinfo –n exportfs`
    insmod `modinfo –n xfs`

    rmmod命令:卸载模块
    rmmod [ modulename ]


    编译内核
    编译安装内核准备:
    (1) 准备好开发环境
    (2) 获取目标主机上硬件设备的相关信息
    (3) 获取目标主机系统功能的相关信息,例如:需要启用相应的文件系统
    (4) 获取内核源代码包, www.kernel.org
    编译准备
    目标主机硬件设备相关信息
    CPU:
    cat /proc/cpuinfo
    x86info -a
    lscpu
    PCI设备:lspci -v ,-vv
    USB设备:lsusb -v,-vv
    lsblk 块设备
    全部硬件设备信息:hal-device:CentOS 6
    开发环境相关包
    gcc make ncurses-devel flex bison openssl-devel elfutils-libelf-devel
    内核编译安装实现
    下载源码文件
    准备文本配置文件/boot/config-`uname -r`
    make menuconfig:配置内核选项 ,相当于./configure
    [ ]: N
    [M]: M
    [*]: Y
    make [-j #] 或者用以下两步实现:
    make -j # bzImage
    make -j # modules
    安装模块:make modules_install
    安装内核相关文件:make install
    安装bzImage为 /boot/vmlinuz-VERSION-RELEASE
    生成initramfs文件
    编辑grub的配置文件
    内核编译说明
    1. 配置内核选项
    支持“更新”模式进行配置:make help
    (a) make config:基于命令行以遍历的方式配置内核中可配置的每个选项
    (b) make menuconfig:基于curses的文本窗口界面
    (c) make gconfig:基于GTK (GNOME)环境窗口界面
    (d) make xconfig:基于QT(KDE)环境的窗口界面
    支持“全新配置”模式进行配置
    (a) make defconfig:基于内核为目标平台提供的“默认”配置进行配置
    (b) make allyesconfig: 所有选项均回答为“yes“
    (c) make allnoconfig: 所有选项均回答为“no“
    编译内核
    全编译:
    make [-j #]
    编译内核的一部分功能:
    (a) 只编译某子目录中的相关代码
    cd /usr/src/linux; make dir/
    (b) 只编译一个特定的模块
    cd /usr/src/linux; make dir/file.ko
    3 交叉编译内核
    编译的目标平台与当前平台不相同
    make ARCH=arch_name
    要获取特定目标平台的使用帮助
    make ARCH=arch_name help
    示例:make ARCH=arm help
    4 重新编译需要事先清理操作
    make clean:清理大多数编译生成的文件,但会保留.config文件等
    make mrproper: 清理所有编译生成的文件、config及某些备份文件
    make distclean:包含 make mrproper,并清理patches以及编辑器备份文件
    卸载内核
    删除/usr/src/linux/目录下不需要的内核源码
    删除/lib/modules/目录下不需要的内核库文件
    删除/boot目录下启动的内核和内核映像文件
    更改grub的配置文件,删除不需要的内核启动列表 grub2-mkconfig -o /boot/grub2/grub.cfg
    CentOS 8 还需要删除 /boot/loader/entries/5b85fc7444b240a992c42ce2a9f65db5-新内核版本.conf

    busybox
    Busybox 最初是由 Bruce Perens 在 1996 年为 Debian GNU/Linux 安装盘编写的。其目标是在一张软盘(存储空间只有1MB多)上创建一个GNU/Linux 系统,
    可以用作安装盘和急救盘。Busybox 是一个开源项目,遵循GPL v2协议。Busybox将众多的UNIX命令集合进一个很小的可执行程序中,可以用来替代
    GNU fileutils、shellutils 等工具集。Busybox中各种命令与相应的GNU工具相比,所能提供的选项比较少,但是也足够一般的应用了。Busybox主要用于嵌入式系统
    Busybox 是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,
    例grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了Linux 的许多工具和命令,
    也包含了 Android 系统的自带的shell。
    定制小型的Linux操作系统:linux内核+busybox
    官方网站:https://busybox.net/
    Busybox使用
    busybox 的编译过程与Linux内核的编译类似
    busybox的使用有三种方式:
    busybox后直接跟命令,如 busybox ls
    直接将busybox重命名,如 cp busybox tar
    创建符号链接,如 ln -s busybox rm
    busybox的安装
    以上方法中,第三种方法最方便,但为busybox中每个命令都创建一个软链接,相当费事,busybox提
    供自动方法:busybox编译成功后,执行make install,则会产生一个_install目录,其中包含了busybox
    及每个命令的软链接

    systemd
    特性:
    Systemd:从 CentOS 7 版本之后开始用 systemd 实现init进程,系统启动和服务器守护进程管理器,
    负责在系统启动或运行时,激活系统资源,服务器进程和其它进程
    Systemd新特性:
    系统引导时实现服务并行启动
    按需启动守护进程
    自动化的服务依赖关系管理
    同时采用socket式与D-Bus总线式激活服务
    socket与服务程序分离
    向后兼容sysv init脚本
    使用systemctl 命令管理,systemctl命令固定不变,不可扩展,非由systemd启动的服务,systemctl无法与之通信和控制
    系统状态快照

    systemd核心概念:unit
    unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听
    socket、保存的系统快照以及其它与init相关的信息
    #查看unit类型:
    [root@centos8 ~]#systemctl -t help
    Available unit types:
    service
    socket
    target
    device
    mount
    automount
    swap
    timer
    path
    slice
    scope
    service unit: 文件扩展名为.service, 用于定义系统服务
    Socket unit: .socket, 定义进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动
    Target unit: 文件扩展名为.target,用于模拟实现运行级别
    Device unit: .device, 用于定义内核识别的设备
    Mount unit: .mount, 定义文件系统挂载点
    Snapshot unit: .snapshot, 管理系统快照
    Swap unit: .swap, 用于标识swap设备
    Automount unit: .automount,文件系统的自动挂载点
    Path unit: .path,用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务,如:spool 目录

    unit的配置文件
    /usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/
    /lib/systemd/system: ubutun的对应目录
    /run/systemd/system:系统执行过程中所产生的服务脚本,比上面目录优先运行
    /etc/systemd/system:管理员建立的执行脚本,类似于/etc/rcN.d/Sxx的功能,比上面目录优先运行

    systemctl管理系统服务service unit
    命令:
    systemctl COMMAND name.service

    #启动:相当于service name start
    systemctl start name.service  
    #停止:相当于service name stop
    systemctl stop name.service
    #重启:相当于service name restart
    systemctl restart name.service
    #查看状态:相当于service name status
    systemctl status name.service
    #禁止自动和手动启动:
    systemctl mask name.service
    #取消禁止
    systemctl unmask name.service
    #查看某服务当前激活与否的状态:
    systemctl is-active name.service
    #查看所有已经激活的服务:
    systemctl list-units --type|-t service
    #查看所有服务:
    systemctl list-units --type service --all|-a
    #设定某服务开机自启,相当于chkconfig name on
    systemctl enable name.service
    #设定某服务开机禁止启动:相当于chkconfig name off
    systemctl disable name.service
    #查看所有服务的开机自启状态,相当于chkconfig --list
    systemctl list-unit-files --type service
    #用来列出该服务在哪些运行级别下启用和禁用:chkconfig –list name
    ls /etc/systemd/system/*.wants/name.service
    #查看服务是否开机自启:
    systemctl is-enabled name.service
    #列出失败的服务
    systemctl --failed --type=service
    #开机并立即启动或停止
    systemctl enable --now postfix
    systemctl disable  --now postfix
    #查看服务的依赖关系:
    systemctl list-dependencies name.service
    #杀掉进程:
    systemctl kill unitname

    #ssh服务停止之后远程已经连接的端口不会断,重启之后不会在连接
    systemctl mask postfix 禁用服务,禁用之后无法重启服务
    systemctl unmask postfix 关闭mask
    ln -s /dev/null /etc/systemd/system/postfix 创建软连接(mask 相当于创建了软链接)

    服务状态
    #显示状态
    systemctl list-unit-files --type service --all

    loaded Unit配置文件已处理
    active(running) 一次或多次持续处理的运行
    active(exited) 成功完成一次性的配置
    active(waiting) 运行中,等待一个事件
    inactive 不运行
    enabled 开机启动
    disabled 开机不启动
    static 开机不启动,但可被另一个启用的服务激活
    indirect 重定向到别处

    #显示所有单元状态
    systemctl 或 systemctl list-units
    #只显示服务单元的状态
    systemctl --type=service
    #显示sshd服务单元
    systemctl –l status sshd.service
    #验证sshd服务当前是否活动
    systemctl is-active sshd
    #启动,停止和重启sshd服务
    systemctl start sshd.service
    systemctl stop sshd.service
    systemctl restart sshd.service
    #重新加载配置
    systemctl reload sshd.service
    #列出活动状态的所有服务单元
    systemctl list-units --type=service
    #列出所有服务单元
    systemctl list-units --type=service --all
    #查看服务单元的启用和禁用状态
    systemctl list-unit-files --type=service
    #列出依赖的单元
    systemctl list-dependencies sshd
    验证sshd服务是否开机启动
    systemctl is-enabled sshd
    禁用network,使之不能自动启动,但手动可以
    systemctl disable network
    #启用network
    systemctl enable network
    #禁用network,使之不能手动或自动启动
    systemctl mask network
    #启用network
    systemctl unmask network

    service unit文件格式
    /etc/systemd/system:系统管理员和用户使用
    /usr/lib/systemd/system:发行版打包者使用
    帮助参考:
    systemd.directives(7),systemd.unit(5),systemd.service(5), systemd.socket(5),
    systemd.target(5),systemd.exec(5)
    unit 格式说明:
    以 “#” 开头的行后面的内容会被认为是注释
    相关布尔值,1、yes、on、true 都是开启,0、no、off、false 都是关闭
    时间单位默认是秒,所以要用毫秒(ms)分钟(m)等须显式说明
    service unit file文件通常由三部分组成:
    [Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等
    [Service]:与特定类型相关的专用选项;此处为Service类型
    [Install]:定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项
    Unit段的常用选项:
    Description:描述信息
    After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反
    Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活
    Wants:依赖到的其它units,弱依赖
    Conflicts:定义units间的冲突关系

    #[root@centos8 ~]#head -n 5 /lib/systemd/system/postfix.service
    [Unit]
    Description=Postfix Mail Transport Agent
    After=syslog.target network.target
    Conflicts=sendmail.service exim.service

    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服务意外终止后,会再次自动启动此服务
    PrivateTmp:设定为yes时,会在生成/tmp/systemd-private-UUID-NAME.service-XXXXX/tmp/目录

    Install段的常用选项:
    Alias:别名,可使用systemctl command Alias.service
    RequiredBy:被哪些units所依赖,强依赖
    WantedBy:被哪些units所依赖,弱依赖
    Also:安装本服务的时候还要安装别的相关服务
    注意:对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启
    systemctl daemon-reload

    运行级别
    target units:相当于CentOS 6之前的runlevel ,unit配置文件:.target
    ls /usr/lib/systemd/system/*.target
    systemctl list-unit-files --type target --all
    和运行级别对应关系
    0 ==> runlevel0.target, poweroff.target
    1 ==> runlevel1.target, rescue.target
    2 ==> runlevel2.target, multi-user.target
    3 ==> runlevel3.target, multi-user.target
    4 ==> runlevel4.target, multi-user.target
    5 ==> runlevel5.target, graphical.target
    6 ==> runlevel6.target, reboot.target
    查看依赖性
    systemctl list-dependencies graphical.target
    级别切换:相当于 init N
    systemctl isolate name.target
    进入默认target
    systemctl default

    注意:只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切换(修改文件需执行systemctl
    daemon-reload才能生效,或者init q 也可使文件生效 )

    获取默认运行级别: 相当于查看 /etc/inittab
    systemctl get-default
    修改默认级别:相当于修改 /etc/inittab
    systemctl set-default name.target
    切换至紧急救援模式:
    systemctl rescue
    切换至emergency模式:
    systemctl emergency
    说明:rescue.target 比emergency 支持更多的功能,例如日志等
    传统命令init,poweroff,halt,reboot都成为 systemctl的软链接

    #关机
    systemctl halt、systemctl poweroff
    #重启:
    systemctl reboot
    #挂起:
    systemctl suspend
    #休眠:
    systemctl hibernate
    #休眠并挂起:
    systemctl hybrid-sleep

    CentOS 7之后版本引导顺序
    1. UEFi或BIOS初始化,运行POST开机自检
    2. 选择启动设备
    3. 引导装载程序, centos7是grub2,加载装载程序的配置文件:
    /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需要的服务
    通过systemd-analyze 工具可以了解启动的详细过程

    设置内核参数
    设置内核参数,只影响当次启动
    启动时,到启动菜单,按e键,找到在linux 开头的行后添加systemd.unit=desired.target
    比如:systemd.unit=emergency.target 或 systemd.unit=rescue.target

    破解 CentOS 7和8的 root 密码
    方法一
    启动时任意键暂停启动
    按e键进入编辑模式
    将光标移动linux 开始的行,添加内核参数rd.break
    按ctrl-x启动
    mount –o remount,rw /sysroot
    chroot /sysroot
    passwd root
    #如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行
    touch /.autorelabel
    exit
    reboot
    方法二
    启动时任意键暂停启动
    按e键进入编辑模式
    将光标移动linux 开始的行,改为rw init=/sysroot/bin/sh
    按ctrl-x启动
    chroot /sysroot
    passwd root
    #如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行
    touch /.autorelabel
    exit
    reboot

    实现GRUB2安全
    #添加grub密码
    grub2-setpassword
    #清空grub密码
    cat /dev/null > /boot/grub2/user.cfg

    修复GRUB2
    GRUB2:CentOS 7,8及ubuntu1804都使用
    引导提示时可以使用命令行界面,可从文件系统引导
    主要配置文件:/boot/grub2/grub.cfg
    修复配置文件:grub2-mkconfig > /boot/grub2/grub.cfg

    grub2-install /dev/sda #BIOS环境
    grub2-install #UEFI环境


    加载kernel
    /boot/grub/ 中存放的都是1.5阶段备份文件
    /boot/grub/grub.cof (菜单文件,记录了内核的路径)
    rpm -ql /boot/grub/grub.cof 文件不属于任何包,临时安装生成的
    /boot 下存放内核文件(grub.cof中grub 默认boot为根)
    #文件系统存放在/lib/ 下,因此grub.cof 无法调用内核,于是将文件系统可存放在/boot/initramfs 中
    /boot/initramfs 为gz 压缩文件 ,需解压缩
    cpio -tv /boot/initramfs 预览
    cpio -i 解包
    /boot/initramfs (简化版操作系统根,内有文件系统)

    例:1.删除/boot/initramfs无法启动,故障恢复
    mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
    2.删除/boot/vmlinuz(内核文件)无法启动
    光盘中/mnt/cdrom/isolinux/vmlinuz 文件为内核文件,可将光盘中内核文件复制即可
    3.若grub文件中内核信息错误,无法启动,可在启动界面用grub(为交互式)进行修改
    在启动界面用grub 修改内核信息第二行后面加1或者S或者s 重启即可进入单用户模式
    单用户模式可用于破解口令(grub可进行加密)
    4.误删除/boot目录,故障恢复
    内核和grub都被破坏
    先修复内核,在修复grub
    修复内核即找回initramfs,vmlinuz 两个文件
    修复grub需要grub-install ,其中的grub.cof文件不会生成,需要手动添加

    rpm -ivh /mnt/cdrom/Packages/kernel- .rpm --root=/mnt/ssimage/ --force

    init 进程初始化
    路径/sbin/init
    rpm -qf /sbin/init 查看包来源(不同版本包不同,upstart为centos6版本) 来自upstart
    rpm -qi upstart 查看包信息
    rpm -ql upstart 查看包文件

    /etc/inittab
    runlevel 查看切换状态模式
    /etc/rc*.d/ 目录下k开头(stop)和s开头(start)文件
    /etc/rc*.d/ 的文件为软链接,指向/etc/init.d/、
    ntsysv 可修改服务
    chkconfig --list 可列出服务状态
    chkconfig --level 35 atd off 将atd服务35关闭
    chkconfig --del 删除服务
    chkconfig atd on 默认开启服务2345模式
    service iptables stop 服务关闭
    service atd status 查看服务状态
    设置脚本
    #!/bin/bash
    chkconfig: - 98 3
    description: test service
    . /etc/init.d/functions

    start (){
    touch /var/lock/subsys/testservice
    action "Starting testservice:"
    }
    stop (){
    rm -f /var/lock/subsys/testservice
    action "Stopping testservice:"
    }
    testart(){
    stop
    start
    }
    status(){
    if [ -f /var/lock/subsys/testservice ];then
    echo
    else
    echo
    fi
    }
    case $1 in
    start)
    start
    ;;
    stop)
    stop
    ;;
    restart)
    restart
    ;;
    status)
    status
    ;;
    *)
    echo " "
    esac

    bash -n testservice 检查语法错误
    service testservice start 开启服务
    chkconfig --list 查看服务列表
    chkconfig --list testservice 加入服务列表
    ls /etc/rc*.d/testservice -l 查看服务是否形成软链接

    初始化脚本
    /etc/init/rsC.conf
    /ec/init/rc.conf 调用rc脚本
    /etc/rc.d/rc.local S99local 运行的最后脚本,软链接没在init.d(开机运行文件)
    echo /etc/init.d/testservice > /etc/rc.d/rc.local (将服务直接写入文件,开机就会启动)

    超级服务进程(非独立服务)
    yum info xinetd 超级服务,监听代理不常用服务
    telnet 用于远程登录服务,不常用,非独立服务,不安全,明文用户口令
    chkconfig --list 查看超级服务
    /etc/xinetd
    chkconfig telnet off 禁用
    telnet (23端口)
    ss -ntl 查看端口号
    另一台主机访问 :telnet 10.0.0.6

    自制Linux系统

    ethtool -i eth0 查看网卡驱动
    modinfo -n ec1000 查看驱动文件

  • 相关阅读:
    关于s3c6410 实现opengl的分析
    ARM9和ARM11的区别
    ARM9E 和 cortex a8 NEON 优化效率的对比
    armv6 的特点
    AMBA总线新一代标准AXI分析和应用
    linux下如何模拟按键输入和模拟鼠标
    opengl es 学习
    Jlink初使用
    Allegro 制作金手指封装
    世界之窗浏览器设置google搜索[转]
  • 原文地址:https://www.cnblogs.com/llliuhuiii/p/12900322.html
Copyright © 2020-2023  润新知