13.系统启动和服务管理

1 centos6的启动

1.1 Linux系统概述

  • 内核功能:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能等
  • 根文件系统(rootfs):程序和 glibc 库

内核的两个流派:

  • 宏内核(monolithic kernel):又称单内核和强内核,Unix,Linux

    把所有系统服务都放到内核里,所有功能集成于同一个程序,分层实现不同功能,系统庞大复杂, Linux其实在单内核内核实现了模块化,也就相当于吸收了微内核的优点

  • 微内核(micro kernel):Windows,Solaris,HarmonyOS

    简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护,每 种功能使用一个单独子系统实现,将内核功能移到用户空间,性能差

1.2 CentOS 6启动流程

1.2.1 硬件启动

开机或重启主引导扇区的读取流程

  1. BIOS加电自检(Power On Self Test -- POST)
  2. 读取主引导记录(MBR)。当BIOS检查到硬件正常并与CMOS中的设置相符后,按照CMOS中对启动设备的设置顺序检测可用的启动设备。
  3. 当检测到有启动设备满足要求后,BIOS将控制权交给相应启动设备。

加电自检数据保存位置:

  • 主板的ROM,BIOS,这里保存着有关计算机系统最重要的基本输入输出 程序,系统信息设置、开机加电自检程序和系统启动自举程序等
  • 主板的RAM,:CMOS互补金属氧化物半导体,这里保存各项参数的设定,按次序查找引导设备,第一个有引导程序的设备为本次启动设备
1.2.2 启动加载器bootloader

BIOS寻找到第一个可启动的设备(通常为硬盘),而后从MBR中加载启动程序,然后把控制交给这段代码。MBR位于硬盘的前512字节内。

引导程序(英语:boot loader)是指引导操作系统的程序。第一阶段引导程序位于主引导记录(MBR),用以引导位于某个分区上的第二阶段引导程序,如NTLDR、BOOTMGR和GNU GRUB等。

主引导记录(MBR)最开头是第一阶段引导代码。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序

GRUB是Linux系统中所用的引导程序,这是一个来自GNU项目的多操作系统启动程序。

GRUB 启动阶段

  • primary boot loader :

    1st stage:MBR的前446个字节

    1.5 stage: mbr 之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统

  • secondary boot loader :2nd stage,分区文件/boot/grub/

GRUB的步骤1包含在MBR中。由于受MBR的大小限制,步骤一所做的几乎只是装载GRUB的下一步骤(存放在硬盘的其它位置),也就是引出1.5或者2阶段。

1.3.3 加载 kernel

kernel 自身初始化过程

  1. 探测可识别到的所有硬件设备
  2. 加载硬件驱动程序(借助于ramdisk加载驱动)
  3. 以只读方式挂载根文件系统
  4. 运行用户空间的第一个应用程序:/sbin/init

内核的组成部分:

  • 核心文件:/boot/vmlinuz-VERSION-release

    ramdisk:辅助的伪根系统,加载相应的硬件驱动,ramdisk --> ramfs 提高速度

    CentOS 5 /boot/initrd-VERSION-release.img

    CentOS 6 以后版本 /boot/initramfs-VERSION-release.img

1.3.4 init初始化
1.3.4.1 运行级别

这个阶段首先通过init程序获取用户运行级别

不同版本系统init程序的类型:

CentOS 5之前

​ 配置文件:/etc/inittab

Upstart: init,CentOS 6

