当前位置: 首页 > news >正文

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

在这里插入图片描述

实训背景

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

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

环境准备

  1. 操作系统:Ubuntu 22.04 LTS。
  2. 目录结构
    • 数据目录:/data(需备份的原始数据)。
    • 备份目录:/backups(本地备份存储)。
    • USB挂载点:/mnt/usb(外部存储设备挂载位置)。
  3. 工具安装
    sudo apt install rsync curl  # 用于增量备份和通知发送
    

实训步骤


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

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

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

    sudo nano /opt/scripts/full_backup.sh
    

    内容:

    #!/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
    

    赋予执行权限:

    sudo chmod +x /opt/scripts/full_backup.sh
    
  2. 创建服务文件

    sudo nano /etc/systemd/system/full_backup.service
    

    内容:

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

    sudo nano /etc/systemd/system/full_backup.timer
    

    内容:

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

    sudo systemctl enable full_backup.timer
    sudo systemctl start full_backup.timer
    

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

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

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

    sudo nano /etc/systemd/system/mnt-usb.mount
    

    内容:

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

    sudo nano /etc/systemd/system/mnt-usb.automount
    

    内容:

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

    sudo nano /etc/systemd/system/incremental_backup.service
    

    内容:

    [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规则

    sudo nano /etc/udev/rules.d/99-usb-backup.rules
    

    内容:

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

    重新加载UDEV规则:

    sudo udevadm control --reload
    

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

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

操作步骤
  1. 限制备份服务资源
    修改 full_backup.serviceincremental_backup.service,添加:

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

    sudo nano /etc/systemd/journald.conf
    

    修改以下参数:

    SystemMaxUse=1G            # 日志最大占用1GB
    MaxRetentionSec=30day      # 保留30天日志
    

    重启日志服务:

    sudo systemctl restart systemd-journald
    

任务4:验证与监控

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

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

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

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

    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。
http://www.dtcms.com/a/112944.html

相关文章:

  • KAPC的前世今生--(下)下RPCRT4!NMP_SyncSendRecv函数分析
  • 去中心化指数(链上ETF)
  • 【小沐学Web3D】three.js 加载三维模型(React Three Fiber)
  • Cribl 通过Generic API新建 Dataset
  • 谈谈策略模式,策略模式的适用场景是什么?
  • 基本机动飞行性能
  • 车辆信息查询API——车辆车五项查询
  • 金融数据分析(Python)个人学习笔记(6):安装相关软件
  • PyTorch参数管理详解:从访问到初始化与共享
  • ARM架构与编程学习(四)(08_keil_gcc_Makefile)
  • 晶晨S905-S905L-S905LB_S905M2通刷_安卓6.0.1_16S极速开机_线刷固件包
  • 英语—四级CET4考试—蒙猜篇—匹配题
  • 测试:正交法设计测试用例
  • mysql数据库中getshell的方式总结
  • Java进阶-day06:反射、注解与动态代理深度解析
  • GPU显存占用高但利用率低的深度解析 (基于实际案例与技术文档)
  • python爬虫爬取淘宝热销(热门)台式电脑商品信息(课程设计;提供源码、使用说明文档及相关文档;售后可联系博主)
  • php8 命名参数使用教程
  • 跳跃连接(Skip Connection)与残差连接(Residual Connection)
  • 家庭路由器wifi设置LAN2LAN和LAN2WAN
  • STM32低功耗模式详解:睡眠、停机、待机模式原理与实践(下) | 零基础入门STM32第九十三步
  • 30信号和槽_带参数的信号槽(3)
  • [Linux]进程状态、僵尸进程处理回收、进程优先级 + 图例展示
  • kali——httrack
  • Tensorflow、Pytorch与Python、CUDA版本的对应关系(更新时间:2025年4月)
  • 6.1 python加载win32或者C#的dll的方法
  • 对应列表数据的分割和分组
  • 【瑞萨 RA-Eco-RA2E1-48PIN-V1.0 开发板测评】PWM
  • tkiner模块的初步学习
  • 冷门预警,英超006:埃弗顿VS阿森纳,阿森纳分心欧冠,太妃糖或有机可乘