1 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 启动流程
加载 BIOS 的硬件信息, 获取第一个启动设备
读取第一个启动设备 MBR 的引导加载程序 (grub) 的启动信息
加载核心操作系统的核心信息, 核心开始解压缩, 并尝试驱动所有的硬件设备
核心执行 init 程序, 并获取默认的运行信息
init 程序执行 / etc/rc.d/rc.sysinit 文件, 重新挂载根文件系统
启动核心的外挂模块
init 执行运行的各个批处理文件(scripts)
init 执行 / etc/rc.d/rc.local
执行 / bin/login 程序, 等待用户登录
登录之后开始以 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 stage1 和 stage1_5 到 / dev/DISK 磁盘上, 并复制 GRUB 相关文件到 DIR/boot 目录下
- grub-install --root-directory=DIR /dev/DISK
- (2) grub
- grub> root (hd#,#)
- grub> setup (hd#)
centos6 的 grub.conf 文件
[root@centos6 ~]# cat /boot/grub/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/sda3 # initrd /initrd-[generic-]version.img #boot=/dev/sda default=0 # 默认 0 是选择第一个内核 timeout=5 # 默认 5 秒选择时间 splashimage=(hd0,0)/grub/splash.xpm.gz #splash.xpm.gz 是一个压缩的图片文件, 就是纯黑色的一张图 hiddenmenu ## 默认隐藏下面的 title 菜单, 按任意键才显示内核菜单; 去掉 hiddenmenu 后, 会直接显示出几个内核菜单 # 默认第一选择, 内核版本 2.6.32-754.24.3 title CentOS (2.6.32-754.24.3.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-754.24.3.el6.x86_64 ro root=UUID=59ddf05f-45c1-42a3-a6fa-ea728d714386 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-754.24.3.el6.x86_64.img # 第二选择(default=1), 内核版本 2.6.32-754.17.1 title CentOS (2.6.32-754.17.1.el6.x86_64) root (hd0,0) #hd0 表示第一块硬盘, 后面的 0 是此硬盘的第一个分区, 也就是 / dev/sda1 # 而且 grub 是先于内核启动的, 所以它认为 / boot 是它的根目录, 即内核文件的路径是 / vmlinuz-... #grub 找到内核文件, 然后再找实际的文件系统的根, 即 root=UUID=59ddf...4386, 通过 blkid 和 df 命令查看相对应的根就是 / dev/sda3 kernel /vmlinuz-2.6.32-754.17.1.el6.x86_64 ro root=UUID=59ddf05f-45c1-42a3-a6fa-ea728d714386 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-754.17.1.el6.x86_64.img #initramfs 是小型的 Linux 系统, 有驱动, 文件系统等, 辅助 / vmlinuz 来加载文件系统等信息, 找到实际的根目录 title CentOS 6 (2.6.32-754.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=UUID=59ddf05f-45c1-42a3-a6fa-ea728d714386 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-754.el6.x86_64.img [root@centos6 ~]# blkid /dev/sda1: UUID="3f6fe98d-5347-4322-ae35-a5de27f87631" TYPE="ext4" /dev/sda2: UUID="79fed117-32ae-49fe-9910-db21db8c1df7" TYPE="swap" /dev/sda3: UUID="59ddf05f-45c1-42a3-a6fa-ea728d714386" TYPE="ext4" /dev/sdb1: UUID="0d1537ac-fb91-47c8-af2c-0703c1f4e980" TYPE="ext4" [root@centos6 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 18G 1.1G 16G 7% / tmpfs 490M 0 490M 0% /dev/shm /dev/sda1 477M 88M 364M 20% /boot /dev/sdb1 486M 2.3M 458M 1% /mnt/sdb1 # 查看 ext4 文件系统的路径 [root@centos6 ~]# modinfo ext4 filename: /lib/modules/2.6.32-754.24.3.el6.x86_64/kernel/fs/ext4/ext4.ko license: GPL description: Fourth Extended Filesystem author: Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others retpoline: Y srcversion: 8F05F07CFCA75F17FB3D211 depends: mbcache,jbd2 vermagic: 2.6.32-754.24.3.el6.x86_64 SMP mod_unload modversions # 查看大小 [root@centos6 ~]# ll -h /lib/modules/2.6.32-754.24.3.el6.x86_64/kernel/fs/ext4/ext4.ko -rwxr--r-- 1 root root 636K Nov 14 2019 /lib/modules/2.6.32-754.24.3.el6.x86_64/kernel/fs/ext4/ext4.ko # 文件系统驱动目录 [root@centos6 ~]# ls /lib/modules/2.6.32-754.24.3.el6.x86_64/kernel/fs autofs4 cachefiles configfs dlm exportfs ext3 fat fuse jbd jffs2 mbcache.ko nfs_common nls ubifs xfs btrfs cifs cramfs ecryptfs ext2 ext4 fscache gfs2 jbd2 lockd nfs nfsd squashfs udf
问题: grub 中的内核根指的是 / boot 下, 而实际的文件系统根是 /, 并且文件系统的驱动目录在 / lib 下. 那么就产生矛盾, kernel /vmlinuz-2.6.32-754.24.3.el6.x86_64(内核根是 / boot)没有文件系统的驱动(都在 / lib 下), 怎么去挂载操作系统的根 / 呢 root=UUID=59ddf05f-45c1-42a3-a6fa-ea728d714386(/dev/sda3)?
# 初始化的虚拟系统文件 [root@centos6 ~]# ll -h /boot/initramfs* -rw-------. 1 root root 22M Jul 7 2019 /boot/initramfs-2.6.32-754.17.1.el6.x86_64.img -rw------- 1 root root 22M Nov 16 2019 /boot/initramfs-2.6.32-754.24.3.el6.x86_64.img -rw-------. 1 root root 22M Jul 7 2019 /boot/initramfs-2.6.32-754.el6.x86_64.img # 复制到 / data 下并解压缩 [root@centos6 boot]# cp initramfs-2.6.32-754.24.3.el6.x86_64.img /data/ [root@centos6 boot]# cd /data/ [root@centos6 data]# gzip -d initramfs-2.6.32-754.24.3.el6.x86_64.img gzip: initramfs-2.6.32-754.24.3.el6.x86_64.img: unknown suffix -- ignored [root@centos6 data]# mv initramfs-2.6.32-754.24.3.el6.x86_64.img initramfs-2.6.32-754.24.3.el6.x86_64.img.gz # 解压缩前后对比, 22M ---> 61M [root@centos6 data]# ll -h initramfs-2.6.32-754.24.3.el6.x86_64.img.gz -rw------- 1 root root 22M Apr 11 01:14 initramfs-2.6.32-754.24.3.el6.x86_64.img.gz [root@centos6 data]# gzip -d initramfs-2.6.32-754.24.3.el6.x86_64.img.gz [root@centos6 data]# ll -h initramfs-2.6.32-754.24.3.el6.x86_64.img -rw------- 1 root root 61M Apr 11 01:14 initramfs-2.6.32-754.24.3.el6.x86_64.img # 文件格式 cpio [root@centos6 data]# file initramfs-2.6.32-754.24.3.el6.x86_64.img initramfs-2.6.32-754.24.3.el6.x86_64.img: ASCII cpio archive (SVR4 with no CRC) #initramfs...img 文件就是一个小型的 Linux 系统, 有驱动, 文件系统等 [root@centos6 data]# cpio -tv <initramfs-2.6.32-754.24.3.el6.x86_64.img |grep ext -rw-r--r-- 1 root root 1148 Nov 12 2010 lib/kbd/keymaps/i386/include/Linux-keys-extd.inc drwxr-xr-x 2 root root 0 Nov 16 2019 lib/modules/2.6.32-754.24.3.el6.x86_64/kernel/fs/ext2 -rwxr--r-- 1 root root 130752 Nov 16 2019 lib/modules/2.6.32-754.24.3.el6.x86_64/kernel/fs/ext2/ext2.ko drwxr-xr-x 2 root root 0 Nov 16 2019 lib/modules/2.6.32-754.24.3.el6.x86_64/kernel/fs/ext4 -rwxr--r-- 1 root root 650320 Nov 16 2019 lib/modules/2.6.32-754.24.3.el6.x86_64/kernel/fs/ext4/ext4.ko drwxr-xr-x 2 root root 0 Nov 16 2019 lib/modules/2.6.32-754.24.3.el6.x86_64/kernel/fs/ext3 -rwxr--r-- 1 root root 422208 Nov 16 2019 lib/modules/2.6.32-754.24.3.el6.x86_64/kernel/fs/ext3/ext3.ko drwxr-xr-x 2 root root 0 Nov 16 2019 usr/share/plymouth/themes/text -rw-r--r-- 1 root root 98 Mar 22 2017 usr/share/plymouth/themes/text/text.plymouth -rwxr-xr-x 1 root root 15384 Nov 16 2019 usr/lib64/plymouth/text.so 123998 blocks
范例: centos7 的 grub 第 1 和第 1.5 阶段被破坏后的修复
1, 重启, 选择光盘引导, 选择 Troubleshooting
2, 选择 "Rescue a CentOS system"
3, 进入后, 选择 1continue, 进入提示符
4,centos6 使用 grub-install 命令, 而 centos7 使用 grub2-install 命令
[root@centos7 ~]#hexdump -C -n 512 /dev/sda # 备份 grub 第 1 阶段到 / data/sda446.img [root@centos7 ~]#dd if=/dev/sda of=/data/sda446.img bs=1 count=446 446+0 records in 446+0 records out 446 bytes (446 B) copied, 0.00233902 s, 191 kB/s # 破坏 grub 第 1 阶段 [root@centos7 ~]#dd if=/dev/zero of=/dev/sda bs=1 count=446 446+0 records in 446+0 records out 446 bytes (446 B) copied, 0.00240823 s, 185 kB/s [root@centos7 ~]#reboot # 无法从硬盘引导进入系统, 会尝试从其他方式引导
范例: 误删除 centos7 的内核文件 / boot/vmlinuz-3.10.0-1160.el7.x86_64 无法启动, 故障恢复
[root@centos6 ~]#rm -f /boot/vmlinuz-3.10.0-1160.el7.x86_64 [root@centos6 ~]#reboot # 进入 rescue 模式 #chroot /mnt/sysimage #mount /dev/sr0 /mnt/ #cp /mnt/isolinux/vmlinuz /boot/vmlinuz-`uname -r` #sync #exit #exit #reboot [root@centos7 ~]#ll /boot|grep vmlinuz -rwxr-xr-x. 1 root root 6639904 Jan 10 00:16 vmlinuz-0-rescue-3f4970db61f94b0ba798fec0f9aa1c05 -rwxr-xr-x 1 root root 6769256 Dec 19 00:38 vmlinuz-3.10.0-1160.11.1.el7.x86_64 -rwxr-xr-x 1 root root 6769256 Oct 20 00:23 vmlinuz-3.10.0-1160.el7.x86_64 -rwxr-xr-x 1 root root 8482592 Jan 27 00:05 vmlinuz-5.10.11-1.el7.elrepo.x86_64 [root@centos7 ~]#mount /dev/sr0 /mnt mount: /dev/sr0 is write-protected, mounting read-only [root@centos7 ~]#ll /mnt/isolinux/vmlinuz -rwxr-xr-x 2 root root 6769256 Oct 20 00:23 /mnt/isolinux/vmlinuz [root@centos7 ~]#rm -rf /boot/vmlinuz-3.10.0-1160.el7.x86_64
恢复图片
2 自制 Linux 系统
2.1 分区并创建文件系统
虚拟机中挂载一块硬盘 / dev/sdb, 单个文件, 存放为 CentOS 64 位 - 6.9-init-18G.vmdk 文件.
[root@centos6 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 18G 1.1G 16G 7% / tmpfs 237M 0 237M 0% /dev/shm /dev/sda1 477M 88M 364M 20% /boot # 可以看到新增加的 sdb 分区 [root@centos6 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 3.7G 0 rom sda 8:0 0 20G 0 disk
├─sda1 8:1 0 500M 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 17.5G 0 part /
sdb 8:16 0 18G 0 disk # 分两个必要的分区,/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 [root@centos6 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 3.7G 0 rom sda 8:0 0 20G 0 disk
├─sda1 8:1 0 500M 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 17.5G 0 part /
sdb 8:16 0 18G 0 disk
├─sdb1 8:17 0 1G 0 part
└─sdb2 8:18 0 17G 0 part
[root@centos6 ~]# hexdump -C -n 512 /dev/sdb
2.2 挂载 boot
# 子目录必须为 boot [root@centos6 ~]# mkdir /mnt/boot [root@centos6 ~]# mount /dev/sdb1 /mnt/boot
2.3 安装 grub
grub 目录是在 / boot 下, 而初始化时 boot 目录是 / mnt/boot, 所以要用 --root-directory 指定
[root@centos6 ~]# grub-install --root-directory=/mnt /dev/sdb Probing devices to guess BIOS drives. This may take a long time. Installation finished. No error reported.
2.4 准备内核和 initramfs 文件
# 复制内核和 init 文件到 / mnt/boot 下 [root@centos6 ~]# cp /boot/vmlinuz-2.6.32-754.24.3.el6.x86_64 /mnt/boot/vmlinuz [root@centos6 ~]# cp /boot/initramfs-2.6.32-754.24.3.el6.x86_64.img /mnt/boot/initramfs.img
2.5 创建 grub.conf 配置文件
# 修改 grub.conf 配置文件 [root@centos6 ~]# cp /boot/grub/grub.conf /mnt/boot/grub/ [root@centos6 ~]# vi /mnt/boot/grub/grub.conf [root@centos6 ~]# cat /mnt/boot/grub/grub.conf default=0 timeout=5 title Test CentOS (6.6.6.6) root (hd0,0) kernel /vmlinuz root=/dev/sda2 selinux=0 init=/bin/bash initrd /initramfs.img
2.6 准备根下面相关程序和库
[root@centos6 ~]# mkdir /mnt/sysroot [root@centos6 ~]# mount /dev/sdb2 /mnt/sysroot [root@centos6 ~]# mkdir -pv /mnt/sysroot/{ boot,dev,sys,proc,etc,lib,lib64,bin,sbin,tmp,var,usr,opt,home,root,mnt,media } # 复制 bash 等命令和相关库文件, 如: bash,ifconfig,insmod,ping,mount,ls,cat,df,lsblk,blkid,tree,fdisk,ps,ip 等; 使用 shell 脚本 copycmd.sh 来复制 [root@centos6 ~]# ./copycmd.sh Please input a command or quit: bash copy /bin/bash ========\> /mnt/sysroot/bin copy /lib64/libtinfo.so.5 ========\> /mnt/sysroot/lib64 copy /lib64/libdl.so.2 ========\> /mnt/sysroot/lib64 copy /lib64/libc.so.6 ========\> /mnt/sysroot/lib64 copy /lib64/ld-Linux-x86-64.so.2 ========\> /mnt/sysroot/lib64 Please input a command or quit: quit [root@centos6 ~]# [root@centos6 ~]# ls /mnt/sysroot bin boot dev etc home lib lib64 media mnt opt proc root sbin sys tmp usr var [root@centos6 sysroot]# tree
... 省略...
[root@centos6 sysroot]# ll /mnt/boot total 26084 drwxr-xr-x 2 root root 4096 Apr 19 01:39 grub -rw------- 1 root root 22347901 Apr 19 01:35 initramfs.img drwx------ 2 root root 16384 Apr 19 01:32 lost+found -rwxr-xr-x 1 root root 4335056 Apr 19 01:35 vmlinuz
2.7 准备网卡驱动
# 准备网卡驱动 [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.24.3.el6.x86_64/kernel/drivers.NET/e1000/e1000.ko [root@centos6 ~]# cp /lib/modules/2.6.32-754.24.3.el6.x86_64/kernel/drivers.NET/e1000/e1000.ko /mnt/sysroot/lib/
2.8 切换根目录
[root@centos6 ~]# chroot /mnt/sysroot #切换根目录 bash-4.1# ls bin boot dev etc home lib lib64 media mnt opt proc root sbin sys tmp usr var bash-4.1# exit exit
2.9 新建虚拟机挂载硬盘启动
第一次实验失败, 原因如下
第二次实验, 正常运行
3 systemd
3.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 类型:
[root@repo-client ~]# systemctl -t help Available unit types: service socket busname target snapshot 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 的配置文件:
#CentOS 中 / usr/lib 和 / lib 是软链接关系 /lib --> usr/lib; # 而 Ubuntu 中这是两个不同的文件夹 /usr/lib/systemd/system #每个服务最主要的启动脚本设置, 类似于之前的 / etc/init.d/ /lib/systemd/system #ubutun 的对应目录 /run/systemd/system #系统执行过程中所产生的服务脚本, 比上面目录优先运行 /etc/systemd/system #管理员建立的执行脚本, 类似于 / etc/rcN.d/Sxx 的功能, 比上面目录优先运行
3.2 systemctl 管理系统服务
centos6 使用 service 管理系统服务
service name.service start|stop|restart 等, 一次只能开启或停止一个服务
命令执行成功后, 会有绿色的 OK 显示
centos7 后使用 systemctl 管理系统服务
systemctl stop|start|restart name.service #一次可以开启或停止多个服务
命令执行成功后, 无任何显示. 有显示说明不成功
注: sshd 服务, 如果停止了, 当前的用户窗口还可以连接继续使用, 但不能再打开新的窗口连接.
命令:
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
示例:
1,mask 及 unmask
[root@centos7 ~]#systemctl stop postfix [root@centos7 ~]#systemctl mask postfix Created symlink from /etc/systemd/system/postfix.service to /dev/null. [root@centos7 ~]#systemctl start postfix Failed to start postfix.service: Unit is masked. [root@centos7 ~]#systemctl unmask postfix Removed symlink /etc/systemd/system/postfix.service. [root@centos7 ~]#systemctl start postfix #mask 相当于把命令做了一个软链接, 链接到了 / dev/null [root@centos7 sysconfig]#cd /etc/systemd/system # 错误: 要链接 postfix.service, 只写 postfix 不能生效 [root@centos7 system]#ln -s /dev/null /etc/systemd/system/postfix [root@centos7 system]#systemctl start postfix [root@centos7 system]#systemctl daemon-reload [root@centos7 system]#systemctl start postfix # 正确: 链接 postfix.service [root@centos7 system]#ln -s /dev/null /etc/systemd/system/postfix.service [root@centos7 system]# ll postfix.service lrwxrwxrwx 1 root root 9 Apr 18 18:00 postfix.service -> /dev/null # 如果软链接没有生效, 使用 daemon-reload 生效 [root@centos7 system]#systemctl start postfix [root@centos7 system]#systemctl daemon-reload [root@centos7 system]#systemctl start postfix Failed to start postfix.service: Unit is masked. # 删除软链接后, 可以启动 [root@centos7 system]#rm -f /etc/systemd/system/postfix.service [root@centos7 system]#systemctl start postfix Failed to start postfix.service: Unit is masked. [root@centos7 system]#systemctl daemon-reload [root@centos7 system]#systemctl start postfix 2,is-active # 可以用在脚本中, 判断服务是否启动, 未启动时, 执行 systemctl start name.service 启动 [root@centos7 system]#systemctl is-active postfix active [root@centos7 system]#systemctl stop postfix [root@centos7 system]#systemctl is-active postfix inactive [root@centos7 system]#echo $? 3
3,enable 和 disable
# 判断服务是否下次开机启动 [root@centos7 system]#systemctl is-enabled postfix enabled #status 中的 enabled 表示下次开机启动; 而 vendor preset:disabled 表示安装时的默认状态 [root@centos7 system]#systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled) # 立即关闭并设置为开机不启动 [root@centos7 system]#systemctl disable --now postfix Removed symlink /etc/systemd/system/multi-user.target.wants/postfix.service. [root@centos7 system]#systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
Loaded: loaded (/usr/lib/systemd/system/postfix.service; disabled; vendor preset: disabled) Active: inactive (dead) [root@centos7 system]#systemctl is-enabled postfix disabled # 立即启动并设置开机启动 [root@centos7 system]#systemctl enable --now postfix Created symlink from /etc/systemd/system/multi-user.target.wants/postfix.service to /usr/lib/systemd/system/postfix.service. [root@centos7 system]#systemctl is-enabled postfix enabled [root@centos7 system]#systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled) Active: active (running)
服务状态
# 显示状态 systemctl list-unit-files --type service --all
loaded Unit: 配置文件已处理
active(running): 一次或多次持续处理的运行
active(exited): 成功完成一次性的配置
active(waiting): 运行中, 等待一个事件
inactive: 不运行
enabled: 开机启动
disabled: 开机不启动
static: 开机不启动, 但可被另一个启用的服务激活
indirect: 重定向到别处
范例:
4,# 查看所有服务的开机自启状态, 相当于 centos6 的 chkconfig --list [root@centos7 system]#systemctl list-unit-files --type service UNIT FILE STATE atd.service enabled autofs.service enabled crond.service enabled firewalld.service disabled #开机不启动 httpd.service enabled NetworkManager.service enabled sshd.service enabled #开机启动 systemd-reboot.service static systemd-shutdownd.service static #开机不启动, 但可被另一个启用的服务激活 systemd-readahead-done.service indirect #重定向到别处
... 省略...
# 查看所有已经激活的服务 [root@centos7 system]#systemctl list-units --type service UNIT LOAD ACTIVE SUB DESCRIPTION atd.service loaded active running Job spooling tools
... 省略...
# 已激活的服务 [root@centos7 system]#systemctl list-units --type service|wc -l 47 # 所有服务 [root@centos7 system]#systemctl list-units --type service -a |wc -l 111 # 列出失败的服务 [root@centos7 system]#systemctl --failed --type service UNIT LOAD ACTIVE SUB DESCRIPTION
● network.service loaded failed failed LSB: Bring up/down networking
# 查看服务的依赖关系 [root@centos7 system]#systemctl list-dependencies nfs-server nfs-server.service
● ├─auth-rpcgss-module.service
● ├─nfs-config.service
● ├─nfs-idmapd.service
● ├─nfs-mountd.service
● ├─proc-fs-nfsd.mount
● ├─rpc-statd-notify.service
● ├─rpc-statd.service
● ├─rpcbind.socket
● ├─system.slice
● ├─network-online.target
● │ └─NetworkManager-wait-online.service
● └─network.target
3.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@repo-client ~]# 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
范例: 服务 Unit 文件
# 以 atd.service 为例 [root@centos7 system]#vi /usr/lib/systemd/system/atd.service [Unit] Description=Job spooling tools #描述信息 After=syslog.target systemd-user-sessions.service#atd 启动前需要先启动其他服务, 如 syslog 等 [Service] EnvironmentFile=/etc/sysconfig/atd #atd 的环境配置文件 ExecStart=/usr/sbin/atd -f $OPTS #执行 systemctl start atd 时, 实际调用的命令,$OPTS 这个变量路径来自于 EnvironmentFile=/etc/sysconfig/atd 配置文件中, 如下所示, 目前变量为空值 IgnoreSIGPIPE=no [Install] WantedBy=multi-user.target #设置在什么模式下被安装, 设置开机启动的时候需要, multi-user.target 通常指 3 运行模式 [root@centos7 system]#cat /etc/sysconfig/atd #example: #OPTS="-l 4 -b 120"
3.4 运行级别
centos7 之后用 target units: 相当于 CentOS 6 之前的 runlevel ,unit 配置文件:.target
ls /usr/lib/systemd/system/*.target systemctl list-unit-files --type target --all [root@repo-client ~]# ls /usr/lib/systemd/system/*.target /usr/lib/systemd/system/basic.target /usr/lib/systemd/system/poweroff.target [root@repo-client ~]# systemctl list-unit-files --type target --all |wc -l 62 [root@repo-client ~]# systemctl list-unit-files --type target --all UNIT FILE STATE
... 省略...
和运行级别对应关系
==> runlevel0.target, poweroff.target ==> runlevel1.target, rescue.target ==> runlevel2.target, multi-user.target ==> runlevel3.target, multi-user.target ==> runlevel4.target, multi-user.target ==> runlevel5.target, graphical.target ==> runlevel6.target, reboot.target
查看依赖性:
systemctl list-dependencies graphical.target [root@repo-client ~]# systemctl list-dependencies nfs nfs.service
● ├─auth-rpcgss-module.service
● ├─nfs-config.service
● ├─nfs-idmapd.service
● ├─nfs-mountd.service
● ├─proc-fs-nfsd.mount
● ├─rpc-statd-notify.service
● ├─rpc-statd.service
● ├─rpcbind.socket
● ├─system.slice
● ├─network-online.target
● │ └─NetworkManager-wait-online.service
● └─network.target
进入默认 target
systemctl default
级别切换: 相当于 init N
systemctl isolate name.target # 切换至字符模式 systemctl isolate multi-user.target
范例:
# 查看当前运行模式 [root@repo-client ~]# runlevel N 3 [root@repo-client ~]# systemctl isolate rescue.target #切换到 1 救援模式, sshd 远程连接就会断开 # 一下只能在本地服务器上操作 [root@repo-client ~]# runlevel 3 1 [root@repo-client ~]# 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@repo-client ~]# systemctl get-default multi-user.target [root@repo-client ~]# systemctl set-default rescue.target Removed symlink /etc/systemd/system/default.target. Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/rescue.target. [root@repo-client ~]# systemctl get-default rescue.target [root@repo-client ~]# systemctl set-default multi-user.target Removed symlink /etc/systemd/system/default.target. Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target. [root@repo-client ~]# systemctl get-default multi-user.target
切换至紧急救援模式:
systemctl rescue
切换至 emergency 模式:
systemctl emergency
说明: rescue.target 比 emergency 支持更多的功能, 例如日志等
范例: 禁用 ctrl+alt+delete 重启快捷键
[root@repo-client ~]# ls -l /lib/systemd/system/ctrl-alt-del.target lrwxrwxrwx. 1 root root 13 Nov 24 15:48 /lib/systemd/system/ctrl-alt-del.target -> reboot.target [root@repo-client ~]# systemctl mask ctrl-alt-del.target Created symlink from /etc/systemd/system/ctrl-alt-del.target to /dev/null. [root@repo-client ~]# init q [root@repo-client ~]# systemctl daemon-reload
3.5 CentOS 7 之后版本引导顺序
UEFi 或 BIOS 初始化, 运行 POST 开机自检
选择启动设备
引导装载程序, centos7 是 grub2, 加载装载程序的配置文件:
/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
加载 initramfs 驱动模块
加载内核选项
内核初始化, centos7 使用 systemd 代替 init
执行 initrd.target 所有单元, 包括挂载 / etc/fstab
从 initramfs 根文件系统切换到磁盘根目录
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 需要的服务
通过 systemd-analyze 工具可以了解启动的详细过程
范例:
[root@repo-client ~]# systemd-analyze blame 15.285s dev-sda3.device 9.774s boot.mount 3.563s tuned.service 2.472s postfix.service 1.939s systemd-vconsole-setup.service 1.158s network.service 1.097s NetworkManager-wait-online.service 960ms polkit.service 848ms var-lib-nfs-rpc_pipefs.mount 732ms auditd.service 591ms NetworkManager.service
... 省略...
范例: 生成网页
[root@centos7 ~]# systemd-analyze plot> boot.html Linux ( ) x86-64 vmware Startup finished in 8.915s (kernel) + 23.677s (initrd) + 39.113s (userspace) = 1min 11.705s
4 破解 CentOS 7 和 8 的 root 密码
4.1 破解密码
4.1.1 方法一
#1)启动时任意键暂停启动, 按 e 键进入编辑模式 #2)将光标移动 linux16(centos8 中是 Linux)开始的行, 最后添加内核参数 rd.break #rd.break 打断 Linux 正常启动 #3)按 ctrl-x 启动, 不用输入密码就可以进入系统, 只读, 不能写入, 不能修改 shadow 文件, 需要重新挂载为 rw mount -o remount,rw /sysroot chroot /sysroot passwd root # 也可以直接把 shadow 文件中的 root 密码去掉 # 如果 SELinux 是启用的, 才需要执行下面操作, 如查没有启动, 不需要执行 touch /.autorelabel exit reboot
4.1.2 方法二
启动时任意键暂停启动
按 e 键进入编辑模式
将光标移动 Linux 开始的行, 改为 rw init=/sysroot/bin/sh
按 ctrl-x 启动
chroot /sysroot passwd root # 如果 SELinux 是启用的, 才需要执行下面操作, 如查没有启动, 不需要执行 touch /.autorelabel exit reboot
4.2 实现 GRUB2 安全
# 查看 user.cfg 文件 [root@centos7 ~]#ll /boot/grub2/user.cfg ls: cannot access /boot/grub2/user.cfg: No such file or directory # 添加 grub 密码 [root@centos7 ~]#grub2-setpassword Enter password: Confirm password: # 设置 grub 密码后, 会生成 user.cfg 文件 [root@centos7 ~]#ll /boot/grub2/user.cfg -rw------- 1 root root 298 Apr 18 22:38 /boot/grub2/user.cfg [root@centos7 ~]#cat /boot/grub2/user.cfg GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.E1DB409423F51FF2F4268E6DC48C1818423207803A324D19BE29BC931F170C7B2D6E1F6C614A9A033B579CA7ED26A24863B6EF336428AAA918B283FC6F3A8796.7D31DECB77E6BAB2559E3EF1A7FA73110A0B582E75C3FAB071DA4EA2925CFA2170A4B9E94B92CCAD9F292B770D5347AE62E4FEB64421F2F78E37E93CB133C12D # 清空 grub 密码, 指向空, 或删除 user.cfg 文件 [root@centos7 ~]#cat /dev/null> /boot/grub2/user.cfg
4.3 修复 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=b0b1b807ae4c460c9552fd01831bf055-4.18.0-193.28.1.el8_2.x86_64 kernelopts=root=/dev/mapper/cl-root ro resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet boot_success=0 [root@centos8 ~]# ll /boot/loader/entries/ total 12 -rw-r--r--. 1 root root 395 Nov 7 18:30 b0b1b807ae4c460c9552fd01831bf055-0-rescue.conf -rw-r--r--. 1 root root 358 Nov 12 20:14 b0b1b807ae4c460c9552fd01831bf055-4.18.0-193.28.1.el8_2.x86_64.conf -rw-r--r--. 1 root root 323 Nov 7 18:30 b0b1b807ae4c460c9552fd01831bf055-4.18.0-193.el8.x86_64.conf [root@centos8 ~]# ls 2020-11-01.log 2020-11-08+01:00:07.log anaconda-ks.cfg app2020-11-01.log +%F_%T # 以下命令是修改 /boot/grub2/grubenv 实现 [root@centos8 ~]#grub2-set-default 1 # 或者 [root@centos8 ~]#VIM /etc/default/grub GRUB_DEFAULT=1 [root@centos8 ~]# cat /etc/default/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed's, release .*$,,g'/etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet" GRUB_DISABLE_RECOVERY="true" GRUB_ENABLE_BLSCFG=true [root@centos8 ~]# grub2-set-default 1 [root@centos8 ~]# reboot
4.4 故障排错实战案例
4.4.1 实战案例: 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
实例: centos7 删除 / boot 后修复
[root@centos7 ~]#rm -fr /boot rm: cannot remove '/boot': Device or resource busy [root@centos7 ~]#ll /boot total 0 [root@centos7 ~]#reboot
centos8 删除 / boot
[root@centos8 ~]# rm -rf /boot rm: cannot remove '/boot': Device or resource busy [root@centos8 ~]# ls /boot [root@centos8 ~]# reboot
来源: http://blog.51cto.com/puppydong/2717993