一剑破万法!Linux 部署调度存储全精通
r使用 nginx 服务器部署yum仓库
1. 源码安装 nginx
# 安装依赖
[root@bogon ~ 14:25:03]# yum -y install gcc make pcre-devel zlib-devel
# 下载
[root@bogon ~ 14:26:56]# wget https://nginx.org/download/nginx-1.24.0.tar.gz
# 解压
[root@bogon ~ 14:27:03]# tar -xf nginx-1.24.0.tar.gz
# 配置
[root@bogon ~ 14:27:18]# cd nginx-1.24.0/
[root@bogon nginx-1.24.0 14:27:37]# ./configure --prefix=/usr/local/nginx
# 将所有的nginx相关文件存放在/usr/local/nginx
# 编译安装
[root@bogon nginx-1.24.0 14:28:01]# make && make install
[root@bogon nginx-1.24.0 14:28:30]# ls /usr/local/nginx/
conf html logs sbin
# 配置环境变量
[root@bogon nginx-1.24.0 14:28:56]# export PATH=$PATH:/usr/local/nginx/sbin/
[root@bogon nginx-1.24.0 14:29:10]# echo 'export PATH=$PATH:/usr/local/nginx/sbin/' >> ~/.bashrc
配置 nginx 服务
[root@server ~]# cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/nginx.service
[root@server ~]# 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@bogon nginx-1.24.0 14:31:16]# systemctl daemon-reload
[root@bogon nginx-1.24.0 14:31:21]# systemctl enable nginx.service --now
配置nginx允许查看文件清单
[root@bogon nginx-1.24.0 14:31:26]# vim /usr/local/nginx/conf/nginx.conf
......
http {
# 添加如下记录,其他保持不变
autoindex on;
......
[root@bogon nginx-1.24.0 14:32:33]# systemctl restart nginx
2. 发布软件仓库
[root@bogon nginx-1.24.0 14:32:51]# cd /usr/local/nginx/html/
[root@bogon html 14:33:09]# mkdir -p centos7/Packages
[root@bogon html 14:33:15]# cd centos7/Packages
[root@bogon Packages 14:33:19]# yum install -y httpd nginx --downloadonly --downloaddir=.
# 思考:为什么不使用yumdownloader下载?
[root@bogon Packages 14:33:28]# cd ..
[root@bogon centos7 14:33:33]# yum install -y createrepo
[root@bogon centos7 14:33:38]# 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. 配置客户端
[root@bogon ~ 14:35:09]# cd /etc/yum.repos.d/
[root@bogon yum.repos.d 14:35:19]# mkdir bakcup
[root@bogon yum.repos.d 14:35:23]# mv *repo bakcup
[root@bogon yum.repos.d 14:35:28]# ls
bakcup
[root@bogon yum.repos.d 14:35:31]# vim centos7.repo
[centos7]
name=centos7 test
baseurl=http://10.1.8.10/centos7
enabled=1
gpgcheck=0
[root@bogon yum.repos.d 14:36:07]# yum install -y httpd
[root@bogon yum.repos.d 14:36:17]# 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@bogon ~ 16:28:35]# yum install at
# 确认atd服务开机启动
[root@bogon ~ 16:38:32]# 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 16:38:32 CST; 3s ago
Main PID: 1340 (atd)
CGroup: /system.slice/atd.service
└─1340 /usr/sbin/atd -f
5月 19 16:38:32 bogon systemd[1]: Started Job spooling tools.
at 命令
语法:
at <timespec>
at命令从标准输入中读取要执行的命令。手动输入命令时,按ctrl+D完成输入。
示例:
[root@bogon ~ 16:40:51]# at now +5 minutes
at> echo hello world > /tmp/hello.log<EOT>
job 3 at Tue May 19 16:45:00 2026
输入完成,按ctrl+d完成。上面的字符’',就是安 ctrl+d 自动出现的。
如果输入错误,使用ctrl+backspace删除。
对于大量的命令或者错字敏感的命令,可以通过重定向和-f选项从脚本中读取,例如:
[root@bogon ~ 16:41:19]# vim myscript.sh
#!/bin/bash
date >> /tmp/myscript.log
echo hello myscript >> /tmp/myscript.log
[root@bogon ~ 16:43:44]# at now +5 minutes < myscript.sh
job 4 at Tue May 19 16:49:00 2026
[root@bogon ~ 16:44:04]# at now +100 minutes -f myscript.sh
job 5 at Tue May 19 18:25:00 2026
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
查看任务队列。
[root@bogon ~ 16:45:32]# at -l
4 Tue May 19 16:49:00 2026 a root
5 Tue May 19 18:25:00 2026 a root
[root@bogon ~ 16:45:40]# atq
4 Tue May 19 16:49:00 2026 a root
5 Tue May 19 18:25:00 2026 a root
atd提供26个队列,a到z,排的越后优先级越低。使用at命令使用-q选项指定队列。
[root@bogon ~ 16:47:34]# at -q b now +5 minutes < myscript.sh
job 7 at Tue May 19 16:53:00 2026
[root@bogon ~ 16:48:05]# atq
4 Tue May 19 16:49:00 2026 a root
5 Tue May 19 18:25:00 2026 a root
6 Tue May 19 16:52:00 2026 a root
7 Tue May 19 16:53:00 2026 b root
[root@bogon ~ 16:48:28]# at -l -q b
7 Tue May 19 16:53:00 2026 b root
# 时间到达后检测
[root@bogon ~ 16:51:07]# atq
5 Tue May 19 18:25:00 2026 a root
7 Tue May 19 16:53:00 2026 b root
[root@bogon ~ 16:52:13]# cat /tmp/hello.log
hello world
[root@bogon ~ 16:52:35]# cat /tmp/myscript.log
2026年 05月 19日 星期二 16:49:00 CST
hello myscript
2026年 05月 19日 星期二 16:53:00 CST
hello myscript
at -c
查看任务详细信息。
[root@bogon ~ 16:54:34]# at -c 5
......
${SHELL:-/bin/sh} << 'marcinDELIMITER313e1e7d'
#!/bin/bash
date >> /tmp/myscript.log
echo hello myscript >> /tmp/myscript.log
marcinDELIMITER313e1e7d
at -d/-r 或 atrm
删除任务。
[root@bogon ~ 16:55:45]# atrm 5
[root@bogon ~ 16:55:53]# atq
用户周期性计划任务
周期性计划任务是指在未来的一些时间周期性地执行一个命令或一系列命令。
crond 服务
Linux 系统中cron 提供周期性计划任务功能。
cron包括系统后台进程(crond)、crontab 命令和多个配置文件。
用户可以使用 crontab 命令管理自己的周期性作业。
如果cron job运行的命令没有重定向 stdout 和 stderr,crond进程将通过邮件发送给job所有者。
crontab 命令
crontab -l
查看周期性计划任务。
[shaka@bogon ~ 16:57:48]$ crontab -l
no crontab for shaka
crontab -e
该命令默认使用vi编辑周期性计划任务:
- 可以申明环境变量,格式为name=value,将影响声明之后的所有行。crontab使用的常规环境变量有SHELL和MAILTO。发送邮件需要额外的配置:mail服务器和smtp。
- 空行是允许的。
- 以#开头的行是注释行。
- 每一行是一个job。
默认编辑器可以通过EDITOR环境变量设定。
每一个jobs包涵6个部分:五个时间和一个要执行的命令,按以下顺序显示:
- 分钟
- 小时
- 几号
- 月份
- 星期几
- 命令
前五个字段全部使用相同的语法规则:
*,表示“无关紧要”,始终。- 数字可用于指定分钟数或小时数、日期或者工作日。对于工作日,0表示星期日,1表示星期一,2表示星期二,依此类推。7也表示星期曰。
- x-y:表示范围:x到y(含)。
- x,y:表示列表。列表也可以包含范围,例如,
5,10-13,17表示作业应当在每小时过去5分钟、10分钟、11分钟、12分钟、13分钟和17分钟后运行。 - */x,表示x的时间间隔,例如列中的*/7表示每七分钟运行一次作业。
- 最后一个区域是要执行的命令,命令通过/bin/sh执行,除非指定SHELL变量。如果命令中包涵未转义字符%,则表示开启新行,并且%后面所有字符作为标准输入。
月和周区域可以使用三字母简写单词,Jan,Feb,Mar和Mon,Tue。
示例:
-
以下作业将在每年2月2日上午9点准点执行命令/usr/local/bin/yearly_backup。
0 9 2 2 * /usr/local/bin/yearly_backup -
以下作业将在七月每周五的上午9点和下午4点间,每五分钟向该作业的所有者发送包含单词Chime的电子邮件。
*/5 9-16 * Jul 5 echo "Chime" -
以下作业将在每个工作日午夜前的两分钟运行命/usr/local/bin/daily_report。
58 23 * * 1-5 /usr/local/bin/daily_report -
以下作业将在每个工作日(周一到周五)上午9点执行mutt命令,从而将邮件消息Checkingin发送给收件人boss@example.com。
0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi boss, just checking in.
crontab -r
删除所有周期性计划任务。
[shaka@bogon ~ 17:02:04]$ crontab -r
no crontab for shaka
[shaka@bogon ~ 17:04:10]$ crontab -l
no crontab for shaka
crontab -u
root用户可以使用参数 -u username 管理其他用户周期性作业。
[root@bogon shaka 17:05:34]# crontab -u shaka -e
no crontab for shaka - using an empty one
[root@bogon shaka 17:07:53]# crontab -u shaka -l
no crontab for shaka
crontab filename
还可以使用crontab filename 命令从文件 filename 中读取的作业并替换当前所有作业。
[root@bogon shaka 17:11:48]# crontab -l
* * * * * date >>/tmp/date.log
[root@bogon shaka 17:12:58]# crontab mycron
[root@bogon shaka 17:13:03]# crontab -l
* * * * * date >>/tmp/date22.log
系统周期性计划任务
系统管理员使用配置文件定义系统周期性作业。crond守护进程会从多个配置文件中读取系统周期性计划作业:
- /etc/crontab
- /etc/cron.d/ 目录
- /etc/anacrontab
/etc/crontab
crond的配置文件比crontab命令定义的jobs多一个区域,在最后一个时间和command之间,指明使用哪个账户执行job。
[root@bogon shaka 17:13:05]# 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@bogon shaka 17:14:08]# ls /etc/cron.d
0hourly
[root@bogon shaka 17:14:33]# 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 由单独的一个进程anacron处理,在CentOS 7 及后续版本中,这个文件也由 crond 进程处理,目的是确保重要的工作总是被执行,即使系统关机或者其他重大事故。
/etc/anacrontab 定义了每天、每周、每个月要运行的任务。
周期性执行任务目录:
- 每天要执行的任务目录:/etc/cron.daily
- 每周要执行的任务目录:/etc/cron.weekly
- 每月要执行的任务目录:/etc/cron.monthly
[root@bogon shaka 17:14:33]# 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
[root@bogon shaka 17:15:00]# 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。
例如,START_HOURS_RANGE=3-22,作业只能在此时间段运行。
/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时间。
进程调度器可粗略分为两类:
- 实时调度器,系统中重要的进程由实时调度器调度,获得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 值查看
top 命令
ps命令
[root@bogon shaka 17:15:46]# 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@bogon shaka 17:19:29]# md5sum /dev/zero &
[1] 1659
[root@bogon shaka 17:19:50]# ps -o pid,nice,command $$ 1659
PID NI COMMAND
1555 0 bash
1659 0 md5sum /dev/zero
# $$ 代表当前终端中运行的 shell 程序 PID
实时调度器进程优先级和非实时调度器进程优先级对比如下:
结论: 优先级最低的实时调度器进程的优先级高于优先级最高的非实时调度器进程的优先级。
nice 命令
[root@bogon shaka 17:20:29]# 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 显示版本信息并退出
示例:
# nice值默认是10
[root@bogon shaka 17:21:43]# nice md5sum /dev/zero &
[1] 11650
[root@bogon shaka 17:23:38]# ps -o pid,nice,command
PID NI COMMAND
1257 0 -bash
1466 0 su - shaka
1507 0 su root
1508 0 bash
1526 0 su - shaka
1554 0 su root
1555 0 bash
11650 10 md5sum /dev/zero
11651 0 ps -o pid,nice,command
普通用户仅允许使用正数的nice值运行程序。
# 设置一个负数优先级
[shaka@bogon ~ 17:24:10]$ nice -n -2 md5sum /dev/zero &
[1] 11680
[shaka@bogon ~ 17:24:18]$ nice: 无法设置优先级: 权限不够
[shaka@bogon ~ 17:24:44]$ ps -o pid,nice,command 11680
PID NI COMMAND
11680 0 md5sum /dev/zero
# 设置一个正数优先级
[shaka@bogon ~ 17:24:58]$ nice -n 2 md5sum /dev/zero &
[2] 11686
[shaka@bogon ~ 17:25:29]$ ps -o pid,nice,command 11686
PID NI COMMAND
11686 2 md5sum /dev/zero
renice 命令
[shaka@bogon ~ 17:25:35]$ 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 显示版本信息并退出
修改上面示例中产生的进程的优先级。
[shaka@bogon ~ 17:25:57]$ renice -n 2 11680
11680 (进程 ID) 旧优先级为 0,新优先级为 2
[shaka@bogon ~ 17:26:37]$ ps -o pid,nice,command 11680
PID NI COMMAND
11680 2 md5sum /dev/zero
普通用户只能升高进程nice值,不能降低。
[shaka@bogon ~ 17:27:02]$ renice -n -2 11680
renice: 设置 11680 的优先级失败(进程 ID): 权限不够
[shaka@bogon ~ 17:27:15]$ ps -o pid,nice,command 11680
PID NI COMMAND
11680 2 md5sum /dev/zero
# 使用root用户调整
[root@bogon shaka 17:27:42]# renice -n -2 11680
11680 (进程 ID) 旧优先级为 2,新优先级为 -2
[root@bogon shaka 17:27:52]# renice -n -2 11686
11686 (进程 ID) 旧优先级为 2,新优先级为 -2
[root@bogon shaka 17:28:11]# ps -o pid,nice,command 11680 11686
PID NI COMMAND
11680 -2 md5sum /dev/zero
11686 -2 md5sum /dev/zero
top 命令
top 界面查看进程CPU使用率:55782和55785,CPU使用率非常接近,因为优先级一致。
在该界面中使用 r 指令设置进程nice值。
终止之前创建的3个md5sum进程。
[shaka@bogon ~ 17:29:57]$ pkill md5sum
[1] 已终止 nice md5sum /dev/zero
[2]- 已终止 nice -n -2 md5sum /dev/zero
[3]+ 已终止 nice -n 2 md5sum /dev/zero
实时调度策略
chrt 命令用于获取和设置实时调度器进程优先级,以及更改进程调度器。
[root@bogon shaka 17:30:41]# 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@bogon shaka 17:30:47]# 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@bogon shaka 17:31:07]# chrt -r 5 md5sum /dev/zero &
[1] 11782
[root@bogon shaka 17:32:47]# ps -o pid,cls,rtprio,command 11782
PID CLS RTPRIO COMMAND
11782 RR 5 md5sum /dev/zero
# 修改进程调度器和优先级
[root@bogon shaka 17:33:06]# chrt -f --pid 10 11782
[root@bogon shaka 17:33:27]# ps -o pid,cls,rtprio,command 11782
PID CLS RTPRIO COMMAND
11782 FF 10 md5sum /dev/zero
# 修改进程调度器为非实时
[root@bogon shaka 17:33:35]# chrt -o --pid 0 11782
[root@bogon shaka 17:34:00]# ps -o pid,cls,rtprio,command 11782
PID CLS RTPRIO COMMAND
11782 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@bogon shaka 17:34:08]# 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
结果说明:
- 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@bogon shaka 17:39:50]# df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 2000996 0 2000996 0% /dev
tmpfs 2013060 0 2013060 0% /dev/shm
tmpfs 2013060 11920 2001140 1% /run
tmpfs 2013060 0 2013060 0% /sys/fs/cgroup
/dev/mapper/centos-root 52403200 1643500 50759700 4% /
/dev/sda1 1038336 142252 896084 14% /boot
/dev/mapper/centos-home 152092100 33012 152059088 1% /home
tmpfs 402612 0 402612 0% /run/user/0
# -h选项,友好显示单位,单位进制是1024。
# -T选项,显示文件系统类型。
[root@bogon shaka 17:40:03]# 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.6G 49G 4% /
/dev/sda1 xfs 1014M 139M 876M 14% /boot
/dev/mapper/centos-home xfs 146G 33M 146G 1% /home
tmpfs tmpfs 394M 0 394M 0% /run/user/0
# -H选项,单位进制是1000。
[root@bogon shaka 17:40:29]# 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.7G 52G 4% /
/dev/sda1 1.1G 146M 918M 14% /boot
/dev/mapper/centos-home 156G 34M 156G 1% /home
tmpfs 413M 0 413M 0% /run/user/0
# 查看单个文件系统
[root@bogon shaka 17:40:49]# df -hT /boot
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda1 xfs 1014M 139M 876M 14% /boot
# 查看文件或目录存储在哪个设备
[root@bogon shaka 17:41:06]# df /tmp
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/centos-root 52403200 1643500 50759700 4% /
du 命令
查看目录和文件占用磁盘空间大小。
# 查看/boot目录及其子目录占用空间
[root@bogon shaka 17:42:25]# 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
109036 /boot
# 只查看/boot目录占用空间
[root@bogon shaka 17:43:54]# du -s /boot
109036 /boot
# -h 选项human方式显示size
[root@bogon shaka 17:44:06]# du -sh /boot
107M /boot
案例
查找根文件系统中哪个文件占用了大量空间。
# 环境准备,创建一个大小为4GB的文件:使用 0 填充该文件
[root@bogon shaka 17:44:17]# 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)已复制,12.331 秒,348 MB/秒
# 查看过程如下:
[root@bogon shaka 17:45:04]# du -sk /* |sort -n
......
32584 /etc
109036 /boot
332540 /var
5423436 /usr
[root@bogon shaka 17:45:20]# du -sk /usr/* |sort -n
......
131840 /usr/lib64
711328 /usr/lib
4460036 /usr/share
[root@bogon shaka 17:46:33]# du -sk /usr/share/* |sort -n
......
25204 /usr/share/vim
88680 /usr/share/locale
4227156 /usr/share/doc
[root@bogon shaka 17:47:58]# du -sk /usr/share/doc/* |sort -n
......
1060 /usr/share/doc/pam-1.1.8
1216 /usr/share/doc/postfix-2.10.1
4194316 /usr/share/doc/dhclient-4.2.5
[root@bogon shaka 17:48:48]# 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@bogon shaka 17:49:15]# 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@bogon ~ 16:15:24]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 100G 0 disk
# 格式化文件系统
[root@bogon ~ 16:15:37]# 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@bogon ~ 16:16:26]# mkdir /data
# 显示系统中所有文件系统
[root@bogon ~ 16:17:29]# blkid
# 显示系统中特定文件系统
[root@bogon ~ 16:17:38]# blkid /dev/sdb
/dev/sdb: UUID="53004aaf-3e91-4d2b-af9a-078778cfb0cc" TYPE="xfs"
# 挂载设备并验证
[root@bogon ~ 16:17:58]# mount /dev/sdb /data
# 验证
[root@bogon ~ 16:18:14]# df -h /data
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb 100G 33M 100G 1% /data
# 创建文件测试
[root@bogon ~ 16:18:48]# ls /data
file-00 file-01 file-02 file-03 file-04 file-05 file-06 file-07 file-08 file-09
查看系统当前所有挂载,可以看到挂载的详细信息。
[root@bogon ~ 16:18:52]# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,size=2000996k,nr_inodes=500249,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
......
# 括号中属性,是文件系统当前支持的功能。
[root@bogon ~ 16:19:02]# 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@bogon ~ 16:25:02]# umount /dev/sdbu
[root@bogon ~ 16:24:16]# df -h /data
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb 100G 33M 100G 1% /data
卸载失败处理
[root@bogon ~ 16:25:09]# mount /dev/sdb /data
[root@bogon ~ 16:25:47]# cd /data
[root@bogon data 16:25:54]# ls
file-00 file-01 file-02 file-03 file-04 file-05 file-06 file-07 file-08 file-09
# 提示挂载点正在忙碌
[root@bogon data 16:25:56]# umount /dev/sdb
umount: /data:目标忙。
(有些情况下通过 lsof(8) 或 fuser(1) 可以
找到有关使用该设备的进程的有用信息)
更多推荐




所有评论(0)