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 查看驱动文件

posted @ 2020-05-16 14:10  llliuhuiii  阅读(599)  评论(0编辑  收藏  举报