Linux启动和内核管理

文章目录

CentOS 6的启动管理

1.1 Linux组成

  • kernel实现进程管理,内存管理,网络管理,驱动程序,文件系统,安全功能等功能
  • rootfs包括程序和glibc库
    程序:二进制执行文件
    库:函数集合,function,调用接口(头文件负责描述)

1.2 内核设计流派

  • 宏内核(monolithic kernel):又称单内核和强内核,unix,Linux
    把所有系统服务都放到内核里,所有功能集成于同一个程序,分层实现不同功能,系统庞大复杂,Linux其实在单内核实现了模块化,也就相当于吸收了微内核的优点
  • 微内核(micro kernel):Windows,Solaris,HarmonyOS
    简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护,每种功能使用一个单独子系统实现,将内核功能移到用户空间,性能差

1.3 CentOS 6 启动流程

1.3.1 CentOS 6 启动流程

在这里插入图片描述

  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.3.1 硬件启动POST

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

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

主板的RAM:CMOS互补金属氧化物半导体,保存各项参数的设定,按次序查找引导设备,第一个有引导程序的设备为本次启动设备

1.3.2 启动加载器 bootloader
1.3.2.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/
1.3.2.2 CentOS 6 grub 安装

安装grub:
(1)grub-install安装grub stage 1和stage 1_5到/dev/DISK磁盘上,并复制GRUB相关文件到DIR/boot目录下

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

(2)grub

