Systemd构建自动化备份服务与外部存储管理

实训背景

你是一家数据公司的系统管理员,需设计一套自动化备份系统,满足以下需求:

  1. 定期备份 :每周日凌晨1点将 /data 目录压缩备份到 /backups
  2. 外部存储挂载 :插入USB设备时自动挂载到 /mnt/usb,并触发增量备份。
  3. 服务监控:备份完成后发送通知,并限制备份进程的资源使用。
  4. 日志管理:集中记录备份日志,保留30天历史记录。

环境准备

  1. 操作系统:Ubuntu 22.04 LTS。

  2. 目录结构

    • 数据目录:/data(需备份的原始数据)。
    • 备份目录:/backups(本地备份存储)。
    • USB挂载点:/mnt/usb(外部存储设备挂载位置)。
  3. 工具安装

    bash 复制代码
    sudo apt install rsync curl  # 用于增量备份和通知发送

实训步骤


任务1:配置本地定期备份服务

目标:使用systemd定时器实现每周日凌晨1点的全量备份。

操作步骤
  1. 创建备份脚本

    bash 复制代码
    sudo nano /opt/scripts/full_backup.sh

    内容:

    bash 复制代码
    #!/bin/bash
    TIMESTAMP=$(date +%Y%m%d)
    tar -czf /backups/full-backup-$TIMESTAMP.tar.gz /data
    echo "Full backup completed at $(date)" | systemd-cat -t backup  # 记录日志到systemd

    赋予执行权限:

    bash 复制代码
    sudo chmod +x /opt/scripts/full_backup.sh
  2. 创建服务文件

    bash 复制代码
    sudo nano /etc/systemd/system/full_backup.service

    内容:

    ini 复制代码
    [Unit]
    Description=Full Data Backup
    
    [Service]
    Type=oneshot
    ExecStart=/bin/bash /opt/scripts/full_backup.sh
  3. 创建定时器文件

    bash 复制代码
    sudo nano /etc/systemd/system/full_backup.timer

    内容:

    ini 复制代码
    [Unit]
    Description=Weekly Full Backup
    
    [Timer]
    OnCalendar=Sun *-*-* 01:00:00  # 每周日凌晨1点
    Persistent=true
    
    [Install]
    WantedBy=timers.target
  4. 启用定时器

    bash 复制代码
    sudo systemctl enable full_backup.timer
    sudo systemctl start full_backup.timer

任务2:实现USB设备自动挂载与增量备份

目标:插入USB设备时自动挂载并触发增量备份。

操作步骤
  1. 创建USB挂载单元

    bash 复制代码
    sudo nano /etc/systemd/system/mnt-usb.mount

    内容:

    ini 复制代码
    [Unit]
    Description=Mount USB Drive
    
    [Mount]
    What=/dev/sdb1        # 根据实际设备名修改
    Where=/mnt/usb
    Type=ext4             # 根据文件系统类型修改
    Options=defaults
    
    [Install]
    WantedBy=multi-user.target
  2. 创建自动挂载单元(automount)

    bash 复制代码
    sudo nano /etc/systemd/system/mnt-usb.automount

    内容:

    ini 复制代码
    [Unit]
    Description=Automount USB Drive
    
    [Automount]
    Where=/mnt/usb
    TimeoutIdleSec=10m    # 空闲10分钟后卸载
    
    [Install]
    WantedBy=multi-user.target
  3. 创建增量备份服务

    bash 复制代码
    sudo nano /etc/systemd/system/incremental_backup.service

    内容:

    ini 复制代码
    [Unit]
    Description=Incremental Backup to USB
    Requires=mnt-usb.mount  # 依赖挂载点
    
    [Service]
    Type=oneshot
    ExecStart=/bin/bash -c "rsync -av --delete /data/ /mnt/usb/backups/"
    ExecStartPost=/usr/bin/curl -X POST http://notification-server/log -d "Backup completed"
  4. 触发备份的UDEV规则

    bash 复制代码
    sudo nano /etc/udev/rules.d/99-usb-backup.rules

    内容:

    bash 复制代码
    ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_TYPE}=="ext4", RUN+="/bin/systemctl start incremental_backup.service"

    重新加载UDEV规则:

    bash 复制代码
    sudo udevadm control --reload

