前言
本文档提供在虚拟机内部署 openEuler 环境及实现系统任务自动化的操作指南。内容涵盖虚拟机创建、openEuler 安装步骤,以及 Cron 工具与 Systemd Timers 框架的对比分析,旨在为系统管理员构建健壮、可靠的自动化工作流。
OpenEuler 虚拟化部署与 Systemd 自动化运维指南。涵盖 VMware 环境下的系统安装配置及任务调度方案对比。通过备份脚本实例,分析传统 Cron 与现代 Systemd Timer 在可靠性、日志管理及状态监控上的差异,推荐生产环境采用 Systemd 实现高可用自动化。

本文档提供在虚拟机内部署 openEuler 环境及实现系统任务自动化的操作指南。内容涵盖虚拟机创建、openEuler 安装步骤,以及 Cron 工具与 Systemd Timers 框架的对比分析,旨在为系统管理员构建健壮、可靠的自动化工作流。
本章节介绍创建一个功能完备的 openEuler 虚拟机的基础步骤,从初始设置到安装后验证。操作说明基于 VMware Workstation,核心原理适用于其他虚拟化平台。
首要步骤是获取 openEuler 的安装介质。官方 ISO 镜像文件可从 openEuler 社区网站下载。选择 x86_64 架构版本,适用于标准的 Intel 或 AMD 64 位处理器。
启动新建虚拟机向导
打开 VMware Workstation,通过 Ctrl + N 或选择'文件' > '新建虚拟机'来启动向导。选择'自定义 (高级)'配置类型,以便对虚拟硬件设置进行精细控制。
指定磁盘文件位置 确认或更改虚拟磁盘文件 (.vmdk) 的存储位置。默认情况下,它被放置在与虚拟机配置文件相同的目录中。
指定磁盘容量 openEuler 安装程序需要最低限度的磁盘空间。分配一个大于 26 GB 的磁盘大小是必要的。为了获得更大的灵活性,建议分配 50 GB 或更大的值。同时,选择'将虚拟磁盘拆分成多个文件'。
选择磁盘类型 'SCSI'磁盘类型是与 LSI Logic 控制器配对的默认推荐。它为通用虚拟机提供了良好的性能。
选择 I/O 控制器类型 推荐的默认选项'LSI Logic SAS'是 SCSI 控制器的一个可靠且兼容的选择。接受默认值并继续。
网络类型 对于网络连接,'使用网络地址转换 (NAT)'是一个常见且方便的选择。它允许虚拟机通过宿主机的 IP 地址访问外部网络。
内存分配 为虚拟机分配内存 (RAM)。虽然最低要求可能更低,但对于开发或测试工作负载,建议分配 8 GB (8192 MB) 的内存。内存和 CPU 资源不足是导致虚拟机性能不佳的主要原因。
处理器配置 此步骤对性能至关重要。强烈建议分配至少两个处理器核心。将'处理器数量'设置为 1,'每个处理器的内核数量'设置为 2,总计 2 个内核。
命名虚拟机并定义位置 为虚拟机提供一个描述性的名称,例如'openEuler-Dev'。在宿主机上选择一个具有足够磁盘空间的存储位置。
选择客户机操作系统 由于 openEuler 是一个与 CentOS 有相同技术渊源的 Linux 发行版,选择'Linux'作为客户机操作系统,并选择'CentOS 8 64 位'作为版本是一个高度兼容的选项。
客户机操作系统安装来源 选择'安装程序光盘映像文件 (iso)'选项。点击'浏览…'按钮,并导航至已下载的 openEuler ISO 文件的存放位置。
虚拟机硬件兼容性 通常建议保留默认选项,这能确保与不同版本的 VMware 产品有广泛的兼容性。
虚拟机配置完成后,下一步是安装 openEuler 操作系统。
开启虚拟机 从 VMware 库中选择新创建的虚拟机,然后点击'开启此虚拟机'。它将从配置的 ISO 镜像启动。
语言选择 安装程序加载后,第一个屏幕会提示选择语言。选择'中文'和'简体中文 (中国)'以获得本地化界面。
网络和主机名 点击'网络'。标记为'以太网 (ens160)'或类似名称的网络适配器默认是关闭的。将开关切换到'ON'。这将激活网络连接。一旦启用,虚拟机应该会从 VMware NAT 服务获取一个 IP 地址。
安装目的地 点击'安装目的地'。此部分定义了操作系统将安装在何处。对于基本设置,无需进行任何更改。安装程序将自动选择虚拟磁盘并使用自动分区。
Root 账户 点击'Root 账户'来为超级用户账户设置密码。勾选'启用 Root 账户'复选框。在两个字段中输入一个强密码。
开始安装 在'安装概要'中的所有项目都配置完毕且不再显示警告图标后,'开始安装'按钮将变为可用状态。点击它以启动安装过程。
重启系统 安装过程将需要几分钟时间。完成后,将出现一个'重启系统'按钮。点击它以将虚拟机重启到新安装的 openEuler 系统中。
重启后,执行初次登录并验证系统连接性。
ip a 命令,找到虚拟机的 IP 地址。系统登录
系统将启动到一个登录提示符。输入用户名 root 和在安装过程中配置的密码。至此,openEuler 虚拟环境已完全准备就绪。
在现代服务器运维中,自动化是提升效率、确保系统稳定性的核心原则。本节将深入探讨 openEuler 中两个主要的自动化工具:经典的 Cron 守护进程和现代化的 Systemd Timers。
设想一个常见的运维场景:维护一个重要的网站,该网站要求每日凌晨对其文件和数据库进行备份。这些运维挑战凸显了对一个健壮的自动化框架的需求。本分析将聚焦于 Cron 和 Systemd,引导从传统的任务调度,迈向现代化的、可监督的、可靠的自动化范式。
Cron:经典的时间驱动任务调度器Cron 是一个在类 Unix 操作系统中历史悠久且广为人知的任务调度守护进程。它的任务列表(通常称为 crontab)语法直观,非常适合执行简单的、周期性的任务。
crontab 命令用于管理用户专属的任务列表。
crontab -e:编辑当前用户的 crontab 文件。crontab -l:列出当前用户的 crontab 条目。crontab -r:移除当前用户的 crontab 文件。核心语法:一个 crontab 条目由五个时间与日期字段和一个待执行的命令组成。
# ┌───────────── 分钟 (0 - 59)
# │ ┌───────────── 小时 (0 - 23)
# │ │ ┌───────────── 月份中的日期 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12)
# │ │ │ │ ┌───────────── 星期几 (0 - 6) (星期天为 0)
# │ │ │ │ │
* * * * * /path/to/command
语法示例:
*/5 * * * * /usr/bin/echo "hello" >> /tmp/cron.log
30 2 * * * /root/backup.sh
0 0 1 * * /scripts/monthly_report.sh
核心优点:简单性和极低的资源消耗。 显著缺点:缺乏对任务执行状态进行监控和管理的内置机制。
Systemd:现代的系统与服务管理器Systemd 是 openEuler 及所有现代 Linux 发行版的核心系统与服务管理器。它不仅是启动系统的第一个进程 (PID 1),更是一个功能全面的框架,用于管理服务、设备、日志以及定时任务。
核心概念:Unit 文件
Systemd 通过称为 Unit 文件的配置单元来管理所有资源。对于定时自动化,主要关注两种类型的单元:
.service (服务单元):此单元定义了要执行什么操作。它描述了如何启动、停止和重启一个程序或脚本,封装了任务本身。.timer (定时器单元):此单元定义了何时执行操作。它指定了一个时间表或一个基于时间的事件。当定时器的条件满足时,它会激活其对应的 .service 单元。核心命令:systemctl
systemctl 命令是与 Systemd 交互的主要接口。
systemctl start/stop unit_name:立即启动或停止一个单元。systemctl enable/disable unit_name:设置或取消一个单元在系统启动时自动运行。systemctl status unit_name:显示一个单元的详细状态。journalctl -u unit_name:查看由特定单元生成的所有日志。通过将一个定时任务视为一个可管理的服务,Systemd 提供了强大的监控、自动恢复和集中式日志管理能力。
本节通过构建一个每日备份示例网站的系统,来亲身体验这两种工具的差异。
backup.sh)首先,需要一个执行备份操作的脚本。
创建模拟的网站和备份目录 执行以下命令来创建一个源目录(网站)和一个目标目录(备份)。
mkdir -p /var/www/html
echo "<html><body><h1>My Awesome Website</h1></body></html>" > /var/www/html/index.html
mkdir /root/backups
创建备份脚本
使用文本编辑器(如 vim)创建脚本文件。
vim /root/backup.sh
将以下内容插入文件。该脚本会归档网站目录,并将状态消息写入一个日志文件。
#!/bin/bash
## 定义变量
SOURCE_DIR="/var/www/html"
BACKUP_DIR="/root/backups"
LOG_FILE="/var/log/backup.log"
BACKUP_FILENAME="website-backup-$(date +%Y-%m-%d_%H-%M-%S).tar.gz"
## 带时间戳的日志记录函数
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
log_message "INFO: Starting backup process…"
## 创建源目录的 gzip 压缩包
## -C 选项在添加文件前改变目录,避免在归档中包含完整路径
tar -czf "${BACKUP_DIR}/${BACKUP_FILENAME}" -C "$(dirname ${SOURCE_DIR})" "$(basename ${SOURCE_DIR})"
## 检查 tar 命令的退出码
if [ $? -eq 0 ]; then
log_message "SUCCESS: Backup created successfully at ${BACKUP_DIR}/${BACKUP_FILENAME}"
# 此处可添加清理旧备份的逻辑
else
log_message "ERROR: Backup process failed!"
exit 1 # 以非零状态码退出,表示失败
fi
手动测试脚本 直接从命令行执行脚本,以确保其按预期工作。
/root/backup.sh
执行后,验证在 /root/backups 目录中是否已创建一个新的 .tar.gz 文件,以及 /var/log/backup.log 文件中是否包含相应的成功消息。
赋予执行权限 使脚本可执行,以便系统能够运行它。
chmod +x /root/backup.sh
Cron 的调度 (传统方式)此方法使用 crontab 进行调度。
编辑 Crontab 为 root 用户打开 crontab 编辑器。
crontab -e
添加调度规则
在编辑器中,添加以下行。此规则指示 Cron 在每天凌晨 2:00 执行 /root/backup.sh 脚本。
0 2 * * * /root/backup.sh
保存文件并退出编辑器。
验证 列出 crontab 的内容,以确认任务已正确添加。
crontab -l
Cron 方案的局限性:
backup.sh 脚本失败(例如,以非零状态码退出),Cron 不会重试。失败将持续存在,直到被手动处理。Systemd Timer 的调度 (现代方式)此方法使用 Systemd 重新构建任务,为其增加了监督和可靠性。这需要创建两个独立的单元文件。
第一步:创建服务单元 (backup.service)
此文件定义了如何运行备份。它将脚本封装成一个可管理的服务。创建文件 /etc/systemd/system/backup.service。
vim /etc/systemd/system/backup.service
粘贴以下配置:
[Unit]
Description=Daily Website Backup Service
Documentation=man:systemd.service(5)
[Service]
Type=simple
ExecStart=/root/backup.sh
# 关键的可靠性特性:如果服务失败则重启
Restart=on-failure
RestartSec=1min
[Install]
WantedBy=multi-user.target
[Unit] 部分:
Description: 对单元的人类可读描述,会出现在状态输出中。[Service] 部分:
Type=simple: 适用于主进程由 ExecStart 指定且不会 fork 的服务。ExecStart: 要执行的命令的完整路径。Restart=on-failure: 这是一个关键指令。 它指示 Systemd 在 ExecStart 进程以非零状态码退出时自动重启该服务。RestartSec=1min: 指定在尝试重启前等待的时间。第二步:创建定时器单元 (backup.timer)
此文件定义了何时运行服务。它充当触发器。创建文件 /etc/systemd/system/backup.timer。定时器单元的名称必须与服务单元的名称匹配(例如,backup.timer 触发 backup.service)。
vim /etc/systemd/system/backup.timer
粘贴以下配置:
[Unit]
Description=Run Website Backup Daily at 2 AM
[Timer]
# OnCalendar 指定一个日历事件触发器
OnCalendar=daily
# 若要指定更精确的时间:
# OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
[Timer] 部分:
OnCalendar=daily: 是 *-*-* 00:00:00 的一个便捷简写。定时器将在每天午夜触发一次。为了匹配 cron 任务,应使用 OnCalendar=*-*-* 02:00:00。Persistent=true: 另一个强大的特性。 如果系统在任务预定运行时处于关机状态,此设置将确保任务在系统下次启动后立即触发执行。第三步:激活并验证定时器
重新加载 Systemd 管理器配置:在创建或修改单元文件后,必须告知 Systemd 重新加载其配置。
systemctl daemon-reload
启动并启用定时器:服务单元 (.service) 不需要直接启动或启用。定时器单元会管理其生命周期。启用定时器以确保它在系统重启后依然有效。
systemctl start backup.timer
systemctl enable backup.timer
检查服务状态:要检查底层服务(任务本身)的状态,使用 status 命令。
systemctl status backup.service
此命令提供了丰富的信息,包括服务是否活跃、是否已加载、其主 PID,以及最重要的是,最近的日志条目。
检查定时器状态:使用 list-timers 命令查看系统上所有活动的定时器、它们上次运行的时间以及下一次计划运行的时间。
systemctl list-timers
查看集中式日志:Systemd 会自动捕获其运行的任何进程的标准输出和标准错误,并将其存储在系统日志(journal)中。这提供了一个统一的日志解决方案。要查看备份服务的所有日志:
journalctl -u backup.service
要实时跟踪日志(对调试很有用):
journalctl -u backup.service -f
上述实践操作凸显了 Cron 和 Systemd Timers 之间截然不同的操作特性。
| 特性 | Cron | Systemd Timer + Service |
|---|---|---|
| 易用性 | 非常简单,一行即可完成简单任务 | 相对复杂,需要两个独立的单元文件 |
| 可靠性 | '触发后不管',无原生重试逻辑 | 可配置失败恢复和自动重启 |
| 状态监控 | 困难,需依赖外部工具或日志解析 | 通过 systemctl status 提供内置状态追踪 |
| 日志管理 | 分散,需在脚本中显式重定向 | 通过 journalctl 实现集中式日志管理 |
| 资源控制 | 原生不支持 | 可通过 cgroups 指令设置 CPU/内存限制 |
| 依赖关系 | 无,任务间相互独立 | 可定义单元之间复杂的依赖关系 |
| 错过执行 | 错过的任务会被完全跳过 | 可配置在下次启动后补做 (Persistent=true) |
工具的选择应基于任务的运维需求。
Cron:
Cron 对于那些非关键、执行时间短、且偶发性失败影响极小的任务,仍然是一个可行的工具。它非常适合简单的'内务管理'脚本。
/tmp 目录中临时文件的脚本。如果它某次未能运行,后果可以忽略不计。Systemd Timer + Service:
对于所有关键的、生产级别的自动化任务,即那些要求高可用性、详细审计和强大错误处理能力的任务,Systemd 是强烈推荐的选择。
掌握 Systemd 不仅仅是学会一个新的调度工具,更是理解现代 Linux 管理的基石。通过将自动化任务作为一等公民的服务来对待,Systemd 提供了构建真正健壮、可维护的自动化系统所需的可视性、控制力和可靠性。虽然 Cron 因其简单性仍占有一席之地,但 Systemd Timers 和 Services 的全面功能集,使管理员能够从被动的运维姿态转向主动,在 openEuler 平台上创建出具有内建弹性的自动化基础设施。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online