Linux 软件包源码安装、自建仓库、计划任务与进程调度详解

引言

在完成 Linux 基础命令和网络配置的学习后,深入系统底层管理是运维进阶的必经之路。这包括:当 yum 仓库无法满足定制化需求时,如何源码编译安装;在内网隔离环境下,如何自建企业级 Yum 仓库;面对海量后台任务,如何利用 at 和 crontab 实现自动化调度;以及当多进程争抢 CPU 资源时,如何通过 nice 值和调度策略(chrt) 进行性能调优。本文将基于 CentOS 7 环境,对上述核心知识点展开详细剖析。


第一部分:软件包管理进阶——源码编译与自建仓库

一、 源码编译安装应用详解

并不是所有软件在官方源中都有最新版本或你需要的特定编译选项,源码编译安装提供了最大的自由度。以 NginxCmatrix 为例,我们演示完整的编译流程。

1. Nginx 源码编译与 Systemd 服务化

第一步:安装编译依赖环境
源码编译需要编译工具(gccmake)以及对应软件的开发库。Nginx 依赖正则表达式库 pcre 和压缩库 zlib。如果缺少 pcre-develzlib-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 的绝对启动路径。
  • ExecReloadExecStop:分别对应 nginx -s reloadnginx -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(#) 黄色,依次类推,无需重启程序。
  • 自由调整速度:运行期间直接按键盘上的数字键 09,可以即时调整下落的字符速度。
[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

image-20260729190659164


二、 自建企业级 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.confhttp {} 块中添加一句关键配置 autoindex on;。如果不加这句,客户端访问仓库地址时会收到 403 Forbidden 错误,根本无法看到 Packagesrepodata 目录。配置好后,执行 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 的计划任务分为 一次性任务周期性任务 两种,分别由 atcrontab 系统来实现。

一、 一次性计划任务(at 命令)

at 命令允许用户指定在未来某个时间点仅执行一次指令。

  • 定义时间:时间格式非常灵活。例如 at now +5 minutes(5分钟后)、at teatime tomorrow(明天下午4点)、at 5 pm august 3 2026。输入命令后,按 Ctrl + D 结束输入。
  • 查看任务队列:使用 atqat -l 查看当前排队的任务列表。系统使用了 26 个队列(az),字母越靠后(如 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 -eroot 用户 可以使用 -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 值精细调节)

绝大多数普通进程(如 bashvimmd5sum)运行在 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 时间”,作为系统死锁时的终极抢救手段。
Logo

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

更多推荐