使用 nginx 服务器部署yum仓库

1. 源码安装 nginx

# 安装依赖
[root@server ~ 09:29:39]# yum -y install gcc make pcre-devel zlib-devel 

# 下载nginx包
[root@server ~ 09:31:06]# wget https://nginx.org/download/nginx-1.24.0.tar.gz

# 解压
[root@server ~ 09:31:43]# tar -xf nginx-1.24.0.tar.gz
[root@server ~ 09:47:28]# ls
anaconda-ks.cfg  nginx-1.24.0  nginx-1.24.0.tar.gz 

# 配置nginx
[root@server ~ 09:47:29]# cd nginx-1.24.0/
[root@server nginx-1.24.0 09:47:34]# ./configure --prefix=/usr/local/nginx
# 将所有的nginx相关文件存放在/usr/local/nginx

# 编译安装(&&的意思是如果make出错就不执行后面的make install)
[root@server nginx-1.24.0 09:47:51]# make && make install
[root@server nginx-1.24.0 09:48:11]#  ls /usr/local/nginx/
conf  html  logs  sbin

配置 nginx 服务

[root@server nginx-1.24.0 09:48:20]# cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/nginx.service
[root@server nginx-1.24.0 09:48:28]# vim /etc/systemd/system/nginx.service
[Unit]
Description=Nginx server daemon

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit

[Install]
WantedBy=multi-user.target

在这里插入图片描述

#重启服务
[root@server nginx-1.24.0 09:49:36]# systemctl daemon-reload 
[root@server nginx-1.24.0 09:49:53]# systemctl enable nginx.service --now

配置nginx允许查看文件清单

