tar 格式支持校验和吗?

tar 格式支持校验和吗?

TLDR,我的主要问题:

tar 格式本身支持校验和吗?

如何创建带有 tar 格式内置校验和的tar(甚至更好的文件)?tar.gz


Long:在你问我为什么要问或建议替代方案之前……

为什么我认为这样的事情可能存在?

VirtualBox源代码文件tarvfs.cpp表明。以下是相关代码片段:[1] [2]

  • 我在寻找什么:是否有任何 tar 格式支持内置校验和?
  • 我不是在寻找什么:
  • 我为什么关心?

尝试导入我使用命令行手动创建的 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

如果我--gziptar参数中删除它就可以发挥作用。

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 压缩的.ovaVirtualBox 设备,可以直接导入 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。因此我想在这里非常具体:一个.ovagzip 压缩的文件。

[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:

相关内容