Linux 软件包源码安装、自建仓库、计划任务与进程调度详解
文章目录
Linux 软件包源码安装、自建仓库、计划任务与进程调度详解
引言
在完成 Linux 基础命令和网络配置的学习后,深入系统底层管理是运维进阶的必经之路。这包括:当 yum 仓库无法满足定制化需求时,如何源码编译安装;在内网隔离环境下,如何自建企业级 Yum 仓库;面对海量后台任务,如何利用 at 和 crontab 实现自动化调度;以及当多进程争抢 CPU 资源时,如何通过 nice 值和调度策略(chrt) 进行性能调优。本文将基于 CentOS 7 环境,对上述核心知识点展开详细剖析。
第一部分:软件包管理进阶——源码编译与自建仓库
一、 源码编译安装应用详解
并不是所有软件在官方源中都有最新版本或你需要的特定编译选项,源码编译安装提供了最大的自由度。以 Nginx 和 Cmatrix 为例,我们演示完整的编译流程。
1. Nginx 源码编译与 Systemd 服务化
第一步:安装编译依赖环境
源码编译需要编译工具(gcc、make)以及对应软件的开发库。Nginx 依赖正则表达式库 pcre 和压缩库 zlib。如果缺少 pcre-devel 和 zlib-devel,./configure 阶段会直接报错。
[root@server-xianyu ~ 18:37:33]# yum install -y gcc make pcre-devel zlib-devel
第二步:下载、解压与配置
从官方下载源码包,解压后进入目录。执行 ./configure --prefix=/usr/local/nginx。这里的 --prefix 决定了编译后的二进制、配置文件、日志等所有文件将统一存放在 /usr/local/nginx 目录下,方便统一管理。
[root@server-xianyu ~ 18:38:21]# wget https://nginx.org/download/nginx-1.24.0.tar.gz
[root@server-xianyu ~ 18:42:32]# tar -xf nginx-1.24.0.tar.gz
[root@server-xianyu ~ 18:43:34]# cd nginx-1.24.0/
[root@server-xianyu nginx-1.24.0 18:43:41]# ./configure --prefix=/usr/local/nginx
第三步:编译与安装
执行 make 命令,系统会开始根据配置生成二进制可执行文件。随后执行 make install,将生成的文件复制到 /usr/local/nginx 指定目录。此时,你会在该目录下看到 conf(配置)、html(网页)、logs(日志)、sbin(启动程序)四个标准目录。
[root@server-xianyu nginx-1.24.0 18:46:19]# make && make install
[root@server-xianyu nginx-1.24.0 18:46:19]# ls /usr/local/nginx/
conf html logs sbin
第四步:配置系统环境变量
安装完成后,nginx 命令并不能直接全局使用,因为 /usr/local/nginx/sbin/ 不在系统的 PATH 变量中。可以通过执行 export PATH=$PATH:/usr/local/nginx/sbin/ 临时生效。若想永久生效,需将该命令追加到 ~/.bashrc 文件中。
[root@server-xianyu nginx-1.24.0 18:47:00]# export PATH=$PATH:/usr/local/nginx/sbin/
[root@server-xianyu nginx-1.24.0 18:49:57]# echo 'export PATH=$PATH:/usr/local/nginx/sbin/' >> ~/.bashrc
第五步:转化为 Systemd 系统服务
为了让 Nginx 能像 sshd 一样支持 systemctl start 和开机自启,我们需要为其编写 Systemd 配置文件。
拷贝 sshd 的服务文件作为模版:cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/nginx.service。然后修改其 [Service] 区块,重点注意:
- Type=forking:因为 Nginx 启动时会派生出一个主进程(master)和多个工作进程(worker),主进程在后台运行,所以必须用
forking模式,否则 Systemd 会认为启动失败并自动回滚。 - ExecStart:指定 Nginx 的绝对启动路径。
- ExecReload 和 ExecStop:分别对应
nginx -s reload和nginx -s quit。
配置完成后,执行 systemctl daemon-reload 重载配置,即可通过 systemctl enable nginx --now 永久开机启动。
[root@server-xianyu nginx-1.24.0 18:51:13]# 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-xianyu nginx-1.24.0 18:54:41]# systemctl daemon-reload
[root@server-xianyu nginx-1.24.0 18:55:32]# systemctl enable nginx.service --now
2. Cmatrix 编译与互动操作
Cmatrix(黑客帝国代码雨屏保)的编译流程几乎与 Nginx 一致,它的依赖包是 ncurses-devel(提供终端绘图能力)。编译安装到 /usr/local/cmatrix 后,同样需要将 /usr/local/cmatrix/bin 加入环境变量。
运行时有几个非常有趣的键盘交互功能(笔记中明确提到):
- 即时改变颜色:在 cmatrix 运行期间,按下
shift + 1(!)变为红色,shift + 2(@)变为绿色,shift + 3(#)黄色,依次类推,无需重启程序。 - 自由调整速度:运行期间直接按键盘上的数字键
0到9,可以即时调整下落的字符速度。
[root@server-xianyu ~ 18:57:48]# yum -y install gcc make autoconf ncurses-devel
[root@server-xianyu ~ 19:02:22]# tar -xf cmatrix-1.2.tar.gz
[root@server-xianyu cmatrix-1.2 19:04:05]# ./configure --prefix=/usr/local/cmatrix
[root@server-xianyu cmatrix-1.2 19:04:19]# make && make install
[root@server-xianyu ~ 19:05:00]# export PATH=$PATH:/usr/local/cmatrix/bin
[root@server-xianyu ~ 19:06:21]# cmatrix

二、 自建企业级 Yum 仓库操作流程详解
当服务器处于没有外网的企业内网环境时,依靠阿里云或官方源就会失效。此时,我们需要自己构建一个离线的 Yum 仓库。完整的部署过程分为四个精密步骤:
1. 准备软件包(基础物料)
在一台有网络的机器上,使用 yum install --downloadonly --downloaddir . 下载指定的软件包。
- 区别解析:普通的
yum install会下载并安装;而--downloadonly告诉 yum:“只下载,绝不安装”。配合--downloaddir .将下载下来的.rpm包(包含所有依赖包)全部存放到当前目录的rpms子目录中。 - 将下载好的目录移动到 Nginx 服务器的网站发布目录下,例如:
/usr/local/nginx/html/tools/Packages。
[root@server-xianyu ~ 19:07:18]# mkdir rpms
[root@server-xianyu ~ 19:11:40]# cd rpms/
[root@server-xianyu rpms 19:12:31]# yum install --downloadonly --downloaddir . vim open-vm-tools vsftpd lrzsz bash-completion nginx httpd mariadb-server
[root@server-xianyu ~ 19:14:17]# mkdir /usr/local/nginx/html/tools
[root@server-xianyu ~ 19:14:48]# mv rpms /usr/local/nginx/html/tools/Packages
2. 创建仓库索引(repodata)
只把 .rpm 文件堆在一起是不能被客户端识别的。必须安装 createrepo 工具,并执行 createrepo /usr/local/nginx/html/tools/。
这一步会在 /usr/local/nginx/html/tools/ 下生成一个名为 repodata 的目录。这个目录包含了所有软件包信息的元数据(XML 文件),客户端 yum 命令会读取这个目录来知道仓库里到底有哪些包、它们存在什么依赖关系。
[root@server-xianyu ~ 19:15:21]# yum install -y createrepo
[root@server-xianyu ~ 19:16:11]# createrepo /usr/local/nginx/html/tools/
3. 发布仓库与开启目录清单(autoindex)
因为仓库是通过 HTTP 协议发布的,我们需要配置 Nginx。在 nginx.conf 的 http {} 块中添加一句关键配置 autoindex on;。如果不加这句,客户端访问仓库地址时会收到 403 Forbidden 错误,根本无法看到 Packages 和 repodata 目录。配置好后,执行 systemctl reload nginx 生效。
[root@server-xianyu ~ 19:16:52]# vim /usr/local/nginx/conf/nginx.conf
[root@server-xianyu ~ 19:22:25]# systemctl reload nginx.service
4. 客户端配置与验证
在客户端机器上,为了保证不走公网,需要将所有旧仓库文件移走:mkdir /etc/yum.repos.d/old && mv /etc/yum.repos.d/*repo old。然后新建 tools.repo 文件,内容必须明确指明 baseurl=http://server.laoma.cloud/tools/ 以及 enabled=1。
验证方法:在客户端执行 yum repolist。如果看到类似 tools/7/x86_64 centos7 tools from server... 的行,且后面有数字列表,说明内网仓库连接成功,可以直接 yum install 离线安装软件。
[root@client-xianyu ~ 19:24:00]# mkdir /etc/yum.repos.d/old
[root@client-xianyu ~ 19:24:31]# mv /etc/yum.repos.d/*repo /etc/yum.repos.d/old
[root@client-xianyu ~ 19:28:18]# cat << 'EOF' > /etc/yum.repos.d/tools.repo
> [tools]
> name=centos7 tools from server-xianyu
> baseurl=http://server-xianyu/tools/
> enabled=1
> gpgcheck=0
> EOF
[root@client-xianyu ~ 19:30:45]# yum repolist
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
源标识 源名称 状态
tools centos7 tools from server-xianyu 9
repolist: 9
第二部分:Linux 计划任务管理详解
Linux 的计划任务分为 一次性任务 和 周期性任务 两种,分别由 at 和 crontab 系统来实现。
一、 一次性计划任务(at 命令)
at 命令允许用户指定在未来某个时间点仅执行一次指令。
- 定义时间:时间格式非常灵活。例如
at now +5 minutes(5分钟后)、at teatime tomorrow(明天下午4点)、at 5 pm august 3 2026。输入命令后,按Ctrl + D结束输入。 - 查看任务队列:使用
atq或at -l查看当前排队的任务列表。系统使用了 26 个队列(a到z),字母越靠后(如b),优先级越低,默认为a队列。 - 删除与查看详情:使用
atrm 任务ID删除未执行的任务。使用at -c 任务ID可以查看该任务完整的 Shell 脚本内容,包含极其详细的执行环境变量。 - 用户权限控制:通过
/etc/at.allow和/etc/at.deny控制用户权限。如果at.allow存在,只有里面的用户能使用;若不存在,则at.deny中的用户被禁用。
二、 周期性计划任务(crontab 命令)
周期性计划任务由系统后台服务 crond 管理。用户通过 crontab -e(默认调用 vim)编辑配置文件,格式为 6 个字段:分钟 小时 日期 月份 星期 命令。
- 时间字段规则:
*:代表任意时间,始终匹配。x-y:代表一个连续范围(如9-16表示 9 点到 16 点)。x,y:代表离散列表(如5,10,15表示第 5、10、15 分钟)。*/x:代表步长,如*/5表示每隔 5 分钟执行一次。
- 棘手示例解析:
0 9 * * 1-5 mutt ...:表示周一至周五的 9:00 整执行。*/5 9-16 * Jul 5 echo "Chime":表示 7 月份每周五的 9:00 到 16:00 之间,每 5 分钟执行一次。
- ⚠️ 必坑点(笔记重点):在
crontab中,字符%在命令里代表换行符。因此,如果你想在日志里写入日期,如date +%Y%m%d,必须写成date +\%Y\%m\%d,否则日期会被截断或任务失败。 - 常用管理命令:
crontab -l:查看当前用户任务。crontab -r:清空当前用户所有任务。crontab -u laoma -e:root 用户 可以使用-u选项管理其他用户(如 laoma)的定时任务。
三、 系统级周期性任务与 Anacron
除了用户通过 crontab -e 管理任务,系统本身也定义了全局任务:
- /etc/crontab 文件:与用户 crontab 不同,它多了一个
user-name字段,用于明确指定该命令以哪个用户的身份去执行。 - /etc/cron.d/ 目录:系统建议将自定义的系统级任务放在此目录,避免因系统更新覆盖
/etc/crontab文件。例如/etc/cron.d/0hourly定义了每小时执行一次/etc/cron.hourly目录下的所有脚本(利用run-parts命令)。 - /etc/anacrontab 文件:它专门解决任务漏执行的问题。假设计划任务定在凌晨 3 点,但服务器当天正好维护关机了,Anacron 会在系统再次开机后,检查任务是否在预期周期内执行过。如果没执行,它会立刻补执行。
/etc/anacrontab中有两个极其重要的保护参数:RANDOM_DELAY=45(执行时随机延迟 45 分钟)和START_HOURS_RANGE=3-22(任务只能在凌晨 3 点到晚上 10 点之间执行)。这能有效避免刚开机时一大堆任务瞬间并发拉爆服务器 I/O。
第三部分:Linux 进程调度管理详解
在现代多任务操作系统中,CPU 的时间片是非常宝贵的。Linux 内核通过进程调度器来决定哪个进程获得 CPU。调度器分为实时调度器(抢占能力强,用于关键任务)和 非实时调度器(公平共享,用于普通任务)。
一、 非实时调度策略(Nice 值精细调节)
绝大多数普通进程(如 bash、vim、md5sum)运行在 SCHED_OTHER(即 SCHED_NORMAL)调度策略下。为了给这些普通进程划分相对优先级,系统引入了 Nice 值。
- 优先级范围:-20 到 19。
-20最高,19最低,默认值为0。 - 查看 Nice 值:在
top命令中,观察NI列;或者使用专用命令ps -o pid,nice,command过滤查看。 - 修改 Nice 值的限制(重点):
- 启动时指定:
nice -n 10 md5sum /dev/zero &。普通用户只能指定正数(降低优先级)。 - 运行中调整:
renice -n -2 55782。普通用户只能升高数值(让进程变得更谦让),不能降低数值(抢占 CPU)。只有 root 用户才有资格调整负数的 Nice 值,给核心业务提权。
- 启动时指定:
- 优先级的硬性铁律:系统内部有一个绝对的优先级金三角——实时调度策略优先级(199)高于一切非实时调度策略(-2019)。也就是说,哪怕你把普通进程调成最高的
-20,它依然抢不过一个实时优先级为1的进程。
二、 实时调度策略(chrt 命令)
对于那些对响应延迟有着极高要求的程序(如工业控制、音频处理、金融高频交易系统),必须将其提升至实时调度策略。
- 实时策略类型:
- SCHED_RR(轮转调度):同优先级的实时进程,轮流分配固定的时间片(默认 100ms),时间片用完则换下一个。
- SCHED_FIFO(先入先出):只要有 CPU,该进程就会一直执行,直到它自己被 I/O 阻塞或者遇到更高优先级的实时进程来抢占它。
- chrt 命令使用:
chrt -r 5 md5sum /dev/zero &:以SCHED_RR策略和优先级 5 启动进程。chrt -f --pid 10 56225:将已运行的进程改为SCHED_FIFO策略,优先级 10。chrt -o --pid 0 56225:将进程还原回普通的SCHED_OTHER。
- 系统保命机制(sysctl 参数):如果放任实时进程霸占 CPU,一旦它陷入死循环,SSH 就无法响应,系统会“假死”。为了保护系统不被实时进程撑死,内核提供了底层硬限制:
kernel.sched_rt_period_us = 1000000:CPU 周期为 1 秒。kernel.sched_rt_runtime_us = 950000:在该 1 秒内,实时进程最多只能占用 0.95 秒。剩下的 0.05 秒必须释放给非实时进程(如你的 SSH 终端)。kernel.sched_rr_timeslice_ms = 100:定义了SCHED_RR进程的单次时间片长度为 100 毫秒。- 管理员可以通过
sysctl -w kernel.sched_rt_runtime_us=0将其修改为0,这意味着“彻底禁止任何实时进程获取 CPU 时间”,作为系统死锁时的终极抢救手段。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)