使用Python进行硬链接/去重备份
项目描述
pyhardlinkbackup
使用Python进行硬链接/去重备份。
备份应保存为文件系统中的正常文件
无需任何额外软件或额外元文件即可访问
非专有格式
创建带版本控制的备份
每次备份运行都会创建一个完整的文件系统快照树
可以删除每个快照树,而不会影响其他快照
使用硬链接进行去重
仅存储已更改的文件,所有其他文件通过硬链接
在所有地方查找重复文件(即使重命名或移动了文件)
在Windows和Linux上可使用
需求:Python 3.6或更高版本。
请:尝试,分支并贡献! ;)
示例
$ phlb backup ~/my/important/documents ...start backup, some time later... $ phlb backup ~/my/important/documents ...
这将创建类似这样的去重备份
~/pyhardlinkbackups └── documents ├── 2016-01-07-085247 │ ├── phlb_config.ini │ ├── spreadsheet.ods │ ├── brief.odt │ └── important_files.ext └── 2016-01-07-102310 ├── phlb_config.ini ├── spreadsheet.ods ├── brief.odt └── important_files.ext
安装
Windows
安装Python 3:https://pythonlang.cn/downloads/
以管理员身份调用 boot_pyhardlinkbackup.cmd(右键单击并使用 以管理员身份运行)
如果一切正常,你将在这里得到一个 venv: %ProgramFiles%\PyHardLinkBackup
在 venv 创建后,调用以下脚本来完成设置
%ProgramFiles%\PyHardLinkBackup\phlb_edit_config.cmd - 创建配置 .ini 文件
%ProgramFiles%\PyHardLinkBackup\phlb_migrate_database.cmd - 创建数据库表
要升级 pyhardlinkbackup,调用
%ProgramFiles%\PyHardLinkBackup\phlb_upgrade_pyhardlinkbackup.cmd
要启动 Django 网络服务器,调用
%ProgramFiles%\PyHardLinkBackup\phlb_run_django_webserver.cmd
Linux
调用 boot_pyhardlinkbackup.sh
如果一切正常,你将在这里得到一个 venv: ~\pyhardlinkbackup
在 venv 创建后,调用以下脚本来完成设置
~/PyHardLinkBackup/phlb_edit_config.sh - 创建配置 .ini 文件
~/PyHardLinkBackup/phlb_migrate_database.sh - 创建数据库表
要升级 pyhardlinkbackup,调用
~/PyHardLinkBackup/phlb_upgrade_pyhardlinkbackup.sh
要启动 Django 网络服务器,调用
~/PyHardLinkBackup/phlb_run_django_webserver.sh
启动备份运行
要启动备份运行,使用此辅助脚本
Windows 批处理: %ProgramFiles%\PyHardLinkBackup\pyhardlinkbackup_this_directory.cmd
Linux shell 脚本: ~/PyHardLinkBackup/pyhardlinkbackup_this_directory.sh
将此文件复制到需要备份的位置,然后调用它以运行备份。
验证现有备份
$ cd pyhardlinkbackup/ ~/PyHardLinkBackup $ source bin/activate (PyHardLinkBackup) ~/PyHardLinkBackup $ phlb verify --fast ~/PyHardLinkBackups/documents/2016-01-07-102310
使用 –fast 不会检查文件的完整性。如果没有提供:将计算文件的哈希值并比较它们。因此,必须从文件系统中完全读取每个文件,所以需要一些时间。
验证运行会
备份中的所有文件都存在吗?
比较文件大小
比较哈希值文件中的哈希值
比较文件的修改时间戳
从文件内容计算哈希值并进行比较(如果使用 –fast 将跳过)
配置
phlb 将使用一个名为: PyHardLinkBackup.ini 的配置文件
搜索顺序是
从当前目录到根目录
用户目录
例如,如果当前工作目录是 /foo/bar/my_files/,则搜索路径将是
/foo/bar/my_files/PyHardLinkBackup.ini
/foo/bar/PyHardLinkBackup.ini
/foo/PyHardLinkBackup.ini
/PyHardLinkBackup.ini
~/PyHardLinkBackup.ini Windows/Linux 下的用户主目录
创建/编辑默认 .ini
您可以直接使用用户目录 .ini 文件打开编辑器
(PyHardLinkBackup) ~/PyHardLinkBackup $ phlb config
默认值存储在此处: /phlb/config_defaults.ini
从备份中排除文件/文件夹
有两种方法可以从备份中排除文件/文件夹。在您的 PyHardLinkBackup.ini 中使用以下设置
# Directory names that will be recursively excluded from backups (comma separated list!) SKIP_DIRS= __pycache__, temp # glob-style patterns to exclude files/folders from backups (used with Path.match(), Comma separated list!) SKIP_PATTERNS= *.pyc, *.tmp, *.cache
文件系统扫描分为两个步骤:1. 仅扫描文件系统树 2. 为每个目录项过滤和加载元数据
SKIP_DIRS 用于第一步。SKIP_PATTERNS 用于第二步。
升级 pyhardlinkbackup
要升级到新版本,只需启动此辅助脚本
Windows: phlb_upgrade_pyhardlinkbackup.cmd
一些注意事项
什么是“phlb”和“manage”?
phlb 是一个命令行界面。
管理类似于正常的Django manage.py,但始终使用pyhardlinkbackup设置。
你到底为什么要用Django?!?
嗯,只是因为出色的数据库ORM和Admin Site。 ;)
如何进入Django管理界面?
只需启动
Windows: phlb_run_django_webserver.cmd
Linux: phlb_run_django_webserver.sh
然后请求‘localhost’(注意:Windows中venv需要–noreload!)
运行单元测试
只需启动:phlb_run_tests.cmd / phlb_run_tests.sh 或者这样做
$ cd pyhardlinkbackup/ ~/PyHardLinkBackup $ source bin/activate (PyHardLinkBackup) ~/PyHardLinkBackup $ manage test
使用CLI
$ cd pyhardlinkbackup/ ~/PyHardLinkBackup $ source bin/activate (PyHardLinkBackup) ~/PyHardLinkBackup $ phlb --help Usage: phlb [OPTIONS] COMMAND [ARGS]... pyhardlinkbackup Options: --version Show the version and exit. --help Show this message and exit. Commands: add Scan all existing backup and add missing ones... backup Start a Backup run config Create/edit .ini config file helper link helper files to given path verify Verify a existing backup
将缺失的备份添加到数据库
phlb add可用于不同的场景
重新创建数据库
手动添加备份
phlb add这样做
扫描< strong>BACKUP_PATH(默认:~/PyHardLinkBackups)下的完整文件树
重新创建所有哈希文件
将所有文件添加到数据库
如果可能,通过硬链接进行去重
因此,可以重新创建完整的数据库
删除当前的.sqlite文件
运行 phlb add以重新创建
另一个场景是例如。
DSLR图像存储在网络驱动器上。
您已经在本地有所有文件的副本。
您希望将本地副本添加到pyhardlinkbackup中。
执行以下步骤
将本地文件移动到< strong>BACKUP_PATH下的子目录中
例如:~/PyHardLinkBackups/pictures/2015-12-29-000015/
注意:子目录名称中的日期格式必须与您的配置中的SUB_DIR_FORMATTER匹配
运行:phlb add
现在您可以从网络驱动器运行 phlb backup以创建一个新的、最新的备份。
Windows开发
有关在Windows上设置开发环境的注意事项: /dev/WindowsDevelopment.creole
替代解决方案
Attic: https://attic-backup.org/(在Windows上不工作,具有自己的备份归档格式)
BorgBackup: https://borgbackup.readthedocs.io/(Attic的分支,有很多改进)
msbackup: https://pypi.python.org/pypi/msbackup/(使用tar进行备份归档)
Duplicity: http://duplicity.nongnu.org/(没有Windows支持,tar归档格式)
Burp: http://burp.grke.org/(客户端/服务器解决方案)
dirvish: http://www.dirvish.org/(客户端/服务器解决方案)
restic: https://github.com/restic/restic/(使用自己的备份归档格式)
另请参阅: https://github.com/restic/others#list-of-backup-software
历史记录
dev - 比较v0.13.0…master
TBC
2020年3月18日 - v0.13.0 - 比较v0.12.3…v0.13.0
2020年3月17日 - v0.12.3 - 比较v0.12.2…v0.12.3
修复 #44 - 进度条中的文件大小错误
使用 pytest-randomly
更新依赖项
2020年3月6日 - v0.12.2 - 比较v0.12.1…v0.12.2
增强日志文件内容
更新依赖项
2020年3月5日 - v0.12.1 - 比较v0.12.0…v0.12.1
撤销对环境目标地址和默认备份目录的 PyHardLinkBackup 的小写
2020年3月5日 - v0.12.0 - 比较v0.11.0…v0.12.0
重构备份过程:使用 https://github.com/jedie/IterFilesystem 以减少内存使用并加快对大型源树的启动
更新项目/源
升级到 Django v2.2.x TLS
使用 poetry
添加 Makefile
使用 pytest 和 tox 运行测试
仅使用 python 3.8、3.7、3.6 运行测试
也在 github 上运行测试
移除对 python 3.5 的支持(移除 os.scandir 回退)
注意: Windows 支持尚未测试!(需要帮助)
2019年3月3日 - v0.11.0 - 比较v0.10.1…v0.11.0
更新引导文件
使用 django v1.11.x
2016年9月9日 - v0.10.1 - 比较v0.10.0…v0.10.1
修复 #24 号问题:捕获扫描目录错误
2016年4月26日 - v0.10.0 - 比较v0.9.1…v0.10.0
将 Windows 下的安装位置从 %APPDATA%\PyHardLinkBackup 移动到 %ProgramFiles%\PyHardLinkBackup
要“迁移”:只需删除 %APPDATA%\PyHardLinkBackup 并通过 boot_pyhardlinkbackup.cmd 安装
2016年4月26日 - v0.9.1 - 比较v0.9.0…v0.9.1
在引导过程中运行迁移数据库
添加缺失的迁移脚本
2016年2月10日 - v0.9.0 - 比较v0.8.0…v0.9.0
针对 Windows MAX_PATH 限制的解决方案:在内部使用 \\?\ 路径前缀。
将 Path2() 移动到外部库: https://github.com/jedie/pathlib_revised
2016年2月4日 - v0.8.0 - 比较v0.7.0…v0.8.0
新增:将所有缺失的备份添加到数据库: phlb add(如上所述)
2016年2月3日 - v0.7.0 - 比较v0.6.4…v0.7.0
新增:验证现有备份
重要:需要运行数据库迁移!
2016年2月1日 - v0.6.4 - 比较v0.6.2…v0.6.4
Windows:修复由于 Windows API 限制导致的临时重命名错误,请参阅: #13
Linux:修复扫描器在符号链接损坏时的错误
在低级错误时显示局部变量
2016年1月29日 - v0.6.3 - 比较v0.6.2…v0.6.3
关于 SKIP_DIRS/SKIP_PATTERNS 的命中提供更少的信息
2016年1月28日 - v0.6.2 - 比较v0.6.1…v0.6.2
处理意外错误并继续备份下一个文件
在执行过程中更好地处理中断键
2016年1月28日 - v0.6.1 - 比较v0.6.0…v0.6.1
通过使用更好的临时重命名例程修复 #13 号错误
2016年1月28日 - v0.6.0 - 比较v0.5.1…v0.6.0
新增:仅当存在旧备份文件时,通过比较mtime/size进行更快的数据备份
2016年1月27日 - v0.5.1 - 比较 v0.5.0…v0.5.1
重要:需要运行数据库迁移!
新增 .ini 设置:用于更改翻译的 LANGUAGE_CODE
标记备份是否完成
显示上次备份运行的信息
将更多信息添加到摘要文件中
2016年1月27日 - v0.5.0 - 比较 v0.4.2…v0.5.0
重构源树扫描。分为两个步骤。
更改 .ini 配置中的 SKIP_FILES 为: SKIP_PATTERNS
从最新文件备份到最旧文件。
修复 #10
新增 –name 命令行选项(可选)以强制备份名称。
如果备份名称无法找到,则显示错误消息(例如:备份根文件夹)
2016年1月22日 - v0.4.2 - 比较 v0.4.1…v0.4.2
在Windows下对符号链接的处理进行work-a-round,参见: https://www.python-forum.de/viewtopic.php?f=1&t=37725&p=290429#p290428 (de)
修复Windows批处理中的错误:进入工作目录。
在中间打印一些更多的状态信息。
2016年1月22日 - v0.4.1 - 比较 v0.4.0…v0.4.1
跳过无法读取/写入的文件。(并尝试备份剩余的文件)
2016年1月21日 - v0.4.0 - 比较 v0.3.1…v0.4.0
从当前工作目录的每个父目录中搜索 PyHardLinkBackup.ini 文件
将默认块大小增加到20MB
为每次备份运行保存摘要和日志文件
2016年1月15日 - v0.3.1 - 比较 v0.3.0…v0.3.1
修复在Windows下运行unittest的错误
2016年1月15日 - v0.3.0 - 比较 v0.2.0…v0.3.0
需要数据库迁移
将“no_link_source”添加到数据库中(例如,如果Windows下创建了1024个链接,则跳过源)
2016年1月14日 - v0.2.0 - 比较 v0.1.8…v0.2.0
良好的unittest覆盖率,涵盖了备份过程
2016年1月8日 - v0.1.8 - 比较 v0.1.0alpha0…v0.1.8
在Windows下安装和可运行
2016年1月6日 - v0.1.0alpha0 - d42a5c5
PyPi上的第一个版本
2015年12月29日 - commit 2ce43
提交“Proof of concept”
链接
捐赠
注意:此文件由README.creole于2020-03-18 10:02:44生成,使用"python-creole"
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。