任务3:限制备份资源与日志管理

目标:防止备份进程占用过多资源,并设置日志保留策略。

操作步骤
  1. 限制备份服务资源

    修改 full_backup.serviceincremental_backup.service,添加:

    ini 复制代码
    [Service]
    ...
    MemoryMax=2G      # 最大内存限制2GB
    CPUQuota=70%      # CPU时间配额70%
  2. 配置日志保留策略

    bash 复制代码
    sudo nano /etc/systemd/journald.conf

    修改以下参数:

    ini 复制代码
    SystemMaxUse=1G            # 日志最大占用1GB
    MaxRetentionSec=30day      # 保留30天日志

    重启日志服务:

    bash 复制代码
    sudo systemctl restart systemd-journald

任务4:验证与监控

目标:确保所有服务按预期工作。

操作步骤
  1. 手动触发全量备份

    bash 复制代码
    sudo systemctl start full_backup.service
    journalctl -u full_backup.service -f  # 跟踪日志
  2. 插入USB设备测试增量备份

    bash 复制代码
    sudo systemctl status mnt-usb.mount  # 查看挂载状态
    ls /mnt/usb/backups                  # 检查备份文件
  3. 查看资源限制效果

    bash 复制代码
    systemd-cgtop  # 监控CPU和内存使用

实训总结

通过本次实训,你实现了以下功能:

  1. 自动化备份:结合定时器和UDEV规则,实现全量与增量备份。
  2. 外部存储管理:通过systemd挂载单元实现USB设备自动挂载。
  3. 资源与日志控制:限制备份资源消耗,统一管理日志生命周期。
  4. 服务联动 :依赖关系(Requires)确保备份仅在挂载完成后执行。

知识要点

  1. 单元类型扩展

    • .mount:管理文件系统挂载。
    • .automount:按需自动挂载设备。
  2. UDEV与systemd集成

    • 通过UDEV规则在硬件事件(如插入USB)时触发服务。
  3. 高级资源控制

    • MemoryMax:限制内存。
    • CPUQuota:限制CPU配额。
  4. 日志管理

    • 修改 journald.conf 控制日志保留时间和大小。

扩展挑战

  • 尝试添加邮件通知功能(替代示例中的HTTP请求)。
  • 设计一个服务依赖链:挂载USB → 增量备份 → 卸载USB。
相关推荐
梦帮科技8 分钟前
OpenClaw 桥接调用 Windows MCP:打造你的 AI 桌面自动化助手
人工智能·windows·自动化
Trouvaille ~21 分钟前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
芷栀夏28 分钟前
深度解析 CANN 异构计算架构:基于 ACL API 的算子调用实战
运维·人工智能·开源·cann
feasibility.31 分钟前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
全栈工程师修炼指南37 分钟前
Nginx | stream 四层反向代理:SSL、PREREAD 阶段模块指令浅析与实践
运维·网络·网络协议·nginx·ssl
旖旎夜光1 小时前
Linux(13)(中)
linux·网络
xiaobaibai1531 小时前
营销自动化终极形态:AdAgent 自主闭环工作流全解析
大数据·人工智能·自动化
威迪斯特2 小时前
CentOS图形化操作界面:理论解析与实践指南
linux·运维·centos·组件·图形化·桌面·xserver
一方热衷.2 小时前
在线安装对应版本NVIDIA驱动
linux·运维·服务器
独自归家的兔2 小时前
ubuntu系统安装dbswitch教程 - 备份本地数据到远程服务器
linux·运维·ubuntu