​ 配置文件:/etc/inittab, /etc/init/*.con

Systemd:systemd, CentOS 7

​ 配置文件:/usr/lib/systemd/system

​ /etc/systemd/system

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

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

执行运行级别下服务的启动脚本

服务脚本放置于/etc/rc.d/init.d (/etc/init.d)
/etc/rc.d/rc.local

service 命令:手动管理服务

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

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
1.3.4.4 非独立服务管理

服务分为独立服务和非独立服务

瞬态(Transient)服务被超级守护进程 xinetd 进程所管理,也称为非独立服务,这类服务在被使用时才会被唤醒。

配置文件:

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

用chkconfig控制非独立服务开机启动

示例:chkconfig tftp on

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

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

查看/proc帮助:man proc

/proc设置的方法:

#使用命令设置,下次开机后失效
sysctl -w path.to.parameter=VALUE

#写入配置文件,持久保存配置,下面任意一个配置文件即可
/etc/sysctl.conf 
/etc/sysctl.d/*.conf
/usr/local/lib/sysctl.d/*.conf
/usr/lib/sysctl.d/*.conf
/lib/sysctl.d/*.conf
/run/sysctl.d/*.conf

#echo命令通过重定向方式也可以修改大多数参数的值
echo "VALUE" > /proc/sys/path/to/parameter

sysctl命令用法:

临时设置参数

sysctl -w parameter=VALUE

通过读取配置文件设置参数

sysctl -p [/path/to/conf_file]

查看所有生效参数

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		#允许打开的最大文件数

/sys 目录

使用sysfs文件系统,为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内 核对硬件特性的设定信息;有些参数是可以修改的,用于调整硬件工作特性

udev通过此路径下输出的信息动态为各设备创建所需要设备文件

udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d 及/usr/lib/udev/rules.d目录下

3 内核模块管理

Linux是单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制 内核组成部分:

kernel:内核核心,一般为bzImage,通常在/boot目录下

​ 名称为 vmlinuz-VERSION-RELEASE

kernel object:内核对象,一般放置于

​ /lib/modules/VERSION-RELEASE/

使用uname -r可以查看内核版本

3.1 内核模块命令

lsmod
  • 显示由核心已经装载的内核模块
  • 显示的内容来自于: /proc/modules文件
modinfo

查看内核模块

格式:

modinfo [ -k kernel ] [ modulename|filename... ]

常用选项:

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

添加或者移除内核模块

格式:

modprobe [-C config-file] [modulename] [module parameters...]
modprobe [-r] [-v] [-n] [-i] [modulename...]

常用选项:

  • -r 移除指定模块

范例:

[root@centos8 ~]$modprobe uas
[root@centos8 ~]$lsmod | grep usb
usb_storage            73728  1 uas
[root@centos8 ~]$modprobe -r usb_storage 
modprobe: FATAL: Module usb_storage is in use.
[root@centos8 ~]$modprobe -r uas
[root@centos8 ~]$lsmod | grep usb
[root@centos8 ~]$

其他命令:

depmod命令:内核模块依赖关系文件及系统信息映射文件的生成工具

insmod命令:可以安装模块,需要指定模块文件路径,并且不自动解决依赖模块

范例:

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

rmmod命令:卸载模块

rmmod [ modulename ]

4 Busybox

4.1 Busybox介绍

Busybox 是一个集成了三百多个最常用Linux命令和工具的软件。同时它自身只占用很小的空间

可以用于定制小型的Linux操作系统:linux内核+busybox

官方网站:https://busybox.net/

4.2 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 ~]#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 sharedlibs)
[root@centos7 busybox-1.31.1]#make 

#如果出错,执行make clean后,重新执行上面命令
[root@centos7 busybox-1.31.1]#make install 
[root@centos7 busybox-1.31.1]#ll busybox -h
-rwxr-xr-x 1 root root 2.6M May 13 14:46 busybox

#在install目录中创建了各种命令的软链接便于使用
[root@centos7 busybox-1.31.1]#ls _install/
bin linuxrc sbin usr

4.3 Busybox使用

busybox的使用有三种方式:

  • busybox后直接跟命令,如 busybox ls
  • 直接将busybox重命名,如 cp busybox tar
  • 创建符号链接,如 ln -s busybox rm

5 systemd

5.1 systemd介绍

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

Systemd新特性

  • 按需启动守护进程
  • 自动化的服务依赖关系管理
  • 并行执行系统服务等

systemd概念之:unit

unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听 socket、保存的系统快照以及其它与init相关的信息

Unit常用类型:

  • service :文件扩展名为.service, 用于定义系统服务

  • socket :定义进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现 按需启动

  • target:文件扩展名为.target,用于模拟实现运行级别

使用systemctl -t help可以查看unit全部类型

unit的配置文件

/usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/
/lib/systemd/system: ubutun的对应目录

/run/systemd/system:系统执行过程中所产生的服务脚本,比上面目录优先运行
/etc/systemd/system:管理员建立的执行脚本,类似于/etc/rcN.d/Sxx的功能,比上面目录优先运行

更为详细信息可以访问红帽官网查看:

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/chap-managing_services_with_systemd

http://freedesktop.org/wiki/Software/systemd/Preset

5.2 systemctl管理系统服务

格式:

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
这条命令本质上是将/etc/systemd/system/name.service软链接至/dev/null

#取消禁止
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 --list
systemctl list-unit-files --type service

#用来列出该服务在哪些运行级别下启用和禁用:chkconfig –list name
ls /etc/systemd/system/*.wants/name.service

#查看服务是否开机自启:
systemctl is-enabled name.service

服务状态说明:

  • active(running) 一次或多次持续处理的运行
  • inactive 不运行
  • static 开机不启动,但可被另一个启用的服务激活
  • enabled 开机启动
  • disabled 开机不启动

5.3 service unit文件格式

/etc/systemd/system:系统管理员和用户使用 (其中内容是/usr/lib/systemd/system软链接)

/usr/lib/systemd/system:发行版打包者使用

unit 格式说明:

  • 以 “#” 开头的行后面的内容会被认为是注释
  • 相关布尔值,1、yes、on、true 都是开启,0、no、off、false 都是关闭
  • 时间单位默认是秒,所以要用毫秒(ms)分钟(m)等须显式说明

service unit file文件通常由三部分组成

[root@Centos7 ~]# cat  /usr/lib/systemd/system/NetworkManager.service 
#有关unit的信息相关选项
[Unit]
...

#unit类型选项集合
[Service]
...

#定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项
[Install]
...

[Unit]的常用选项:

  • Description:描述信息
  • After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反
  • Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活
  • Wants:依赖到的其它units,弱依赖
  • Conflicts:定义units间的冲突关系

[Service]的常用选项:

  • Type:定义影响ExecStart及相关参数的功能的unit进程启动类型

    simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中

  • 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所依赖,弱依赖

范例:开机启动nginx

#方式1:
[root@Centos7 ~]# 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

#方式2:
[root@Centos7 ~]#vim /etc/rc.local
[root@Centos7 ~]#cat /etc/rc.local
#!/bin/bash
/usr/local/tomcat/bin/startup.sh

5.4 运行级别

target units:相当于CentOS 6之前的runlevel ,unit配置文件:.target

ls /usr/lib/systemd/system/*.target
systemctl list-unit-files --type target --all

级别对应关系

0 ==> runlevel0.target, poweroff.target
1 ==> runlevel1.target, rescue.target
2 ==> runlevel2.target, multi-user.target
3 ==> runlevel3.target, multi-user.target
4 ==> runlevel4.target, multi-user.target
5 ==> runlevel5.target, graphical.target
6 ==> runlevel6.target, reboot.target

常用命令:

#级别切换:相当于 init N
systemctl isolate name.target

#获取默认运行级别: 相当于查看 /etc/inittab
systemctl get-default

#修改默认级别:相当于修改 /etc/inittab
systemctl set-default name.target

5.5 CentOS 7之后版本引导顺序

大图:http://www.bestvae.cn/centos7.svg

centos7启动流程

5.6 设置内核参数

设置内核参数,只影响当次启动

常用于实现密码的破解

启动时,到启动菜单,按e键,找到在linux 开头的行后添加systemd.unit=desired.target

5.7 练习

5.7.1 自制一个只运行shell的linux系统

参考的文档:

Grub配置

https://www.gnu.org/software/grub/manual/grub/grub.html#Invoking-grub_002dmkrelpath

http://www.jinbuguo.com/linux/grub.cfg.html

内核相关参数设置

https://www.kernel.org/doc/html/v4.14/admin-guide/kernel-parameters.html

1、硬件环境准备

#此次实验系统版本为CentOS Linux release 7.9.2009 (Core)

#1)创建boot和/分区
[root@localhost ~]# fdisk /dev/sdb
#创建boot分区
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +1G
Partition 1 of type Linux and of size 1 GiB is set
#创建/分区
Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (2-4, default 2): 2
First sector (2099200-41943039, default 2099200): 
Using default value 2099200
Last sector, +sectors or +size{K,M,G} (2099200-41943039, default 41943039): 
Using default value 41943039
Partition 2 of type Linux and of size 19 GiB is set
#保存设置退出
Command (m for help): w

#2)格式文件系统
[root@localhost ~]# mkfs.ext4 /dev/sdb1
[root@localhost ~]# mkfs.ext4 /dev/sdb2

#3)挂载磁盘设备
[root@localhost ~]# mount /dev/sdb1 /mnt/boot
[root@localhost ~]# mount /dev/sdb2 /mnt/sysroot/

2、配置grub

#1)安装grub
[root@localhost ~]# grub2-install --root-directory=/mnt/ /dev/sdb
Installing for i386-pc platform.
Installation finished. No error reported.
[root@localhost ~]# ls /mnt/boot/
grub2  lost+found
#也可以使用下面这个命令安装grub
[root@localhost ~]#grub2-install --boot-directory=/mnt/boot /dev/sdb --force

#2)拷贝内核以及虚拟文件系统
[root@localhost ~]# cp /boot/vmlinuz-3.10.0-1160.el7.x86_64 /mnt/boot/
[root@localhost ~]# cp /boot/initramfs-3.10.0-1160.el7.x86_64.img /mnt/boot/

#3)自定义名称、在选择菜单界面等待时间6s,指定init程序为bash
[root@localhost /]# cat /etc/default/grub 
#通常来说建议在这个文件设置grub相关参数,再运行grub2-mkconfig生成grub.cfg文件
GRUB_TIMEOUT=6		#选择菜单界面等待秒数
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rhgb quiet root=/dev/sda2 selinux=0 init=/bin/bash"		#向内核添加参数
GRUB_DISABLE_RECOVERY="true"
[root@localhost /]# grub2-mkconfig -o /mnt/boot/grub2/grub.cfg
[root@localhost /]# cat /mnt/boot/grub2/grub.cfg
menuentry 'CentOS Linux this is for test' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-1160.el7.x86_64-advanced-b3124ba9-2b20-4b11-915d-df97a9e8a256' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_msdos
        insmod xfs
        set root='hd0,msdos1'			#指定根设备,任何未指定设备名的文件都视为位于此设备
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 4d3af8d0-7296-488d-96b6-725d5c5d9152 
        else
          search --no-floppy --fs-uuid --set=root 4d3af8d0-7296-488d-96b6-725d5c5d9152
        fi
        linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/sda2 ro rhgb quiet selinux=0 init=/bin/bash 	
        initrd16 /initramfs-3.10.0-1160.el7.x86_64.img
}

3、准备相关程序和库

[root@localhost /]#mkdir /mnt/sysroot
[root@localhost /]#mount /dev/sdb2   /mnt/sysroot
[root@localhost /]# 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
[root@localhost data]# cat copycmd.sh 
#!/bin/bash
ch_root="/mnt/sysroot"
[ ! -d $ch_root ] && mkdir $ch_root
 
bincopy() {
    if which $1 &>/dev/null; then

        local cmd_path=`which --skip-alias $1`
        local bin_dir=`dirname $cmd_path`
        [ -d ${ch_root}${bin_dir} ] || mkdir -p ${ch_root}${bin_dir}
        [ -f ${ch_root}${cmd_path} ] || cp $cmd_path ${ch_root}${bin_dir}
        return 0
    else
        echo "Command not found."
        return 1
    fi
}
 
libcopy() {
    local lib_list=$(ldd `which --skip-alias $1` | grep -Eo '/[^[:space:]]+')
    for loop in $lib_list;do
        local lib_dir=`dirname $loop`
        [ -d ${ch_root}${lib_dir} ] || mkdir -p  ${ch_root}${lib_dir}
        [ -f ${ch_root}${loop} ] || cp $loop ${ch_root}${lib_dir}
    done
} 
read -p "Please input a command: " command
 
while [ "$command" != "quit" ];do
    if bincopy $command ;then
        libcopy $command
    fi
    read -p "Please input a command or quit: " command
done
[root@localhost data]#chroot /mnt/sysroot
bash-4.2# ls
bash-4.2# pwd 
/

到这里配置就完成了,现在只需新建一个虚拟机,将前一虚拟机sdb硬盘对应的vmdk文件增加进去开机即可

自制Linux

5.7.2 破解centos7密码

方法一:

启动时任意键暂停启动
按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
posted @ 2021-03-25 19:33  bestvae  阅读(223)  评论(1编辑  收藏  举报