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。
相关推荐
Pasregret1 小时前
备忘录模式:实现对象状态撤销与恢复的设计模式
运维·服务器·设计模式
唐青枫1 小时前
Linux man 命令使用教程
linux
珹洺2 小时前
Linux红帽:RHCSA认证知识讲解(十 四)分区管理、交换分区,创建逻辑卷与调整逻辑卷的大小
linux·运维·服务器
威桑2 小时前
解决Ubuntu下使用CLion构建Qt项目时找不到已安装的模块的问题
linux·运维·ubuntu
2301_787552872 小时前
AI-Browser适用于 ChatGPT、Gemini、Claude、DeepSeek、Grok的客户端开源应用程序,集成了 Monaco 编辑器。
人工智能·chatgpt·自动化·编辑器·deepseek
PLUS_WAVE3 小时前
【SSH 端口转发】通过SSH端口转发实现访问远程服务器的 tensorboard
linux·服务器·ssh·软件工程·端口转发·tensorboard
珹洺4 小时前
Linux操作系统从入门到实战(四)Linux基础指令(下)
linux·运维·服务器
极小狐4 小时前
极狐GitLab 的压缩和合并是什么?
运维·git·ssh·gitlab·github
唯独失去了从容6 小时前
WebRTC服务器Coturn服务器的管理平台功能
运维·服务器·webrtc
roman_日积跬步-终至千里8 小时前
【K8s基础】K8s下的Helm和Operator:包管理器与运维程序化
运维·容器·kubernetes