[root@server nginx-1.24.0 09:50:18]# vim /usr/local/nginx/conf/nginx.conf
......
http {
    # 添加如下记录,其他保持不变
    autoindex on;
......
[root@server nginx-1.24.0 09:50:53]# systemctl restart nginx

在这里插入图片描述

2. 发布软件仓库

#创建一个单独的Packages目录来存放软件包
[root@server nginx-1.24.0 09:51:01]# cd /usr/local/nginx/html/
[root@server html 09:51:07]# mkdir -p centos7/Packages
[root@server html 09:51:15]# cd centos7/Packages
[root@server Packages 09:51:25]# yum install -y httpd nginx --downloadonly --downloaddir=.
[root@server Packages 09:51:40]# ls
apr-1.4.8-7.el7.x86_64.rpm                  httpd-tools-2.4.6-99.el7.centos.1.x86_64.rpm
apr-util-1.5.2-6.el7_9.1.x86_64.rpm         mailcap-2.1.41-2.el7.noarch.rpm
centos-indexhtml-7-9.el7.centos.noarch.rpm  nginx-1.20.1-10.el7.x86_64.rpm
gperftools-libs-2.6.1-1.el7.x86_64.rpm      nginx-filesystem-1.20.1-10.el7.noarch.rpm
httpd-2.4.6-99.el7.centos.1.x86_64.rpm      openssl11-libs-1.1.1k-7.el7.x86_64.rpm

为什么不使用yumdownloader下载?

因为yumdownloader只会下载单独的软件包,不会下载配套的依赖

#下载元数据并放在当前目录
[root@server Packages 09:51:45]# cd ..
[root@server centos7 09:51:52]# yum install -y createrepo
[root@server centos7 09:52:09]# createrepo .
Spawning worker 0 with 5 pkgs
Spawning worker 1 with 5 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

3. 配置客户端

#先备份一下客户端的yum的仓库配置文件到bakcup
[root@client ~ 09:28:35]#  cd /etc/yum.repos.d/
[root@client yum.repos.d 09:54:07]# mkdir bakcup
[root@client yum.repos.d 09:54:14]# mv *repo bakcup
[root@client yum.repos.d 09:54:18]# ls
bakcup

#配置一个测试,让其可以从服务端的cenos7文件下载软件包
[root@client yum.repos.d 09:54:20]# vim centos7.repo
[centos7]
name=centos7 test
baseurl=http://10.1.8.10/centos7
enabled=1
gpgcheck=0

在这里插入图片描述

#查看系统配置的软件仓库
[root@client yum.repos.d 09:57:57]# yum repolist

在这里插入图片描述

#下载httpd软件包
[root@client yum.repos.d 09:56:58]# yum install -y httpd
[root@client yum.repos.d 09:57:34]# systemctl enable httpd --now
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

Linux 计划任务管理

一次性计划任务

一次性计划任务是指在未来某个时间点执行一个命令或一系列命令。

atd 服务

Linux 系统中at提供一次性计划任务功能。

at不是一个单独的工具,包括系统后台进程(atd)和一系列与后台进程atd交互的命令(例如at atq等等)。

# 使用以下命令安装
[root@server ~ 12:50:21]# yum install at

# 确认atd服务开机启动
[root@server ~ 12:51:09]# systemctl status atd
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since 二 2026-05-19 10:29:21 CST; 2h 21min ago
 Main PID: 4026 (atd)
   CGroup: /system.slice/atd.service
           └─4026 /usr/sbin/atd -f

519 10:29:21 server.ggg.cloud systemd[1]: Started Job spooling tools.

at 命令

语法:

at <timespec> 

at命令从标准输入中读取要执行的命令。手动输入命令时,按ctrl+D完成输入。

示例:

#一分钟后执行echo hello world > /tmp/hello.log
[root@server ~ 12:51:16]# at now +1 minutes
at> echo hello world > /tmp/hello.log
at> <EOT>
job 3 at Tue May 19 12:52:00 2026
#监控/tmp/hello.log日志
[root@server ~ 12:54:02]# tail -f /tmp/hello.log
hello world
......

输入完成,按ctrl+d完成。上面的字符’'显示结束

如果输入错误,使用ctrl+backspace删除。

对于大量的命令或者错字敏感的命令,可以通过重定向和-f选项从脚本中读取,例如:

#提前撰写一个脚本
[root@server ~ 12:51:49]# vim myscript.sh
#!/bin/bash
date >> /tmp/myscript.log
echo hello myscript >> /tmp/myscript.log
#告诉系统一分钟后执行一次这个脚本
[root@server ~ 12:54:53]# at now +1 minutes < myscript.sh
job 4 at Tue May 19 12:56:00 2026
#监控/tmp/myscript.log日志
[root@server ~ 12:55:08]# tail -f /tmp/myscript.log
2026年 05月 19日 星期二 12:56:00 CST
hello myscript
......

timespec允许多种时间组合。例如,02:00 pm,15:43,或者teatime,后接日期或未来的天数。

示例:

  • now +5 hours
  • teatime tomorrow (teatime 16:00)
  • noon +4 days(noon 12:00)
  • 5 pm august 3 2016

时间定义参考文档 /usr/share/doc/at/timespec

at -l 或 atq

查看任务队列。

[ggg@server ~ 12:59:30]$ at -l
5	Tue May 19 13:00:00 2026 a ggg
6	Tue May 19 13:01:00 2026 a ggg

[ggg@server ~ 12:59:34]$ atq
5	Tue May 19 13:00:00 2026 a ggg
6	Tue May 19 13:01:00 2026 a ggg

atd提供26个队列,a到z,排的越后优先级越低。使用at命令使用-q选项指定队列。

#提前撰写一个脚本
[ggg@server ~ 13:00:27]$ vim myscript.sh
#!/bin/bash
date >> /tmp/myscript.log
echo hello myscript >> /tmp/myscript.log
#告诉系统一分钟后帮我自动跑 myscript.sh 这个脚本,任务放到 b 队列里
[ggg@server ~ 13:01:34]$ at -q b now +1 minutes < myscript.sh
job 7 at Tue May 19 13:02:00 2026

# 时间到达后检测
[ggg@server ~ 13:04:10]$ cat /tmp/hello.log 
hello world

[ggg@server ~ 13:04:14]$ cat /tmp/myscript.log
2026年 05月 19日 星期二 12:56:00 CST
hello myscript
at -c

查看任务详细信息。

[ggg@server ~ 13:05:18]$ at -l
8	Tue May 19 13:10:00 2026 a ggg
[ggg@server ~ 13:05:24]$ at -c 8
#!/bin/sh
# atrun uid=1000 gid=1000
# mail root 0
umask 2
XDG_SESSION_ID=3; export XDG_SESSION_ID
HOSTNAME=server.ggg.cloud; export HOSTNAME
SHELL=/bin/bash; export SHELL
HISTSIZE=1000; export HISTSIZE
USER=ggg; export USER
......
at -d/-r 或 atrm

删除任务

[ggg@server ~ 13:05:32]$ at -l
8	Tue May 19 13:10:00 2026 a ggg
[ggg@server ~ 13:06:05]$ atrm 8
[ggg@server ~ 13:06:14]$ atq

限定用户

/etc/at.allow 和 /etc/at.deny 控制哪些人可以使用atd服务。

匹配规则如下:

  1. 如果 /etc/at.allow 文件存在,只有该文件中提到的用户可以使用at服务。
  2. 如果/etc/at.allow文件不存在,只有/etc/at.deny文件中提到的用户禁止使用at服务。

查看当前配置:允许所有用户使用at服务。

[root@server ~ 12:56:49]# ls /etc/at.*
/etc/at.deny
您在 /var/spool/mail/root 中有新邮件
[root@server ~ 13:09:13]# cat /etc/at.deny

用户周期性计划任务

周期性计划任务是指在未来的一些时间周期性地执行一个命令或一系列命令。

crond 服务

Linux 系统中cron 提供周期性计划任务功能。

cron包括系统后台进程(crond)、crontab 命令和多个配置文件。

用户可以使用 crontab 命令管理自己的周期性作业。

如果cron job运行的命令没有重定向 stdout 和 stderr,crond进程将通过邮件发送给job所有者。

crontab 命令

crontab -l

查看周期性计划任务。

[ggg@server ~ 10:55:17]$ crontab -l
* * * * * date >> /tmp/date.log
crontab -e

该命令默认使用vi编辑周期性计划任务:

#查看格式
[ggg@server ~ 11:41:39]$ cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

#进入配置任务界面
[ggg@server ~ 11:41:49]$ crontab -e

示例:

  • 在每年2月2日上午9点准点将hi写入/tmp/test1.log

    0 9 2 2 * echo "hi" >> /tmp/test1.log
    
  • 以下作业将在七月每周五的上午9点和下午4点间,每五分钟向该作业的所有者发送包含单词Chime的电子邮件。

    */5 9-16 * Jul 5 echo "Chime"
    

示例:

#设置配置界面为彩色
[ggg@server ~ 11:41:49]$ export EDITOR=vim
[ggg@server ~ 12:24:50]$ crontab -e
0 9 2 2 * echo "hi" >> /tmp/test1.log
[ggg@server ~ 12:28:42]$ crontab -l
0 9 2 2 * echo "hi" >> /tmp/test1.log
* * * * * date >> /tmp/test2.log

# 监控日志
[ggg@server ~ 12:28:57]$ chmod +x /tmp/test2.log
[ggg@server ~ 12:29:22]$ tail -f /tmp/test2.log
2026年 05月 19日 星期二 12:29:01 CST
......
crontab -r

删除所有周期性计划任务

[ggg@server ~ 12:29:31]$ crontab -r
[ggg@server ~ 12:30:24]$ crontab -l
no crontab for ggg
crontab -u

root用户可以使用参数 -u username 管理其他用户周期性作业。

[root@server ~ 11:19:47]# crontab -u ggg -e

在这里插入图片描述

[root@server ~ 12:33:30]# crontab -u ggg -r
[root@server ~ 12:34:25]# crontab -u ggg -l
no crontab for ggg
crontab filename

还可以使用crontab filename 命令从文件 filename 中读取的作业并替换当前所有作业。

#最开始有一个作业
[ggg@server ~ 12:41:47]$ crontab -l
* * * * * date >> /tmp/text1.log
#先创建一个文件
[ggg@server ~ 12:42:31]$ touch mycron.txt
[ggg@server ~ 12:42:57]$ vim mycron.txt
#将下面这段写入
* * * * * echo hello >> /tmp/test.log
#直接导入系统,替换当前用户的所有定时任务(直接覆盖原有任务)
[ggg@server ~ 12:43:27]$ crontab mycron.txt
#在root用户下查看ggg的任务,只有覆盖后的定时任务
[root@server ~ 12:43:49]# crontab -u ggg -l
* * * * * echo hello >> /tmp/test.log

系统周期性计划任务

系统管理员使用配置文件定义系统周期性作业。crond守护进程会从多个配置文件中读取系统周期性计划作业:

  • /etc/crontab
  • /etc/cron.d/ 目录
  • /etc/anacrontab

/etc/crontab

[root@server ~ 10:57:00]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

/etc/cron.d

系统周期性作业应始终在 /etc/cron.d/ 目录中创建自定义crontab文件,防止cronie更新后覆盖/etc/crontab文件。其他应用也会将系统周期性作业存放在该目录。

/etc/cron.d/0hourly定义了每小时要执行的任务: run-parts /etc/cron.hourly

作用:每小时将 /etc/cron.hourly目录下所有脚本按顺序执行一次。

[root@server ~ 11:18:54]# ls /etc/cron.d
0hourly
[root@server ~ 11:19:20]# cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly

/etc/anacrontab

/etc/anacrontab 定义了每天、每周、每个月要运行的任务。

周期性执行任务目录:

  • 每天要执行的任务目录:/etc/cron.daily
  • 每周要执行的任务目录:/etc/cron.weekly
  • 每月要执行的任务目录:/etc/cron.monthly
[root@server ~ 11:19:30]# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1	5	cron.daily		nice run-parts /etc/cron.daily
7	25	cron.weekly		nice run-parts /etc/cron.weekly
@monthly 45	cron.monthly		nice run-parts /etc/cron.monthly

/etc/anacrontab 使用语法 NAME=value 配置 anacrontab

/etc/anacrontab 每行包涵4个区域:

  • period in days,按重复计划运行的作业的间隔天数。该字段接受整数或宏作为值。例如,宏@daily相当于整数1,它表示每天执行该作业。同样,宏@weekly相当于整数7,它表示每周执行该作业。
  • delay in minutes,在启动该作业前,crond守护进程应等待的时间。
  • job-identifier,此为/var/spool/anacron中的文件名称,用于检查该作业是否已运行。
  • command,要执行的命令。

Linux 进程调度管理

进程调度器

现代计算机系统中既包含只有单个CPU且任何时候都只能处理单个指令的低端系统到具有几百个cpu、每个cpu有多个核心的高性能超级计算机,可以并行执行几百个指令。所有这些系统都有一个共同点:系统进程线程数量超出了CPU数量。

Linux系统看起来可以同时执行多个进程,多个进程轮流使用CPU。内核使用进程调度器决定如何分配CPU时间。为了更好地运行,进程调度器必须平衡不同的条件,快速决定下个执行的进程,确保进程获得公平的CPU时间:

  • 按时间片轮转(10-20ms为1个时间片 )
  • 按优先级调度,允许高优先级进程获取更多的共享CPU时间,低优先级进程获取更少的共享CPU时间。

image-20221123141333303 image-20221123141413611

进程调度器可粗略分为两类:

  • 实时调度器,系统中重要的进程由实时调度器调度,获得CPU能力强
  • 非实时调度器,系统中大部分进程由非实时调度器调度,获得CPU能力弱。

实时调度器

实时调度器支持的调度策略:

  • SCHED_RR,roundrobin 轮询调度策略。相同优先级的进程轮流获取相同的CPU时间。
  • SCHED_FIFO,先入先出调度策略。被分配到的CPU时间的进程会一直运行,直到被IO阻塞(也称为sched_yield),会被高优先级进程抢占。

实时调度器管理的进程运行优先级范围如下:

在这里插入图片描述

即使系统运行实时调度程序,也要保持可响应状态,至少ssh可用。

管理员可以使用以下两个sysctl参数,阻止实时调度策略下运行的程序占用所有CPU时间:

  • kernel.sched_rt_runtime_us,在kernel.sched_rt_period_us内实时态进程可使用的共享CPU时间,默认值950000,也就是0.95秒。设置为0,实时调度进程将无法获取CPU时间。

  • kernel.sched_rt_period_us,CPU分配的周期时间,单位us,默认值1000000,也就是1秒。

    从kernel.sched_rt_period_us 中减去 kernel.sched_rt_runtime_us 后的剩余时间交给非实时调度器SCHED_NORMAL调度。

  • kernel.sched_rr_timeslice_ms,在SCHED_RR调度下的进程每次轮询获取的CPU时间,单位ms,默认值100,也就是0.1秒,有效范围1-100。

非实时调度器

非实时调度器支持的调度策略:

  • SCHED_NORMAL标准的轮询方式时间共享调度,也称为SCHED_OTHER
  • SCHED_BATCH,针对批量方式执行的进程策略。不像 SCHED_NORMAL 频繁竞争,任务可以长时间运行
  • SCHED_IDLE,用于执行非常低的优先级应用。使用 SCHED_IDLE 调度策略运行的进程比nice 19运行的进程优先级还低。

管理进程优先级

非实时调度策略

nice 值

常规系统上运行的大多数进程都使用 SCHED_OTHER 调度策略。由于并非所有进程都同等重要,因此可以为使用SCHED_OTHER调度策略运行的程序指定相对优先级,称为nice值。

有40种不同级别的nice值,范围 -20(最高优先级)到 19(最低优先级):

  • nice 值越高,代表优先级越低,获取CPU能力越弱
  • nice 值越低,代表优先级越高,获取CPU能力越强

注意: 当不存在CPU资源竞争时,即使nice值高的进程也可以获得足够CPU资源。

nice 值查看

ps命令

[root@server ~ 13:43:21]# ps -o nice,cmd $(pgrep systemd)
 NI CMD
  0 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
  0 /usr/lib/systemd/systemd-journald
  0 /usr/lib/systemd/systemd-udevd
  0 /usr/lib/systemd/systemd-logind

默认情况下,子进程将继承父进程的nice值,通常为0。

[root@server ~ 13:43:28]# md5sum /dev/zero &
[1] 1255
[root@server ~ 13:44:14]# ps -o pid,nice,command $$ 1255
   PID  NI COMMAND
  1205   0 -bash
  1255   0 md5sum /dev/zero
 # $$ 代表当前终端中运行的 shell 程序 PID

实时调度器进程优先级和非实时调度器进程优先级对比如下:

结论: 优先级最低的实时调度器进程的优先级高于优先级最高的非实时调度器进程的优先级。

nice 命令
[root@server ~ 13:45:00]# nice --help
用法:nice [选项] [命令 [参数]...]
Run COMMAND with an adjusted niceness, which affects process scheduling.
With no COMMAND, print the current niceness.  Niceness values range from
-20 (most favorable to the process) to 19 (least favorable to the process).

Mandatory arguments to long options are mandatory for short options too.
  -n, --adjustment=N   add integer N to the niceness (default 10)
      --help		显示此帮助信息并退出
      --version		显示版本信息并退出

注意:您的shell 内含自己的nice 程序版本,它会覆盖这里所提及的相应
版本。请查阅您的shell 文档获知它所支持的选项。

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
请向<http://translationproject.org/team/zh_CN.html> 报告nice 的翻译错误
要获取完整文档,请运行:info coreutils 'nice invocation'

示例:

# nice值默认是10
[root@server ~ 13:46:33]# nice md5sum /dev/zero &
[2] 1263

#查看nice值
[root@server ~ 13:46:50]# ps -o pid,nice,command
   PID  NI COMMAND
  1205   0 -bash
  1255   0 md5sum /dev/zero
  1263  10 md5sum /dev/zero
  1266   0 ps -o pid,nice,command
#或者用top查看

在这里插入图片描述

普通用户仅允许使用正数的nice值运行程序。

# 设置一个负数优先级
[ggg@server ~ 13:49:14]$ nice -n -2 md5sum /dev/zero &
[1] 1292
[ggg@server ~ 13:49:16]$ nice: 无法设置优先级: 权限不够
[ggg@server ~ 13:49:25]$ ps -o pid,nice,command 1292
   PID  NI COMMAND
  1292   0 md5sum /dev/zero

# 设置一个正数优先级
[ggg@server ~ 13:49:38]$ nice -n 2 md5sum /dev/zero &
[2] 1294
[ggg@server ~ 13:49:54]$ ps -o pid,nice,command 1294
   PID  NI COMMAND
  1294   2 md5sum /dev/zero
renice 命令

作用:修改nice值

[ggg@server ~ 13:50:08]$ renice --help

用法:
 renice [-n] <优先级> [-p|--pid] <pid>...
 renice [-n] <优先级>  -g|--pgrp <pgid>...
 renice [-n] <优先级>  -u|--user <用户>...

选项:
 -g, --pgrp <id>        将参数解释为进程组 ID
 -n, --priority <数字>  指定 nice 增加值
 -p, --pid <id>         将参数解释为进程 ID (默认)
 -u, --user <name|id>   将参数解释为用户名或用户 ID
 -h, --help             显示帮助文本并退出
 -V, --version          显示版本信息并退出

修改上面示例中产生的进程的优先级。

[ggg@server ~ 13:51:02]$ renice -n 10 1294
1294 (进程 ID) 旧优先级为 2,新优先级为 10
[ggg@server ~ 13:52:49]$ ps -o pid,nice,command 1294
   PID  NI COMMAND
  1294  10 md5sum /dev/zero
#也可以用top查看

普通用户只能升高进程nice值不能降低

[ggg@server ~ 13:53:40]$ renice -n 2 1294
renice: 设置 1294 的优先级失败(进程 ID): 权限不够
#降级失败nice值依然是10
[ggg@server ~ 13:54:24]$ ps -o pid,nice,command 1294
   PID  NI COMMAND
  1294  10 md5sum /dev/zer
 
# 使用root用户调整
[root@server ~ 14:05:48]# renice -n 2 1294
1294 (进程 ID) 旧优先级为 10,新优先级为 2
[ggg@server ~ 14:06:33]$ ps -o pid,nice,command 1294
   PID  NI COMMAND
  1294   2 md5sum /dev/zero
top 命令

top 界面查看进程CPU使用率

在这里插入图片描述

实时调度策略

chrt

chrt 命令用于获取和设置实时调度器进程优先级,以及更改进程调度器。

[root@server ~ 14:06:55]# chrt --help
Show or change the real-time scheduling attributes of a process.

Set policy:
 chrt [options] <priority> <command> [<arg>...]
 chrt [options] --pid <priority> <pid>

Get policy:
 chrt [options] -p <pid>

Policy options:
 -b, --batch          set policy to SCHED_BATCH
 -d, --deadline       set policy to SCHED_DEADLINE
 -f, --fifo           set policy to SCHED_FIFO
 -i, --idle           set policy to SCHED_IDLE
 -o, --other          set policy to SCHED_OTHER
 -r, --rr             set policy to SCHED_RR (default)

Scheduling options:
 -R, --reset-on-fork       set SCHED_RESET_ON_FORK for FIFO or RR
 -T, --sched-runtime <ns>  runtime parameter for DEADLINE
 -P, --sched-period <ns>   period parameter for DEADLINE
 -D, --sched-deadline <ns> deadline parameter for DEADLINE

Other options:
 -a, --all-tasks      operate on all the tasks (threads) for a given pid
 -m, --max            show min and max valid priorities
 -p, --pid            operate on existing given pid
 -v, --verbose        display status information

 -h, --help     显示此帮助并退出
 -V, --version  输出版本信息并退出

示例

# 查看进程优先级范围,chrt不能用于调整非实时进程nice值优先级。
[root@server ~ 14:07:56]# chrt -m
SCHED_OTHER min/max priority	: 0/0
SCHED_FIFO min/max priority	: 1/99
SCHED_RR min/max priority	: 1/99
SCHED_BATCH min/max priority	: 0/0
SCHED_IDLE min/max priority	: 0/0
SCHED_DEADLINE min/max priority	: 0/0

# 以SCHED_RR调度器和优先级为5运行md5sum进程
[root@server ~ 14:08:16]# chrt -r 5 md5sum /dev/zero &
[1] 1355
[root@server ~ 14:08:42]# ps -o pid,cls,rtprio,command 1355
   PID CLS RTPRIO COMMAND
  1355  RR      5 md5sum /dev/zero

在这里插入图片描述

# 修改进程调度器和优先级
[root@server ~ 14:09:34]# chrt -f --pid 10 1355 
[root@server ~ 14:09:53]# ps -o pid,cls,rtprio,command 1355
   PID CLS RTPRIO COMMAND
  1355  FF     10 md5sum /dev/zero


# 修改进程调度器为非实时
[root@centos7 ~]# chrt -o --pid 0 56225 
[root@server ~ 14:10:28]# ps -o pid,cls,rtprio,command 1355
   PID CLS RTPRIO COMMAND
  1355  TS      - md5sum /dev/zero

在这里插入图片描述

Linux 文件系统基本管理

识别文件系统和设备

Linux 中设备

在Linux中,对存储设备的访问由特殊类型文件-块设备(block)提供。挂载块设备前,必须先使用文件系统对其进行格式化。

块设备文件与其他的设备文件一起存储在/dev目录中。设备文件是由操作系统自动创建的。

常见的不同类型接口块设备:

  • 接口:SATA/SAS/USB/SCSI,名称:/dev/sda、/dev/sdb …
  • 接口:virtio-blk,虚拟机磁盘,名称:/dev/vda、/dev/vdb …
  • 接口:NVMe SSD,名称:/dev/nvme0n1、/dev/nvme1n1…
  • 接口:SD/MMC/eMMC,名称:/dev/mmcblk0,/dev/mmcblk1 …

通常,不会将整个存储设备格式化为一个文件系统中,而是将硬盘驱动器划分为多个逻辑存储单元, 这些单元称为分区。各种分区使用不同的文件系统进行格式化或用于不同的用途。 例如,一个分区可以包含用户目录,而另一个分区可以包含系统数据和日志。 如果用户用数据填充主目录分区,则系统分区可能仍然有可用空间。

  • /dev/sda第一个分区为/dev/sda1,第二个分区为/dev/sda2,以此类推。
  • /dev/nvme0n1p1,/dev/nvme0n1p2
  • /dev/vda1,/dev/vda2
  • /dev/xvda1,/dev/xvda2

Linux 文件系统

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。

Linux服务器上的文件是按文件系统层次结构访问的。

管理文件系统需要:

  • 确定存储设备的空间使用情况以及文件系统层次结构中受影响的目录。
  • 存储设备发生故障,而您需要知道哪些文件系统存在风险。

要让文件系统的内容在文件系统层次结构中可用,必须将它挂载到一个空目录上,该目录被称为挂载点

参考学习:这里

/linux 对应教室。

查看设备和文件系统

lsblk 命令

查看块设备使用情况。

[root@server ~ 14:40:56]# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0   200G  0 disk 
├─sda1            8:1    0     1G  0 part /boot
└─sda2            8:2    0   199G  0 part 
  ├─centos-root 253:0    0    50G  0 lvm  /
  ├─centos-swap 253:1    0   3.9G  0 lvm  [SWAP]
  └─centos-home 253:2    0 145.1G  0 lvm  /home
sr0              11:0    1   4.4G  0 rom  
nvme0n1         259:0    0   100G  0 disk 

结果说明:

  • NAME :块设备名。
  • MAJ:MIN :主要(MAJ)和次要(MIN)设备号。
  • RM :指明设备是否是可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备。
  • SIZE :本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB。
  • RO :该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。
  • TYPE :本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。
  • MOUNTPOINT :本栏指出设备挂载的挂载点。
df 命令

查看文件系统使用情况。

[root@server ~ 14:41:41]# df
文件系统                    1K-块    已用      可用 已用% 挂载点
devtmpfs                  2000920       0   2000920    0% /dev
tmpfs                     2013036       0   2013036    0% /dev/shm
tmpfs                     2013036   11740   2001296    1% /run
tmpfs                     2013036       0   2013036    0% /sys/fs/cgroup
/dev/mapper/centos-root  52403200 1756852  50646348    4% /
/dev/mapper/centos-home 152092100   33020 152059080    1% /home
/dev/sda1                 1038336  142356    895980   14% /boot
tmpfs                      402608       0    402608    0% /run/user/0


# -h选项,友好显示单位
# -T选项,显示文件系统类型。
[root@server ~ 15:05:00]# df -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
devtmpfs                devtmpfs  2.0G     0  2.0G    0% /dev
tmpfs                   tmpfs     2.0G     0  2.0G    0% /dev/shm
tmpfs                   tmpfs     2.0G   12M  2.0G    1% /run
tmpfs                   tmpfs     2.0G     0  2.0G    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs        50G  1.7G   49G    4% /
/dev/mapper/centos-home xfs       146G   33M  146G    1% /home
/dev/sda1               xfs      1014M  140M  875M   14% /boot
tmpfs                   tmpfs     394M     0  394M    0% /run/user/0


# -H选项(有单位),单位进制是1000。
[root@server ~ 15:06:53]# df -H
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 2.1G     0  2.1G    0% /dev
tmpfs                    2.1G     0  2.1G    0% /dev/shm
tmpfs                    2.1G   13M  2.1G    1% /run
tmpfs                    2.1G     0  2.1G    0% /sys/fs/cgroup
/dev/mapper/centos-root   54G  1.8G   52G    4% /
/dev/mapper/centos-home  156G   34M  156G    1% /home
/dev/sda1                1.1G  146M  918M   14% /boot
tmpfs                    413M     0  413M    0% /run/user/0


# 查看单个文件系统
[root@server ~ 15:07:47]# df -hT /boot
文件系统       类型  容量  已用  可用 已用% 挂载点
/dev/sda1      xfs  1014M  140M  875M   14% /boot

# 查看文件或目录存储在哪个设备
[root@server ~ 15:07:52]# df /tmp
文件系统                   1K-块    已用     可用      已用%    挂载点
/dev/mapper/centos-root 52403200 1756852 50646348    4% /
du 命令

查看目录和文件占用磁盘空间大小。

# 查看/boot目录及其子目录占用空间
[root@server ~ 15:08:06]# du /boot
0	/boot/efi/EFI/centos
0	/boot/efi/EFI
0	/boot/efi
2400	/boot/grub2/i386-pc
3176	/boot/grub2/locale
2504	/boot/grub2/fonts
8096	/boot/grub2
4	/boot/grub
109140	/boot


# 只查看/boot目录占用空间
[root@server ~ 15:08:40]# du -s /boot
109140	/boot

# -h 选项human方式显示size
[root@server ~ 15:08:53]# du -sh /boot
107M	/boot
案例

查找根文件系统中哪个文件占用了大量空间。

#添加大文件前
[root@server ~ 15:41:26]# df -h

在这里插入图片描述

# 环境准备,创建一个大小为4GB的文件:使用 0 填充该文件
[root@server ~ 15:09:10]# dd if=/dev/zero of=/usr/share/doc/dhclient-4.2.5/bigfile-4G  bs=1M count=4096
记录了4096+0 的读入
记录了4096+0 的写出
4294967296字节(4.3 GB)已复制,16.2561 秒,264 MB/秒
#添加后查看
[root@server ~ 15:39:35]# df -h

在这里插入图片描述

# 查看过程如下:
[root@server ~ 15:20:34]# du -sk /* |sort -n
......
11740	/run
21416	/root
32604	/etc
109140	/boot
342300	/var
5504240	/usr

[root@server ~ 15:20:47]# du -sk /usr/* |sort -n
......
133760	/usr/lib64
720316	/usr/lib
4480172	/usr/share

[root@server ~ 15:21:20]# du -sk /usr/share/* |sort -n
......
19816	/usr/share/perl5
25204	/usr/share/vim
99232	/usr/share/locale
4233724	/usr/share/doc

[root@server ~ 15:21:36]# du -sk /usr/share/doc/* |sort -n
......
1340	/usr/share/doc/pcre-devel-8.32
4376	/usr/share/doc/gcc-4.8.5
4194316	/usr/share/doc/dhclient-4.2.5

[root@server ~ 15:21:59]# du -sk /usr/share/doc/dhclient-4.2.5/* |sort -n
4	/usr/share/doc/dhclient-4.2.5/dhclient6.conf.example
4	/usr/share/doc/dhclient-4.2.5/dhclient.conf.example
4	/usr/share/doc/dhclient-4.2.5/README.dhclient.d
4194304	/usr/share/doc/dhclient-4.2.5/bigfile-4G


# 方法二:
[root@server ~ 15:22:32]# find / -size +100M 2>/dev/null
/proc/kcore
/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
/sys/devices/pci0000:00/0000:00:0f.0/resource1
/var/cache/yum/x86_64/7/updates/gen/primary_db.sqlite
/usr/lib/locale/locale-archive
/usr/share/doc/dhclient-4.2.5/bigfile-4G

Linux 思想:尽可能使用各种小工具完成一个复杂任务。每个小工具专注于特定的功能,KISS 原则(Keep It Simple, Stupid)。

挂载和卸载文件系统

环境准备

# 虚拟机添加一块硬盘/dev/sdb
[root@server ~ 15:49:42]# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0   200G  0 disk 
├─sda1            8:1    0     1G  0 part /boot
└─sda2            8:2    0   199G  0 part 
  ├─centos-root 253:0    0    50G  0 lvm  /
  ├─centos-swap 253:1    0   3.9G  0 lvm  [SWAP]
  └─centos-home 253:2    0 145.1G  0 lvm  /home
sdb               8:16   0   100G  0 disk 
sr0              11:0    1   4.4G  0 rom 
# 格式化文件系统
[root@server ~ 15:49:48]# mkfs.xfs /dev/sdb
meta-data=/dev/sdb               isize=512    agcount=4, agsize=6553600 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=26214400, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=12800, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

挂载文件系统

当需要适用文件系统的时候,通过mount命令挂载。

mount 命令语法:

mount [-fnrsvw] [-t vfstype] [-o options] device mountpoint

选项说明:

  • -t vfstype,指明文件系统类型。
  • -o options,指明挂载选项。
  • device,指明要挂载的具有文件系统的设备,可以通过UUID=<uuid>、<device>、LABEL=<label>、PARTLABEL=<label>、PARTUUID=<uuid>等方式指明。例如,/dev/sdb,UUID=“f20547b2-df53-46e5-b526-a8744be26231” 。
  • mountpoint,指明挂载点位置。
# 创建挂载点
[root@server ~ 15:52:51]# mkdir /data

# 显示系统中所有文件系统
[root@centos7 ~]# blkid
/dev/sr0: UUID="2022-07-26-15-09-17-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos" 
/dev/sda1: UUID="fe0caa07-0ffa-4031-90b0-89b5a803d3d3" TYPE="xfs" 
/dev/sda2: UUID="l2hy8c-g1VR-K3fa-GRWc-caq1-RC3l-xL0fvk" TYPE="LVM2_member" 
/dev/mapper/centos-root: UUID="adc43c6d-8544-4223-a5f4-71b77858ef33" TYPE="xfs" 
/dev/sdb: UUID="2638639b-9028-4ada-9e6f-795cb9810d21" TYPE="xfs" 
/dev/mapper/centos-swap: UUID="a9dd9b0c-b1e4-4d30-8aae-35720462971c" TYPE="swap" 
/dev/mapper/centos-home: UUID="950d197b-4b5f-4135-9da9-cd7fffdc3177" TYPE="xfs"

# 显示系统中特定文件系统
[root@server ~ 16:15:21]# blkid /dev/sdb
/dev/sdb: UUID="2638639b-9028-4ada-9e6f-795cb9810d21" TYPE="xfs" 

#挂载前
[root@server ~ 16:15:38]# df -h /data
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   50G  1.6G   49G    4% /

# 挂载设备到/data并验证
[root@server ~ 16:16:26]# mount /dev/sdb /data
# 或者用UUID进行挂载
[root@centos7 ~6:16:26]# mount UUID="f20547b2-df53-46e5-b526-a8744be26231" /data

# 验证
[root@server ~ 16:16:56]# df -h /data
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb        100G   33M  100G    1% /data


# 创建文件测试
[root@server ~ 16:17:03]# touch /data/file-{00..10}
#此时/data中有文件并且存放在/dev/sdb中
[root@server ~ 16:18:14]# ls /data
file-00  file-01  file-02  file-03  file-04  file-05  file-06  file-07  file-08  file-09  file-10

查看系统当前所有挂载和详细信息


[root@server ~ 16:18:18]# mount
......
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
configfs on /sys/kernel/config type configfs (rw,relatime)
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,noquota)
......
# 括号中属性,是文件系统当前支持的功能。

