内容目录

系统启动流程

CentOS7

file

启动运行级别

什么是运行级别

运行级别:指操作系统当前正在运行的功能的级别

System V init运行级别 systemd目标名称 作用
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 重启

调整运行级别

  • systemd使用target而不是runlevels有两个主要目标:
    • multi-user.target:类似于运行级别3
    • graphical.target:类似于运行级别5

1.查看系统默认运行级别

systemctl get-default

3.要设置默认目标,请运行

systemctl set-default TARGET.target
ll /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37 3月  12 11:59 /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target

Systemd管理

systemd的由来

  • linux一直以来都是采用init进程作为祖宗进程,但是init有两个缺点
    • 1.启动时间长,init进程是串行启动,只有前一个进程启动完,才会启动下一个进程
    • 2.启动脚本复杂,初始化系统后会加载很多脚本,脚本都会处理各自的情况,并且脚本多而杂
  • centos5启动速度慢,串行启动过程,无论进程相互之间有无依赖关系
  • centos6启动速度有所改进,有依赖的进程之间依次启动而其他与之没有依赖关系的则并行同步启动
  • centos7所有进程无论有无依赖关系则都是并行启动(当然很多时候进程没有真正启动而是只有一个信号或者说是标记而已,在真正利用的时候才会真正启动)

file

  • systemd即为system daemon守护进程,systemd主要解决上文的问题而诞生
  • systemd的目标是,为系统的启动和管理提供一套完整的解决方案

systemd的优势

  • 1.最新系统都采用systemd管理。RedHat7、Centos7、Ubuntu15
  • 2.Centos7支持开机并行启动服务,显著提高开机启动效率
  • 3.Centos7关机只关闭正在运行的服务,而Centos6全部都关闭一次
  • 4.Centos7服务的启动与停止不在使用脚本进行管理,也就是/etc/init.d下不在有脚本
  • 5.Centos7使用systmed解决原有模式缺陷,比如原有service不会关闭程序产生的子进程

systemd相关命令

  • /usr/lib/systemd/system/:服务启停文件,通过systemctl命令对其文件启动、停止、重载等操作
    • systemctl start crond:启动服务
    • systemctl stop crond:停止服务
    • systemctl restart crond:重启服务
    • sysemctl reload crond:重载服务
    • systemctl enable crond:服务设定为开机运行
    • systemctl disable crond:服务设定为开机不运行
    • systemctl daemon-reload crond:创建服务启动文件需要重载配置
    • systemctl list-unit-files:查看各个级别下服务的启动与禁用
    • systemctl is-enabled crond:查看特定服务是否为开机自启动
    • systemctl is-active crond:查看服务是否在运行

systemd管理Nginx

1.编译nginx

wget http://nginx.org/download/nginx-1.21.1.tar.gz
tar xf nginx-1.21.1.tar.gz
cd nginx-1.21.1
./configurs --prefix=/usr/local/nginx-1.21.1 \
    --with-http_ssl_module \
    --with-http_stub_status_module
make && make install
ln -s /usr/local/nginx-1.21.1 /usr/local/nginx

2.常规启动nginx

/usr/local/nginx/sbin/nginx  # 启动
/usr/local/nginx/sbin/nginx -s reload  # 重载
/usr/local/nginx/sbin/nginx -s stop  # 关闭

3.systemd管理nginx

# Before、After:定义启动顺序
  # Before=xxx.service  代表本服务在xxx.service启动之前启动
  # After=xxx.service  代表本服务在xxx.service之后启动
  # Wants=xxx.service  代表该服务启动了,它依赖的服务也会被启动;依赖的服务如果被停止,不会影响本服务

cat  /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)"
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)"

[Install]
WantedBy=multi-user.target

救援模式

场景1-忘记超级管理员密码

  • 如何使用单用户模式进行变更系统密码?以cetos7系统为例
    • 第一步:重启linux系统主机并出现引导界面时,按下键盘上的e键进入内核编辑界面
    • 第二步:在linux6这行的后面添加enforceing=0 init=/bin/bash,然后按Ctrl + x进入
    • 第三步:进入到系统的单用户模式,依次输入以下命令,重启操作系统,使用新密码登录
    • 1.mount -o rw,remount /:默认/分区只读,重新挂载为读写模式
    • 2.echo "123" | passwd --stdin root:非交互方式修改密码
    • 3.exec /sbin/init:重新引导系统

