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。
相关推荐
爪娃侠1 小时前
LeetCode热题100记录-【二叉树】
linux·算法·leetcode
rufeike3 小时前
Rclone同步Linux数据到google云盘
linux·运维·服务器
csdn_aspnet3 小时前
如何在 Linux 上安装 Python
linux·运维·python
良许Linux4 小时前
怎么自学嵌入式?
linux
良许Linux4 小时前
你见过的最差的程序员是怎样的?
linux
良许Linux4 小时前
想从事嵌入式软件,有推荐的吗?
linux
西贝爷6 小时前
批量删除git本地分支和远程分支命令
运维
jianbiao14836 小时前
远程服务器下载llama模型
运维·服务器
bookish_2010_prj6 小时前
Jupyter notebook定制字体
linux·python·jupyter
fei_sun6 小时前
获取ssh密钥
运维·ssh