鸿 网 互 联 www.68idc.cn

Linux操作系统启动流程及故障排除

来源:互联网 作者:佚名 时间:2022-07-19 11:07
1 CentOS 6 的启动管理 1.1 Linux 组成 kernel 实现进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能等功能。 rootfs 包括程序和 glibc 库 程序:二进制执行文件 库:函数集合,

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 #无法从硬盘引导进入系统,会尝试从其他方式引导

    Linux操作系统启动流程及故障排除

    范例:误删除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

    恢复图片

    Linux操作系统启动流程及故障排除

    2 自制linux系统

    2.1 分区并创建文件系统

    虚拟机中挂载一块硬盘/dev/sdb,单个文件,存放为CentOS 64 位-6.9-init-18G.vmdk文件。

    Linux操作系统启动流程及故障排除

    [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 新建虚拟机挂载硬盘启动

    第一次实验失败,原因如下

    Linux操作系统启动流程及故障排除

    第二次实验,正常运行

    Linux操作系统启动流程及故障排除

    Linux操作系统启动流程及故障排除

    Linux操作系统启动流程及故障排除

    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 ...省略...

    和运行级别对应关系

    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 [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 才能切换(修改文件需执行systemctldaemon-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

    Linux操作系统启动流程及故障排除

    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

    Linux操作系统启动流程及故障排除

    Linux操作系统启动流程及故障排除

    4.1.2 方法二

    启动时任意键暂停启动 按e键进入编辑模式 将光标移动linux 开始的行,改为rw init=/sysroot/bin/sh 按ctrl-x启动 chroot /sysroot passwd root #如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行 touch /.autorelabel exit reboot

    Linux操作系统启动流程及故障排除

    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

    Linux操作系统启动流程及故障排除

    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

    Linux操作系统启动流程及故障排除

    centos8删除/boot

    [root@centos8 ~]# rm -rf /boot rm: cannot remove '/boot': Device or resource busy [root@centos8 ~]# ls /boot [root@centos8 ~]# reboot

    Linux操作系统启动流程及故障排除

    【文章原创作者:美国站群多ip服务器 http://www.558idc.com/mgzq.html
    上一篇:编程小技巧之 Linux 文本处理命令
    下一篇:没有了
    网友评论
    <