场景2-系统损坏需要备份数据

  • 当系统坏了,无法登录系统,但需要把里面的数据复制出来,怎么办?
    • 第一步:挂载ISO镜像文件,修改BIOS,调整DVD光盘为第一引导
    • 第二步:选择Troubleshooting,继续选择Rescue a CentOS system救援模式
    • 第三步:输入1,然后执行chroot /mnt/sysimage,挂载真实系统
    • 第四步:备份系统中的数据文件至其他磁盘

场景3-误删除grub文件修复

  • Centos误删除grub文件如何进行修复
    • 第一步:模拟误删除故障 rm -rf /boot/grub2 && reboot
    • 第二步:系统无法正常启动起来(提示grub找不到)
    • 第三步:然后按照之前的操作进入救援模式,执行chroot /mnt/sysimage挂载真实的操作系统
    • 第四步:使用grub2相关命令修复
    • grub2-install /dev/sda 重新添加mbr引导
    • grub2-mkconfig -o /boot/grub2/grub.cfg 重新生成配置
    • ls /boot/grub2/grub.cfg

系统优化

调整yum源

  • 默认安装系统对外提供的yum仓库为国外站点,可以将站点修改为国内,加速软件包下载
# base
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# epel
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

关闭防火墙

  • 默认情况下需关闭防火墙,以避免影响后期服务的使用
    • 云主机:有硬件提供的安全组产品来提供防护
    • 物理机:一般公司在入口层面都会有硬件防火墙
# firewalld
systemctl stop firewalld
systemctl disable firewalld
# selinux
setenforce 0  # 临时关闭
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config  # 永久关

ulimit资源限制

  • ulimit命令可以对系统资源进行控制
    • -u:限制普通用户所能打开的最大进程数目(每个用户)
    • -n:限制用户能分配到的文件描述符数量
限制进程最大数量

1.限制每个用户最大能打开3个进程

ulimit -u 3

2.登录用户启动多个进程测试

su - xxx
sleep 1000 &
[1]10857
sleep 1000 &
[1]10858
sleep 1000 &
-bash:fork:retry:资源暂时不可用
-bash:fork:retry:资源暂时不可用
-bash:fork:retry:资源暂时不可用
限制打开文件数量

1.限制进程最大打开文件描述符为10

ulimit -n 10

2.编写python程序模拟打开多个文件

cat open_file.py
#!/usr/bin/env python
import time,os
from threading import Thread

print(os.getpid())

def new_file(n):
    with open('%s.file' %n,mode='wt') as f1:
        time.sleep(2000)

if __name__ == "__main__":
    count=1
    while True:
        Thread(target=new_file,args=(count,)).start()
        count+=1
        time.sleep(2)
# 运行
python open_file.py

3.等待一段时间,当程序打开文件超过限制,则会提示异常

Exception in thread Thread-9:
Traceback(most recent call last):
  File "/usr/lib64/pytho2.7/threading.py",line 812,in _bootstrap_inner
  File "/usr/lib64/pytho2.7/threading.py",line 765,in run
  File "open_file.py",line 9, in new_file
IOError:[Errno 24] Too many open files: '9.file'
调整ulimit限制参数
  • 通过ulimit方式调整打开的文件数量,以及进程数量,都是临时操作,所以要进行永久配置
    • 配置文件:/etc/security/limits.conf
    • 调整模式:
    • soft:软限制,超过则提示
    • hard:硬限制,超过则停止
tail /etc/security/limits.conf
# max user processes
* soft nproc 60000
* hard nproc 60000
# open files
* soft nofile 100000
* hard nofile 100000

# 避免出现如下错误
tail -f /var/log/dmesg
VFS:file-max limit 200 reached

# 系统级资源限制(针对整个操作系统)
echo "fs.file-max = 20000" >> /etc/sysctl.conf
sysctl -p
最后修改日期: 2024年10月4日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。