grub> root (hd#,#)
grub> setup (hd#)

范例:修复grub的第1阶段故障

[root@centos6 grub]#hexdump -C  -n 512 /dev/sda 
#破坏grub第1阶段
[root@centos6 grub]#dd if=/dev/zero of=/dev/sda bs=446 count=1
[root@centos6 grub]#hexdump -C -n 512 /dev/sda
[root@centos6 grub]#hexdump -C -n 512 /dev/sda -v
[root@centos6 grub]#reboot
#无法启动,出现下面提示
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200827214207231.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tpbmdkb21feHU=,size_16,color_FFFFFF,t_70#pic_center)
光盘启动,进入rescue模式
#chroot /mnt/sysimage
#grub-install /dev/sda
#sync
#sync
#exit

范例:修复grub的第1.5阶段故障

[root@centos6 ~]#dd if=/dev/zero of=/dev/sda bs=446 count=1
[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
#无法启动,显示下面界面
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200827214828181.png#pic_center)
光盘启动.进入rescue模式
#chroot  /mnt/sysimage
#grub-install /dev/sda
#sync
#按 Ctrl+alt+delete 三个键重启
1.3.2.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”命令 

范例: 给grub 添加密码,防止破解root密码

[root@centos6 ~]#grub-crypt
Password:
Retype password:
$6$RedtvBe0D0sM8yKq$yKwmmnHSDb9wDRUuZbC3H1ZNwIlf/Mh88MXa3JzXloXyy0hXIxFwLIoMdgmY
FfkWXxkP.vW3ypIla4P5zUKuT.

[root@centos6 ~]#vim /boot/grub/grub.conf
default=0
timeout=5
password --encrypt
$6$RedtvBe0D0sM8yKq$yKwmmnHSDb9wDRUuZbC3H1ZNwIlf/Mh88MXa3JzXloXyy0hXIxFwLIoMdgmY
FfkWXxkP.vW3ypIla4P5zUKuT.
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-754.el6.x86_64) 

范例:生成背景图片

[root@centos6 ~]#convert -resize 640x480 -colors 14 winner.png splash.xpm
[root@centos6 ~]#more splash.xpm
#生成splash.xpm.gz
[root@centos6 ~]#gzip splash.xpm
[root@centos6 ~]#mv splash.xpm.gz /boot/grub
1.3.3 加载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
    范例:误删除内核文件/boot/vmlinuz-2.6.32-754.e16.x86_64无法启动,故障恢复
[root@centos6 ~]#rm -f /boot/vmlinuz-2.6.32-754.el6.x86_64
[root@centos6 ~]#reboot
#进入rescue模式
#chroot /mnt/sysimage
#mount /dev/sr0 /mnt/
#cp /mnt/isolinux/vmlinuz /boot/vmlinuz-2.6.32-754.el6.x86_64
#sync
#exit
#reboot 

ramdisk文件的制作:

  • mkinitrd命令
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
  • dracut命令
dracut /boot/initramfs-$(uname -r).img $(uname -r)

范例:误删除/boot/initramfs-2.6.32-754.e16.x86_64.img无法启动,故障恢复

[root@centos6 ~]#rm -f /boot/initramfs-2.6.32-754.el6.x86_64.img
[root@centos6 ~]#reboot
#进入rescue模式
#chroot /mnt/sysimage
#mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
#sync
#exit
#exit
#reboot 
1.3.4 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

1.3.4.1 运行级别

运行级别:为系统运行或维护等目的而设定;0-6:7各级别,一般使用3,5为默认级别

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

切换级别:

init #

查看级别

runlevel
who -r

定义运行级别

/etc/inittab

CentOS 5 的inittab文件还定义以下内容

初始运行级别(RUN LEVEL)
系统初始化脚本
对应运行级别的脚本目录
捕获某个关键字顺序
定义UPS电源终端/恢复脚本
在虚拟控制台生成getty
在运行级别5初始化X 					

CentOS 5 的inittab文件每一行格式:

id:runlevel:action:process
id:是惟一标识该项的字符序列
runlevels: 定义了操作所使用的运行级别
action: 指定了要执行的特定操作
wait: 切换至此级别运行一次
respawn:此process终止,就重新启动之
initdefault:设定默认运行级别;process省略
sysinit:设定系统初始化方式
process:定义了要执行的进程 

范例:CentOS 5 的inittab文件

id:5:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down”
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled”
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
x:5:respawn:/etc/X11/prefdm -nodaemon 

CentOS 6 /etc/inittab和相关文件
CentOS 6 init程序为 upstart, 其配置文件/etc/inittab, /etc/init/*.conf,配置文件的语法 遵循 upstart配置文件语法格式,和CentOS5不同

/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 
1.3.4.2 初始化脚本 sysinit
/etc/rc.d/rc.sysinit
[root@centos6 ~]#cat /etc/init/rcS.conf

系统初始化脚本功能

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

service 命令:手动管理服务

service 服务 start|stop|restart
service --status-all

/etc/rc.d/rc 控制服务脚本的开机自动运行

for srv in /etc/rc.d/rcN.d/K*; do
$srv stop
done
for srv in /etc/rc.d/rcN.d/S*; do
$srv start
done 

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

  • chkconfig命令
  • ntsysv命令
    chkconfig 命令管理服务
#查看服务在所有级别的启动或关闭设定情形:
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

范例:

[root@centos6 ~]#vim /etc/init.d/testsrv
[root@centos6 ~]#cat /etc/init.d/testsrv
#!/bin/bash
#chkconfig: - 96 3
#description: test serivce script
. /etc/init.d/functions
start(){
   touch /var/lock/subsys/testsrv
   action "Starting testsrv"
   echo PATH=$PATH
   sleep 3
}
stop() {
   rm -f /var/lock/subsys/testsrv
   action "Shutting down testsrv"
}
restart(){
   stop
   start
}
status(){
   if [ -e /var/lock/subsys/testsrv ] ;then
   	echo "testsrv is running..."
   else
   	echo "testsrv is stopped"
fi
}
case $1 in
start)
   start
   ;; 
stop)
   stop
   ;;
restart)
   restart
   ;;
status)
   status
   ;;
*)
   echo "Usage: /etc/init.d/testsrv {start|stop|restart|status}"
   ;;
esac
[root@centos6 ~]#chmod +x /etc/init.d/testsrv
[root@centos6 ~]#chkconfig --add testsrv
[root@centos6 ~]#chkconfig --list testsrv
testsrv 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@centos6 ~]#chkconfig --del testsrv
1.3.4.4 非独立服务

服务分为独立服务和非独立服务
瞬态(Transient)服务被超级守护进程 xinetd 进程所管理,也称为非独立服务
进入的请求首先被xinetd代理
配置文件:

/etc/xinetd.conf
/etc/xinetd.d/<service> 

用chkconfig控制非独立服务开机启动
示例:chkconfig tftp on

1.3.4.5 开机启动文件 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在指定运行级别脚本后运行

1.3.5 CentOS 启动过程总结

/sbin/init --> (/etc/inittab) --> 设置默认运行级别 --> 运行系统初始本/etc/rc.d/rc.sysinit、完成系统初始化 --> (关闭对应下需要关闭的服务)启动需要启动服务/etc/rc#.d/Sxxxx,/etc/rc.d/rc.local–> 设置登录终端
参考:http://s4.51cto.com/wyfs02/M02/87/20/wKiom1fVBELjXsvaAAUkuL83t2Q304.jpg
在这里插入图片描述

1.4 自制Linux系统

1.4.1 分区并创建文件系统
#分两个必要的分区,/dev/sdb1对应/boot /dev/sdb2对应根 /
[root@centos6 ~]#echo -e 'n\np\n1\n\n+1G\nw\n' | fdisk /dev/sdb
[root@centos6 ~]#echo -e 'n\np\n2\n\n\n\nw\n' | fdisk /dev/sdb
[root@centos6 ~]#mkfs.ext4 /dev/sdb1
[root@centos6 ~]#mkfs.ext4 /dev/sdb2 
1.4.2 挂载boot
#子目录必须为boot
[root@centos6 ~]#mkdir /mnt/boot
[root@centos6 ~]#mount /dev/sdb1 /mnt/boot 
1.4.3 安装grub
[root@centos6 ~]#grub-install --root-directory=/mnt/ /dev/sdb
1.4.4 准备内核和initramfs文件
[root@centos6 ~]#cp /boot/vmlinuz-2.6.32-754.el6.x86_64 /mnt/boot/vmlinuz
[root@centos6 ~]#cp /boot/initramfs-2.6.32-754.el6.x86_64.img
/mnt/boot/initramfs.img 
1.4.5 建立grub.conf
[root@centos6 ~]#cat /mnt/boot/grub/grub.conf
default=0
timeout=6
title wang linux
root (hd0,0)
kernel /vmlinuz root=/dev/sda2 selinux=0 init=/bin/bash
initrd /initramfs.img
[root@centos6 ~]#tree /mnt/boot
/mnt/boot
├── grub
│ ├── device.map
│ ├── e2fs_stage1_5
│ ├── fat_stage1_5
│ ├── ffs_stage1_5
│ ├── grub.conf
│ ├── iso9660_stage1_5
│ ├── jfs_stage1_5
│ ├── minix_stage1_5
│ ├── reiserfs_stage1_5
│ ├── stage1
│ ├── stage2
│ ├── ufs2_stage1_5
│ ├── vstafs_stage1_5
│ └── xfs_stage1_5
├── initramfs.img
├── lost+found
└── vmlinuz
2 directories, 16 files 
1.4.6 准备根下面相关程序和库
[root@centos6 ~]#mkdir /mnt/sysroot
[root@centos6 ~]#mount /dev/sdb2 /mnt/sysroot
[root@centos6 ~]#mkdir –pv
/mnt/sysroot/{boot,dev,sys,proc,etc,bin,sbin,tmp,var,usr,,home,root,lib,lib64,op
tmnt,media}

#busybox:bin,dev,etc,home,proc,root,sys,tmp,usr,var

#复制bash等命令和相关库文件,如:
bash,ifconfig,insmod,ping,mount,ls,cat,df,lsblk,blkid,tree,fdisk

[root@centos6 ~]#mkdir /mnt/sysroot/{dev,proc,etc,sys,lib,home,root}

#准备网卡驱动
[root@centos6 ~]#ethtool -i eth0
driver: e1000
version: 7.3.21-k8-NAPI
firmware-version:
bus-info: 0000:02:01.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no
[root@centos6 ~]#modinfo -n e1000
/lib/modules/2.6.32-754.el6.x86_64/kernel/drivers/net/e1000/e1000.ko

[root@centos6 ~]#cp /lib/modules/2.6.32-
754.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/
[root@centos6 ~]#chroot /mnt/sysroot
1.4.7 准备新的虚拟机

将前一虚拟机sdb硬盘对应的vmdk文件增加进去,删除原有磁盘,开机启动
在这里插入图片描述

1.5 启动过程的故障排错

1.5.1 实战案例
故障: 删除 /sbin/init 无法启动
恢复过程

1 先进入grub菜单,在kernel参数后加 selinux=0 init=/bin/bash
2 mount -o remount,rw /
3 mount /dev/sr0 /mnt/
4 rpm2cpio /mnt/Packages/upstart.xxx.rpm | cpio -idv ./sbin/init
5 mv ./sbin/init /sbin/
1.5.2 实战案例

故障:rm -rf /boot/* 和 /etc/fstab 进行恢复
恢复过程
1.用光盘进入 rescue mode,找到/ 所在分区并恢复/etc/fstab
在这里插入图片描述

fdisk -l
mkdir /mnt/rootdir
mount /dev/sdaN /mnt/rootdir
ls /mnt/rootdir
mount /dev/sda2 /mnt/rootdir

vim /mnt/rootdir/etc/fstab
/dev/sda1 /boot ext4 defaults 0 0
/dev/sda2 / ext4 defaults 0 0
/dev/sda3 /data ext4 defaults 0 0
/dev/sda5 swap swap defaults 0 0

reboot 

2.rescue mode 恢复内核和initrd文件
/dev/sda2 --> /mnt/sysimage

chroot /mnt/sysimage
mount /dev/sr0 /mnt/

#方法1
rpm -ivh /mnt/Packages/kernel.xxxx.rpm --force

#方法2
cp /mnt/isolinux/vmlinuz /boot/
mkinitrd /boot/initramfs.img `uname -r` 	

3.修复 grub

grub-install /dev/sda
vim /boot/grub/grub.conf
cat /boot/grub/grub.conf
default=0
timeout=5
title centos
kernel /vmlinuz root=/dev/sda2
initrd /initramfs.img

4.reboot

2 /proc目录和内核参数管理

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

  • 只读:只用于输出信息
  • 可写:可接受用户指定“新值”来实现对内核某功能或特性的配置
    /proc/sys 设置
  • sysctl命令用于查看或设定此目录中诸多参数
sysctl -w path.to.parameter=VALUE
  • 默认配置文件:/etc/sysctl.conf 及以下文件
/run/sysctl.d/*.conf
/etc/sysctl.d/*.conf
/usr/local/lib/sysctl.d/*.conf
/usr/lib/sysctl.d/*.conf
/lib/sysctl.d/*.conf
/etc/sysctl.conf 

范例:

sysctl -w kernel.hostname=mail.magedu.com
  • echo命令通过重定向方式也可以修改大多数参数的值
echo "VALUE" > /proc/sys/path/to/parameter

范例:

echo “websrv” > /proc/sys/kernel/hostname

sysctl命令:
(1) 临时设置某参数

sysctl -w parameter=VALUE

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

sysctl -p [/path/to/conf_file]

(3) 查看指定参数当前值

sysctl [/path/to/conf_file]

(4) 查看所有生效参数

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 

范例:

[root@centos8 ~]#cat /proc/sys/net/ipv4/icmp_echo_ignore_all
0
[root@centos8 ~]#vim /etc/sysctl.d/test.conf
[root@centos8 ~]#cat /etc/sysctl.d/test.conf
net.ipv4.icmp_echo_ignore_all=1
[root@centos8 ~]#sysctl -p /etc/sysctl.d/test.conf
net.ipv4.icmp_echo_ignore_all = 1
[root@centos8 ~]#cat /proc/sys/net/ipv4/icmp_echo_ignore_all
1 

3 /sys 目录

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

4 内核模块管理和编译

单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制
内核组成部分:
kernel:内核核心,一般为bzlmage,通常在/boot目录下
名称为vmlinuz-VERSION-RELEASE
kernel object:内核对象,一般放置于/lib/modules/VERSION-RELEASE/

辅助文件:ramdisk
	initrd:从CentOS 5版本以前
	initramfs:从CentOS 6版本以后

4.1 内核版本

运行中的内核:
uname命令:print system information

uname [OPTION] ...

常用选项:

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

4.2 内核模块命令

lsmod命令:

  • 显示由内核核心已经装载的内核模块
  • 显示的内容来自于:/proc/modules文件
    范例:
[root@centos8 ~]#lsmod
Module Size Used by
uas 28672 0
usb_storage 73728 1 uas
nls_utf8 16384 0
isofs 45056 0

#显示:名称、大小,使用次数,被哪些模块依赖 			

modinfo命令:
功能:管理内核模块
配置文件:/etc/modprobe.conf,/etc/modprobe.d/*.conf

  • 显示模块的详细描述信息
modinfo [ -k kernel ] [ modulename|filename... ]

常用选项:

-n:只显示模块文件路径
-p:显示模块参数
-a:作者
-d:描述

范例:

[root@centos8 ~]#lsmod |grep xfs
xfs 1474560 2
libcrc32c 16384 1 xfs
[root@centos8 ~]#modinfo xfs 
  • 装载或卸载内核模块
modprobe [ -C config-file ] [ modulename ] [ module parame-ters... ]
modprobe [ -r ] modulename… 

范例:

[root@centos8 ~]#lsmod |grep usb 
btusb 53248 0
btrtl 16384 1 btusb
btbcm 16384 1 btusb
btintel 24576 1 btusb
bluetooth 630784 5 btrtl,btintel,btbcm,btusb
[root@centos8 ~]#modprobe usb_storage
[root@centos8 ~]#lsmod |grep usb
usb_storage 73728 0
btusb 53248 0
btrtl 16384 1 btusb
btbcm 16384 1 btusb
btintel 24576 1 btusb
bluetooth 630784 5 btrtl,btintel,btbcm,btusb
[root@centos8 ~]#modprobe -r usb_storage
[root@centos8 ~]#lsmod |grep uas

#因为uas依赖usb_storage,安装uas会自动加载usb_storage
[root@centos8 ~]#modprobe uas
[root@centos8 ~]#lsmod |grep usb
usb_storage 73728 1 uas
btusb 53248 0
btrtl 16384 1 btusb
btbcm 16384 1 btusb
btintel 24576 1 btusb
bluetooth 630784 5 btrtl,btintel,btbcm,btusb
[root@centos8 ~]#lsmod |grep -E 'usb|uas'
uas 28672 0
usb_storage 73728 1 uas
btusb 53248 0
btrtl 16384 1 btusb
btbcm 16384 1 btusb
btintel 24576 1 btusb
bluetooth 630784 5 btrtl,btintel,btbcm,btusb

#因为uas依赖usb_storage,无法直接卸载usb_storage
[root@centos8 ~]#modprobe -r usb_storage
modprobe: FATAL: Module usb_storage is in use.

#先卸载uas,再卸载usb_storage
[root@centos8 ~]#modprobe -r uas
[root@centos8 ~]#modprobe -r usb_storage

depmod命令:内核模块依赖关系文件及系统信息映射文件的生成工具
insmode命令:可以安装模块,需要指定模块文件路径,并且不自动解决依赖模块

insmod  [ filename ] [ module options... ]

范例:

insmod `modinfo –n exportfs`
insmod `modinfo –n xfs` 

rmmod命令:卸载模块

rmmod [ modulename ]

范例:

rmmod xfs
rmmod exportfs 

4.3 编译内核

编译安装内核环境:
(1)准备好开发环境
(2)获取目标主机上硬件设备的相关信息
(3)获取目标主机系统功能的相关信息,例如:需要启用相应的文件系统
(4)获取内核源代码包,www.kernel.org

4.3.1 编译准备
4.3.1.1 目标主机硬件设备相关信息

CPU:

cat /proc/cpuinfo
x86info -a
lscpu

PCI设备:lspci -v , -vv

[root@centos8 ~]#lspci

USB设备:lsusb -v,-vv

[root@centos8 ~]#dnf install usbutils -y
[root@centos8 ~]#lsusb 
[root@centos8 ~]#lsmod |grep usb

lsblk 块设备
全部硬件设备信息:hal-device:CentOS 6

4.3.1.2 开发环境相关包

gcc make ncurses-devel flex bison openssl-devel elfutils-libelf-devel

4.3.1.3 内核编译安装实现
  • 下载源码文件
  • 准备文本配置文件/boot/config-uname -r
  • make menuconfig:配置内核选项,相当于./configure
[  ]:N
[M]:M
[*]:Y
  • make [-j #] 或者用以下两步实现:
    make -j # bzlmage
    make -j # modules
  • 安装模块:make modules_install
  • 安装内核相关文件:make install
    • 安装bzlmage为/boot/vmlinuz-VERSION-RELEASE
    • 生成initramfs文件
    • 编辑grub的配置文件
4.3.1.4 编译安装内核实战案例
[root@centos8 ~]#yum -y install gcc make ncurses-devel flex bison openssl-devel
elfutils-libelf-devel
[root@centos8 ~]#tar xf linux-5.4.13.tar.xz -C /usr/local/src
[root@centos8 ~]#cd /usr/local/src
[root@centos8 ~]#ln -sv linux-5.6.12 linux
[root@centos8 ~]#cd /usr/local/src/linux
[root@centos8 linux]#cp /boot/config-$(uname -r) ./.config
[root@centos8 linux]#vim .config
# CONFIG_MODULE_SIG is not set
CONFIG_SYSTEM_TRUSTED_KEYS=""
[root@centos8 linux]#make help
[root@centos8 linux]#make menuconfig
[root@centos8 linux]#make -j 2 #或者两步实现:make -j 2 bzImage ; make -j 2
modules
......
   LD [M] sound/xen/snd_xen_front.ko
   LD [M] virt/lib/irqbypass.ko

real 82m52.128s
user 133m37.982s
sys 25m46.311s
[root@centos8 linux]#pwd
/usr/local/src/linux
[root@centos8 linux]#du -sh .
15G .
[root@centos8 linux]#make modules_install
[root@centos8 linux]#ls /lib/modules
4.18.0-147.el8.x86_64 5.6.12-wanglinux-6.6.6	
[root@centos8 linux]#du -sh /lib/modules/5.6.12-wanglinux-6.6.6/
3.5G /lib/modules/5.6.12-wanglinux-6.6.6/
[root@centos8 linux]#make install
[root@centos8 linux]#ls /boot
config-4.18.0-147.el8.x86_64
efi
grub2
initramfs-0-rescue-5b85fc7444b240a992c42ce2a9f65db5.img
initramfs-4.18.0-147.el8.x86_64.img
initramfs-4.18.0-147.el8.x86_64kdump.img
initramfs-5.6.12-wanglinux-6.6.6.img
loader
lost+found
System.map
System.map-4.18.0-147.el8.x86_64
System.map-5.6.12-wanglinux-6.6.6
vmlinuz
vmlinuz-0-rescue-5b85fc7444b240a992c42ce2a9f65db5
vmlinuz-4.18.0-147.el8.x86_64
vmlinuz-5.6.12-wanglinux-6.6.6
[root@centos8 ~]#ls /boot/loader/entries/
5b85fc7444b240a992c42ce2a9f65db5-0-rescue.conf
5b85fc7444b240a992c42ce2a9f65db5-4.18.0-147.el8.x86_64.conf
5b85fc7444b240a992c42ce2a9f65db5-5.6.12-wanglinux-6.6.6.conf
[root@centos8 ~]#cat /boot/loader/entries/5b85fc7444b240a992c42ce2a9f65db5-
5.6.12-wanglinux-6.6.6.conf
title CentOS Linux (5.6.12-wanglinux-6.6.6) 8 (Core)
version 5.6.12-wanglinux-6.6.6
linux /vmlinuz-5.6.12-wanglinux-6.6.6
initrd /initramfs-5.6.12-wanglinux-6.6.6.img $tuned_initrd
options $kernelopts $tuned_params
id centos-20200513060531-5.6.12-wanglinux-6.6.6
grub_users $grub_users
grub_arg --unrestricted
grub_class kernel
[root@centos8 ~]#reboot
[root@centos8 ~]#uname -r
5.6.12-wanglinux-6.6.6

在这里插入图片描述

4.3.1.4 内核编译说明

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”
2.编译内核

  • 全编译
   make [-j #]
  • 编译内核的一部分功能:
    (a)只编译某子目录中的相关代码
    cd /usr/local/src/linux;mkdir dir/
    
    (b)只编译一个特定的模块
    cd /usr/local/src/linux;make dir/file.ko
    
    范例:只为e1000编译驱动:
    make drivers/net/ethernet/intel/e1000/e1000.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以及编辑器备份文件
4.3.1.5 卸载内核
  • 删除/usr/src/linux/目录下不需要的内核源码
  • 删除/lib/modules/目录下不需要的内核库文件
  • 删除/boot目录下启动的内核和内核映像文件
  • 更改grub的配置文件,删除不需要的内核启动列表 grub2-mkconfig -o /boot/grub2/grub.cfg
  • CentOS 8 还需要删除 /boot/loader/entries/5b85fc7444b240a992c42ce2a9f65db5-新内核版本.conf

5 Busybox

5.1 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/

5.2 Busybox使用

busybox 的编译过程与Linux内核的编译类似
busybox的使用有三种方式:

  • busybox后直接跟命令,如 busybox ls
  • 直接将busybox重命名,如 cp busybox tar
  • 创建符号链接,如 ln -s busybox rm
    busybox的安装
    以上方法中,第三种方法最方便,但为busybox中每个命令都创建一个软链接,相当费事,busybox提供自动方法:busybox编译成功后,执行make install,则会产生一个_install目录,其中包含了busybox及每个命令的软链接

5.3 busybox编译安装

[root@centos7 ~]#yum -y install gcc gcc-c++ glibc glibc-devel make pcre pcredevel
openssl openssl-devel systemd-devel zlib-devel glibc-static ncurses-devel

[root@centos7 ~]#wget https://busybox.net/downloads/busybox-1.31.1.tar.bz2

[root@centos7 ~]#tar xvf busybox-1.31.1.tar.bz2
[root@centos7 ~]#cd busybox-1.31.1/
[root@centos7 busybox-1.31.1]#make menuconfig 
#按下面选择,把busybox编译为静态二进制、不用共享库:Settings -->Build Options -->[*] Build static binary (no shared libs)

[root@centos7 busybox-1.31.1]#make && make install 
#如果出错,执行make clean后,重新执行上面命令
[root@centos7 busybox-1.31.1]#pwd
/root/busybox-1.31.1
[root@centos7 busybox-1.31.1]#ls 
[root@centos7 busybox-1.31.1]#ll busybox -h
-rwxr-xr-x 1 root root 2.6M May 13 14:46 busybox
[root@centos7 busybox-1.31.1]#ls _install/
bin linuxrc sbin usr
[root@centos7 busybox-1.31.1]#ls _install/bin
[root@centos7 busybox-1.31.1]#find _install/ -type l |wc -l
396
[root@centos7 busybox-1.31.1]#du -sh _install/
2.6M _install/

[root@centos7 busybox-1.31.1]#mkdir /mnt/sysroot/
[root@centos7 busybox-1.31.1]#cp -a _install/* /mnt/sysroot/

在这里插入图片描述

6 systemd

6.1 systemd 特性

Systemd:从 CentOS 7 版本之后开始用 systemd 实现init进程,系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程
Systemd新特性

  • 系统引导时实现服务并行启动
  • 按需启动守护进程
  • 自动化的服务依赖关系管理
  • 同时采用socket式与D-Bus总线式激活服务
  • socket与服务程序分离
  • 向后兼容sysv init脚本
  • 使用systemctl 命令管理,systemctl命令固定不变,不可扩展,非由systemd启动的服务,systemctl无法与之通信和控制
  • 系统状态快照
    systemd核心概念:unit
    unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听
    socket、保存的系统快照以及其它与init相关的信息
    Unit类型:
#查看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的功能,比上面目录优先运行 

6.2 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

服务状态

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

范例:systemctl 命令示例

#显示所有单元状态 
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

6.3 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

范例: 自定义service的unit文件

[root@centos8 ~]#vim /lib/systemd/system/hello.service
[Unit]
Description=Hello World
[Service]
TimeoutStartSec=0
ExecStart=/bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=kill sh
[Install]
WantedBy=multi-user.target 

[root@centos8 ~]#systemctl daemon-reload
[root@centos8 ~]#systemctl enable --now hello
[root@centos8 ~]#systemctl status hello

范例:服务Unit文件

[Unit]
Description=The Nginx HTTP Server daemon # 描述信息
After=network.target remote-fs.target nss-lookup.target # 指定启动nginx之前需要其他
的其他服务,如network.target等

[Service]
#Type为服务类型,仅启动一个主进程的服务为simple,需要启动若干子进程的服务为forking
Type=forking

#设置执行systemctl start nginx后需要启动的具体命令
ExecStart=/usr/local/nginx/sbin/nginx

#设置执行systemctl reload nginx后需要执行的具体命令
ExecReload=/usr/local/nginx/sbin/nginx -s reload

#设置执行systemctl stop nginx后需要执行的具体命令
ExecStop=/bin/kill -s QUIT ${MAINPID}

[Install]
#设置在什么模式下被安装,设置开机启动的时候需要
WantedBy=multi-user.target 

范例:服务Unit文件示例1

vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=java tomcat project
After=syslog.target network.target

[Service]
Type=forking
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat

[Install]
WantedBy=multi-user.target 

范例:服务Unit文件示例2

vim /etc/systemd/system/bak.service
[Unit]
Description=backup /etc
Requires=atd.service

[Service]
Type=simple
ExecStart=/bin/bash -c "echo /data/bak.sh | at now"

[Install]
WantedBy=multi-user.target

systemctl daemon-reload
systemctl start bak 

范例:Ubutun实现开机自动运行程序

[root@ubuntu1804 ~]#vim /etc/rc.local
[root@ubuntu1804 ~]#cat /etc/rc.local
#!/bin/bash
echo -e '\E[31;1mstarting test service\E[0m'
sleep 10
[root@ubuntu1804 ~]#chmod +x /etc/rc.local
[root@ubuntu1804 ~]#reboot 

6.4 运行级别

targets 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

范例:

#切换至字符模式
systemctl isolate multi-user.target 

注意:只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切换(修改文件需执行systemctl daemon-reload才能生效)
获取默认运行级别:相当于查看/etc/inittab

systemctl get-default

修改默认级别:相当于修改 /etc/inittab

systemctl set-default name.target

范例:

[root@centos8 ~]#systemctl set-default multi-user.target
[root@centos8 ~]#ls -l /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37 Nov 7 19:32 /etc/systemd/system/default.target ->
/lib/systemd/system/multi-user.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

范例:禁用ctrl+alt+delete 重启快捷键

[root@centos8 ~]#ls -l /lib/systemd/system/ctrl-alt-del.target
lrwxrwxrwx. 1 root root 13 May 23 2019 /lib/systemd/system/ctrl-alt-del.target
-> reboot.target
[root@centos8 ~]#systemctl mask ctrl-alt-del.target
Created symlink /etc/systemd/system/ctrl-alt-del.target → /dev/null.
[root@centos8 ~]#init q
[root@centos8 ~]#systemctl daemon-reload 

6.5 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 工具可以了解启动的详细过程
    范例:
[root@centos8 ~]#systemd-analyze blame 
   	1.862s kdump.service
   	1.047s tuned.service
   	666ms dracut-initqueue.service
   	523ms auditd.service
   	379ms initrd-switch-root.service
   	314ms sssd.service
   	302ms systemd-rfkill.service
   	219ms NetworkManager-wait-online.service
   	...

范例:生成网页

systemd-analyze plot > boot.html

在这里插入图片描述

6.6 设置内核参数

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

6.7 破解 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

6.8 实现GRUB2安全

在这里插入图片描述

#添加grub密码
[root@centos8 ~]#grub2-setpassword
Enter password:
Confirm password:
[root@centos8 ~]#ls -l /boot/grub2/
total 32
drwxr-xr-x 2 root root 4096 Jan 19 15:17 fonts
-rw-r--r-- 1 root root 5101 Jan 19 15:18 grub.cfg
-rw-r--r-- 1 root root 1024 Jan 19 15:18 grubenv
drwxr-xr-x 2 root root 12288 Jan 19 15:17 i386-pc
-rw------- 1 root root 298 Jan 19 18:20 user.cfg
[root@centos8 ~]#ls -l /boot/grub2/user.cfg
-rw------- 1 root root 298 Jan 19 18:20 /boot/grub2/user.cfg
[root@centos8 ~]#cat /boot/grub2/user.cfg
GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.60AAA29A65F4DC77E8861EF25BDE2034C9B30CE1E07EE688D7F30460E7E87E7356B0893A6DFFB250B27D2EB9D3ED3E9207199C494D7882E2E8C772C82E2DDB7A.5E42FD69FA04293DECD68F077E83875A8E4572A7FBB89BA9F161B15EAFE54FBA963FE5D52E16764944823396231803E5118DA1D9CAF3EB73C175A7D7A3682A90

#清空grub密码
[root@centos8 ~]#cat /dev/null > /boot/grub2/user.cfg

6.9 修复GRUB2

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

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

范例:调整默认启动内核

[root@centos8 ~]#cat /boot/grub2/grubenv
# GRUB Environment Block
saved_entry=5b85fc7444b240a992c42ce2a9f65db5-5.6.12-wanglinux-6.6.6
kernelopts=root=UUID=f7f53add-b184-4ddc-8d2c-5263b84d1e15 ro crashkernel=auto
resume=UUID=eebe3bc7-6d52-4ad9-86aa-916f1a123fd4 rhgb quiet net.ifnames=0
boot_success=0
##########################################################################
##########################################################################
##########################################################################
#########################################################################
#########################################################################
#########################################################################
#######################################################################
#######################################################################
#######################################################################
#######################################################################
####################################[root@centos8 ~]#cd
[root@centos8 ~]#ls /boot/loader/entries/
5b85fc7444b240a992c42ce2a9f65db5-0-rescue.conf
5b85fc7444b240a992c42ce2a9f65db5-4.18.0-147.el8.x86_64.conf
5b85fc7444b240a992c42ce2a9f65db5-5.6.12-wanglinux-6.6.6.conf

#以下命令是修改 /boot/grub2/grubenv 实现 
[root@centos8 ~]#grub2-set-default 1
#或者
[root@centos8 ~]#vim /etc/default/grub
GRUB_DEFAULT=1

在这里插入图片描述

6.10 故障排错实战案例

6.10.1 实战案例1:centos 7,8 破坏MBR后进行恢复
dd if=/dev/zero of=/dev/sda bs=1 count=446
光盘进入救援模式
grub2-install --root-directory=/mnt/sysimage /dev/sda 
6.10.2 实战案例2:entos 7 ,8删除/boot/grub2/*所有内容进行恢复

在这里插入图片描述

光盘进入救援模式
chroot /mnt/sysimage
grub2-install /dev/sda
grub2-mkconfig -o /boot/grub2/grub.cfg 
6.10.3 实战案例3:CentOS 7 ,8 删除/boot/下所有文件后进行恢复
1 光盘救援模式下安装grub2
特别说明:Centos8 必须先grub,再安装kernel,否则安装kernel-core时会提示grub出错
chroot /mnt/sysimage
mount /dev/sr0 /mnt
grub2-install /dev/sda

2安装Kernel
#CentOS 7 
rpm –ivh /mnt/Packages/kernel-3.10.0-1062.el7.x86_64.rpm --force

#CentOS 8
rpm -ivh /mnt/BaseOS/Packages/kernel-core-4.18.0-147.el8.x86_64.rpm --force

3修复grub配置文件
生成grub2.cfg文件
grub2-mkconfig –o /boot/grub2/grub.cfg

4 退出重启
exit
exit
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值