TLDR,我的主要问题:
tar 格式本身支持校验和吗?
如何创建带有 tar 格式内置校验和的tar
(甚至更好的文件)?tar.gz
Long:在你问我为什么要问或建议替代方案之前……
为什么我认为这样的事情可能存在?
VirtualBox源代码文件tarvfs.cpp
表明。以下是相关代码片段:[1] [2]
- 我在寻找什么:是否有任何 tar 格式支持内置校验和?
- 我不是在寻找什么:
- 使用 sha256sums 或类似文件/添加到存档本身的文件的解决方法。不适用于此用例。
vboxmanage modifymedium --compact
/zerofree
因为已经在使用这个了。
- 我为什么关心?
尝试导入我使用命令行手动创建的 VirtualBox ova,我得到了VERR_TAR_BAD_CHKSUM_FIELD
tar --gzip --create --verbose --directory=/home/user/temp --file empty.ova temp-disk001.vmdk temp-disk002.vmdk temp.mf temp.ovf
临时磁盘001.vmdk 临时磁盘002.vmdk temp.mf temp.ovf
vboxmanage import empty.ova ; echo $?
Progress state: VBOX_E_IPRT_ERROR
VBoxManage: error: Appliance read failed
VBoxManage: error: Error reading OVA '/home/user/temp/empty.ova' (VERR_TAR_BAD_CHKSUM_FIELD)
VBoxManage: error: Details: code VBOX_E_IPRT_ERROR (0x80bb0005), component ApplianceWrap, interface IAppliance
VBoxManage: error: Context: "RTEXITCODE handleImportAppliance(HandlerArg*)" at line 471 of file VBoxManageAppliance.cpp
如果我--gzip
从tar
参数中删除它就可以发挥作用。
tar --create --verbose --directory=/home/user/temp --file empty.ova temp-disk001.vmdk temp-disk002.vmdk temp.mf temp.ovf
然后导入作品。
vboxmanage import empty.ova ; echo $?
[...]0
- 为什么我不使用
vboxmanage export
?因为它创建的 tar 文件没有加密,也没有 gzip 压缩。 - 我的主要目标是什么?一个 gzip 压缩的
.ova
VirtualBox 设备,可以直接导入 VirtualBox,无需额外的.tar.gz
. - VirtualBox ova 不是经过压缩的吗?不,这些只是 tar 文件。不是 gzip 或 xz 压缩档案。
- 但是files
.vmdk
中的文件是压缩过的吗?.ova
是的,但是压缩是有限的。通过使用附加.tar.gz
的最大压缩,它.ova
会变得更小。 - 为什么不使用附加
.tar.gz
文件?压缩、速度、可用性、简单性。 - 为什么你认为 VirtualBox 可以导入
.ova
实际上是.tar.gz
文件的文件?因为VirtualBox源文件ApplianceImplImport.cpp多次提到gzip。 - 我为什么要提到这一切?因为我见过的大多数问题都涉及
vboxmanage modifymedium --compact
/的方向zerofree
。因此我想在这里非常具体:一个.ova
gzip 压缩的文件。
[1]
/**
* Validates the TAR header.
*
* @returns VINF_SUCCESS if valid, VERR_TAR_ZERO_HEADER if all zeros, and
* the appropriate VERR_TAR_XXX otherwise.
* @param pTar The TAR header.
* @param penmType Where to return the type of header on success.
*/
static int rtZipTarHdrValidate(PCRTZIPTARHDR pTar, PRTZIPTARTYPE penmType)
{
/*
* Calc the checksum first since this enables us to detect zero headers.
*/
int32_t i32ChkSum;
int32_t i32ChkSumSignedAlt;
if (rtZipTarCalcChkSum(pTar, &i32ChkSum, &i32ChkSumSignedAlt))
return VERR_TAR_ZERO_HEADER;
/*
* Read the checksum field and match the checksums.
*/
int64_t i64HdrChkSum;
int rc = rtZipTarHdrFieldToNum(pTar->Common.chksum, sizeof(pTar->Common.chksum), true /*fOctalOnly*/, &i64HdrChkSum);
if (RT_FAILURE(rc))
return VERR_TAR_BAD_CHKSUM_FIELD;
if ( i32ChkSum != i64HdrChkSum
&& i32ChkSumSignedAlt != i64HdrChkSum) /** @todo test this */
return VERR_TAR_CHKSUM_MISMATCH;
[2]
/*
* Copyright (C) 2010-2020 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* you can redistribute it and/or modify it under the terms of the GNU
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* The contents of this file may alternatively be used under the terms
* of the Common Development and Distribution License Version 1.0
* (CDDL) only, as it comes in the "COPYING.CDDL" file of the
* VirtualBox OSE distribution, in which case the provisions of the
* CDDL are applicable instead of those of the GPL.
*
* You may elect to license modified versions of this file under the
* terms and conditions of either the GPL or the CDDL or both.
*/
更新1:
- tar 校验和但不包括详细信息:https://www.math.utah.edu/docs/info/tar_8.html#SEC85
- gzip 校验和:gzip 是否向 .tar 添加完整性/crc 检查?
- 星星
artype=crc
(感谢评论者@artem-s-tashkinov)