Lazy loaded image
异地NAS自动开关机备份远程NAS
字数 1927阅读时长 5 分钟
2025-5-17
2025-5-17
type
status
date
slug
summary
tags
category
icon
password
😀
今天来实现将NAS异地备份至远程NAS,远程NAS在指定时间上限参与备份,其他时间保持断电离线状态,整个过程全自动。
我现在住的房子里部署了一台主力NAS,为了满足3+2+1备份原则中的异地离线备份的需求,我将老家一台13年配置的台式电脑改装成了一台NAS,但受限于CPU的生产工艺,老电脑做NAS的最大缺点就是功耗高。因为我需要备份的内容主要是手机里日常新拍摄完的的视频和照片,所以无需实时做二次远程备份,只需要定期将家里的NAS备份至老家的NAS就行,比如说每周两次。来,看我是如何实现全自动定期离线备份的。

一、准备工作

  1. 24小时开机的主力NAS(这里称作“A房NAS”)
  1. 老家的备份NAS(这里称作“B房NAS”)
  1. 米家开机卡

二、通过米家APP设置定时开机

将开机卡插在B房NAS的PCIe插槽,设置定时开机时间,我是设置在每周一、周四的凌晨00:01开机,05:00关机,这样可以避开网络拥堵以及跨运营商限流的问题,可以吃满A房NAS的上传速度,5个小时的时间足以满足完成日常增量数据的备份。

三、打开B房的WebDAV服务

打开B房的WebDAV服务,目的时能够让A房的备份服务访问B房NAS的备份目的地文件夹。
notion image

四、在A房NAS上设置远程备份

在A房NAS的备份程序中设置备份目的地B房NAS的。注意
notion image
notion image
通过以上设置实际上就可以实现NAS数据的自动化备份。
但有没有方法实现在每次备份完成后,B房NAS自动关机,而不是霸蛮等到凌晨5:00才关机呢?
我才用的是通过A房NAS上的home assistant来监测远程备份进程,若特定时间内无远程备份进程,则通过home assistant的米家插件向远程开机卡发送关机命令。

五、备份完毕即自动关机

可以通过A房NAS的 cron 定时任务 + Shell 脚本 + Home Assistant API 调用 实现该功能。以下是分步实现方案:

(一)Shell 脚本实现

1. 脚本功能设计

脚本需要完成以下任务:
  • 检测进程是否存在:使用 pgrep 命令判断 backup_remote 进程状态。
  • 控制 Home Assistant 实体:通过 REST API 关闭指定开关。
  • 状态持久化:创建锁文件,确保当日仅执行一次操作。

2. 脚本代码

利用ssh工具将新建的脚本文件保存在你自己指定的目录下。我是将其保存的路径为"/opt/backup_remote_power.sh”
notion image

3. 权限问题

  • 你有可能会遇到Permission Denied的提示,可以按照我的另一篇文章的方法解决。
MobaXterm提示Permission Denied的解决方法
  • 确保脚本有执行权限:chmod +x /opt/backup_remote_power.sh
  • 通过chmod 777 /var/lock/ha_monitor 将锁文件目录 /var/lock/ha_monitor 需允许写入。

(二)Cron 定时任务配置

添加定时任务

notion image
  • 编辑好内容后,按下 *Ctrl + O**,然后按回车保存;
  • 接着按 *Ctrl + X** 退出。

(三)Home Assistant 配置

1. 生成长期访问令牌

  1. 登录 Home Assistant Web 界面。
  1. 点击右上角用户头像 → “设置”“长期访问令牌”“创建令牌”,保存生成的 Token。
notion image

2. 验证 API 调用

手动测试脚本是否能成功关闭实体:
此时你有可能会遇到以下提示:
原因是脚本文件 backup_remote_power.sh 可能是在 Windows 系统或使用 Windows 工具(如记事本、VS Code 未配置 Unix 换行符) 中编辑的,导致文件包含 \r\n(回车+换行符),而 Linux 仅支持 \n(换行符)。
解决方法:通过 sed 删除 \r 字符

注意:测试脚本时,要每次删除/var/lock/ha_monitor/目录下的的lock文件,否则重新测试脚本时,脚本检测到已有当日生成的lock文件,就会半途退出脚本。
 
上一篇
如何安装Home Assistant第三方插件商店HACS
下一篇
MobaXterm提示Permission Denied的解决方法

评论
Loading...