我关注过几篇关于如何创建跨文件的帖子,这些文件稍后可以在相同或不同的系统上重新连接。但是,我从未见过关于如何以跨平台的方式执行此操作的帖子。
我的要求是支持最流行的基于 posix 的操作系统(例如 Linux、FreeBSD 和 Windows 上的 Cygwin 或 WSL)。它不需要支持 Windows 操作系统本身。
它必须能够处理超过 100GB 的大型目录,高效地减少中间磁盘使用量,并且输出跨越 256MB 文件,以使同步使文件易于管理。并且所使用的库必须能够通过标准主流软件包在各种操作系统上轻松使用。
主要用例是拥有一个脚本,可以压缩大型虚拟机,然后最终在单独的作业上通过网络传输到远程备份。
答案1
最好使用两个工具来完成此操作:tar
和7zip
。tar
将把目录内容与所有所有权和元数据一起打包,并7zip
处理压缩和跨越。
此过程已在 中测试,FreeBSD
但应该很容易通过Cygwin
*移植到 Linux 或 Windows 。此方法将压缩并将虚拟机或其他大型目录划分为较小的块,使其更容易存储并通过网络发送以进行远程备份。
# Setup for Bundling
# . `BK_FLDR` is the folder to be backed up and terminal is in parent folder
export BK_FLDR=MY_HUGE_VM_vmbk_20210609
export BK_NAME=${BK_FLDR}_`date '+%m%d%y%H%M%S'`
# . Make a folder to restore to:
mkdir -p ../_bk/${BK_NAME}
# Archive procedure
cd ${BK_FLDR}
tar --use-compress-program "7z a -mx=1 -si ../_bk/${BK_NAME}/${BK_NAME}.t7z -v500m" -cvf *
# . At this point, you will have a bunch of .t7z.nnn files under `./_bk/${BK_NAME}`
# . unless the source dir is less than 500 MB (`-v500m` arg.) there will be only one file
# Restore procedure:
# . Go back to parent dir and create restore folder
cd ..
export OUT_DIR=./_restored/${BK_NAME}
mkdir -p ${OUT_DIR}
# . Restore files
7z x -so ./_bk/${BK_NAME}/${BK_NAME}.t7z.001 | tar -xf - -C ${OUT_DIR}
* Cygwin 可能无法像 Windows 中的所有权那样正确处理所有文件数据,但对于所有文件数据和时间戳应该没问题。