背景
客户需要一种自动备份解决方案,用于外部驱动器(每周进行一次)。我通常会建议快照(或者可能推出自定义rsync
脚本),但这个问题稍微复杂一些。
基于 Arch Linux 的系统是无头的因此解决方案必须是充分自动化,无需用户干预。
理想的情况如下:
- 用户插入 USB 硬盘
- 进行完整的增量备份
- 硬盘已卸载
- 通知用户可以拔出硬盘驱动器
提议
我提出的解决方案包括:
- 一条
udev
规则自动安装驱动器 备份开始于:
- 同样的
udev
规则也会触发rsnapshot
脚本 - 一个inotify 创造事件检测到新的挂载点并触发
rsnapshot
- 同样的
退出后
rsnapshot
,umount
在驱动器上运行通知硬盘可以删除的可能方法:
- CD 驱动器打开
- 通过 PC 扬声器播放声音
如果任何时候发生错误,请向用户发送电子邮件并卸载驱动器。
问题
- 我的建议看起来可行,但是有明显的缺陷吗?我怎样才能使它坚固?
- 为了安全起见,如何确保插入的硬盘是用户的?
ssh
钥匙?驱动器标签? - 现有的 (Linux) 解决方案是否包含此内容?
答案1
然而,您的解决方案似乎相对合适:
- 确保
rsnapshot
脚本不会假定知道块设备。理想情况下,最好通过 UUID 或标签来寻址文件系统,以避免破坏。 - 添加超时。这样,如果出现我们不知道的问题,或者导致脚本永远无法完成的情况,可以将其作为错误处理,而不是无限期地继续。
- 您在最后指出“如果在任何时候发生错误,请向用户发送电子邮件并卸载驱动器”——如果无法卸载驱动器,或者卸载失败,会发生什么情况?如果电子邮件失败会发生什么?确保在您的系统中构建故障保护。
- 对于基本安全性,UUID 应该没问题(除非攻击者可能知道您的 UUID),但是,如果更关心安全性,请考虑将一些数据写入 MBR 的代码区域(字节 0-440),并且在开始备份之前让脚本检查它。应该警告您,通过默默无闻,这比其他任何方法都更安全,但是在这种情况下,我没有看到任何更容易使用的优越方法。但是,如果您想彻底了解,您可以通过分析磁盘上存储的加密证书来确定驱动器是否经过授权。当
udev
检测到驱动器时,脚本使用其密钥解密证书。该证书包含与驱动器相关的参数,例如驱动器的序列号、型号、容量等,然后将从加密证书中提取的参数与分析驱动器时看到的参数进行比较。如果参数匹配,则确定驱动器是真实的,否则驱动器将被拒绝,并且脚本终止。
有一些现有的 Linux 解决方案属于此范围,但是,对于您的特定需求,我认为您最好制作一个定制的解决方案,而不是摆弄其他程序的源代码来让它们做您想要的事情。
要将随机数据写入 MBR 的代码区域(然后您可以检查这些数据),请执行类似的操作dd if=/dev/urandom of=/dev/sdX bs=440 count=1
。