[root@server ~ 16:20:07]# mount |grep ^/dev
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,noquota)
/dev/mapper/centos-home on /home type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sda1 on /boot type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sdb on /data type xfs (rw,relatime,attr2,inode64,noquota)

卸载文件系统

当文件系统不使用的时候,通过 umount 命令卸载。

umount命令语法:

umount device | dir

可以通过指定设备或者挂载点,卸载文件系统。

示例:

[root@server ~ 16:21:14]# umount /dev/sdb
# 或者
[root@centos7 ~16:21:14]# umount /data
#又回到原来的挂载点
[root@server ~ 16:21:42]# df -h /data
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   50G  1.6G   49G    4% /
#此时ls /data查不到任何文件,因为上面已经将文件存放到了/dev/sdb硬盘中,不在当前的/dev/mapper/centos-root中
[root@server ~ 16:21:49]# ls /data

卸载失败处理

#先挂载
[root@server ~ 16:22:40]# mount /dev/sdb /data
#让一个终端进入该文件夹
[root@server ~ 16:24:27]# cd /data
[root@server data 16:25:06]# ls
file-00  file-01  file-02  file-03  file-04  file-05  file-06  file-07  file-08  file-09  file-10

# 提示挂载点正在忙碌
[root@server data 16:25:30]# umount /dev/sdb
umount: /data:目标忙。
        (有些情况下通过 lsof(8) 或 fuser(1) 可以
         找到有关使用该设备的进程的有用信息)
lsof 命令

lsof,list open files,用于查看系统打开的文件。

lsof安装

[root@server data 16:25:53]# yum -y install lsof

lsof 命令语法:

lsof [options] [names]

常用选项:

  • -i,查看打开的 Internet 文件。例如 -i @10.1.8.20:22-i :80
  • -p pid,根据进程PID查找特定进程打开的文件。
  • -u uid,根据用户 uid查找特定用户打开的文件。
  • names,是文件或者文件系统设备。
# 新开窗口查看哪个进程在使用挂载点
[root@server ~ 16:26:58]# lsof /data
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    1157 root  cwd    DIR   8,16      171   64 /data

#让进入/data的终端退出再尝试卸载文件系统
[root@server ~ 16:28:29]# umount /dev/sdb
[root@server ~ 16:28:34]# df -h /data
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   50G  1.6G   49G    4% /
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