作为备份系统的一部分,我们将zfs数据集从一个TrueNAS系统复制到两个备份服务器上,其中一个服务器正在运行TrueNAS规模,并连接了一个LTO-5磁带驱动器。我们偶尔会将只读快照的一个内容写入磁带。由于其中一些数据集很大,tar与-多卷标志一起使用.
在备份之前,将为快照目录中的每个文件生成sha256sums。此文件的副本保存在服务器上,并写入磁带。
之后,快照的全部内容将使用
tar --acls --xattrs --spares --label="SomeLabel" --multi-volume -cvpf /dev/nst0 *这为我们提供了很好的服务,但我希望在将数据写入磁带后予以核实。我希望避免需要将整个文件集提取到一个划痕位置,否则将允许运行"sha256sum -c“,因为TrueNAS scale服务器没有足够的额外空间来提取某些数据集。相反,我试着:-
tar --multi-volume -xf /dev/nst0 --to-command=tar-shasums.sh | tee verify-datasetname.sha25sum在tar-shasums.sh沿着这些线:
#!/bin/bash
sha1=`sha1sum`
echo -n $sha1 | sed 's/ .*$//'
echo " $TAR_FILENAME"但是,如果焦油跨越两盘磁带,我就遇到了一个问题。当tar正在读取一个跨越两个磁带的文件时,它将要求插入下一个卷,然后按下输入。但是,当设备正在使用时,这将导致错误。
看起来“- to -command”对于该文件仍然是有效的,因为它还没有接收所有数据来生成shasum,但是它也不能在磁带被更改之前完成,但是在它完成之前,磁带不能被更改.
目前,我终止了shasum进程,它允许tar继续使用下一个磁带,但这意味着跨两个卷的一个文件无法被验证。除非该文件是手动提取和检查的。不太理想。
我希望不会,但是,有什么办法可以绕过这件事?是否有任何方法可以生成不需要先将整个焦油提取到磁盘中的散列表?或者,是否可以打开/dev/nst0 0上的锁,允许tar继续读取新插入的磁带,而不必杀死shas256sum?
发布于 2021-07-16 09:43:22
昨晚我查看了tar源,它看起来像是“--命令”,它创建了一个管道,然后使用fork运行脚本,并将文件数据输送到它。
因此,叉子会导致分叉进程继承所有父文件描述符,其中包括tar打开的/dev/nst0 0设备。Tar然后关闭/dev/nst0 0,为媒体更改做好准备,但是等待更多管道数据的分叉进程仍处于打开状态,因此出现死锁。
通过将运行的脚本更改为始终关闭/dev/nst0 0描述符,我已经部分地解决了这个问题。
DEVICE=/dev/nst0
file=`lsof -p $ | grep ${DEVICE} | awk '{print $4}'`
file=${file::-1}
eval "exec ${file}<&-"然后,只有一个进程"sh“似乎仍然保存在文件描述符上。"fuser -u /dev/nst0 0“说明了这一点,作为一种临时解决方法,可以使用gdb关闭它,之后媒体更改和校验和的剩余部分将正确生成。
gdb -p PID
p close(FD)我不确定是否可以使用叉,但不能将所有文件描述符传递给分叉进程,但这似乎是最终的解决方案。
如果我搞清楚了,我会更新这个答案的。
https://serverfault.com/questions/1069692
复制相似问题