From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 1C48C1FF13C for ; Thu, 05 Mar 2026 13:07:46 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id D3AA07602; Thu, 5 Mar 2026 13:08:45 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=romanondracek.cz; s=dkim2019; t=1772712520; bh=/3wxPCwl9MhBuwXOpdjJrPj2whBxCyLgZVsjisZ0yRo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=S16SeYXew9TJC/sjvbPSRVbJw3h3iePO1HNQrwaK9rEEP16XYFpQkpgsRIVedSyEi mkiqaViB17I4sU2Tm1pj06A1fQ7c8mgklV1/2y8R4YysD2G4elogsvbd7avSmcCk+a rP3lXt1kaCBXnWB48McD2cVwomzoFL1Hm8Z1i+9Zl4bnWbTYPg9Fksj1EeweMEFarW KiGBNU1cXoUi2RuVvXR0lJloQRHi2MrsmNA1oEt9tpVEqm1PBgUnvnXyS9QGIGDBg6 wfni+IPYqWbGzUBTShO3vXnsMk19Vn28NsIMnUVSjUAnHxMUI+WmOs/xCEW6NNacd/ 0TxSsUdSHhJ/w== From: mail@romanondracek.cz To: pve-devel@lists.proxmox.com Subject: [PATCH pve-storage 1/1] storage: add xz support Date: Thu, 5 Mar 2026 13:08:21 +0100 Message-ID: <20260305120830.4108248-2-mail@romanondracek.cz> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260305120830.4108248-1-mail@romanondracek.cz> References: <20260305120830.4108248-1-mail@romanondracek.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.2 required=5.0 tests=ALL_TRUSTED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF autolearn=ham autolearn_force=no version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on vps.romanondracek.cz X-SPAM-LEVEL: Spam detection results: 0 AWL 0.238 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DKIM_SIGNED 0.1 Message has a DKIM or DK signature, not necessarily valid DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's domain DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from domain DMARC_PASS -0.1 DMARC pass policy PROLO_LEO1 0.1 Meta Catches all Leo drug variations so far RCVD_IN_DNSWL_LOW -0.7 Sender listed at https://www.dnswl.org/, low trust SPF_HELO_PASS -0.001 SPF: HELO matches SPF record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: UI2FNWRVJVSE2Q4KQBKY6MLSUZD5WB6E X-Message-ID-Hash: UI2FNWRVJVSE2Q4KQBKY6MLSUZD5WB6E X-MailFrom: mail@romanondracek.cz X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: =?UTF-8?q?Roman=20Ondr=C3=A1=C4=8Dek?= X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Roman Ondráček Signed-off-by: Roman Ondráček --- debian/control | 1 + src/PVE/Storage.pm | 5 ++++- src/PVE/Storage/Plugin.pm | 2 +- src/test/archive_info_test.pm | 6 ++++-- src/test/list_volumes_test.pm | 11 ++++++++++- src/test/parse_volname_test.pm | 8 ++++---- src/test/path_to_volume_id_test.pm | 12 +++++++----- 7 files changed, 31 insertions(+), 14 deletions(-) diff --git a/debian/control b/debian/control index 6bd55a2..9ef10e6 100644 --- a/debian/control +++ b/debian/control @@ -50,6 +50,7 @@ Depends: bzip2, smbclient, thin-provisioning-tools, udev, + xz-utils, zstd, ${misc:Depends}, ${perl:Depends}, diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm index 6e87bac..b9ae6d7 100755 --- a/src/PVE/Storage.pm +++ b/src/PVE/Storage.pm @@ -115,7 +115,7 @@ PVE::Storage::Plugin->init(); our $ISO_EXT_RE_0 = qr/\.(?:iso|img)/i; -our $VZTMPL_EXT_RE_1 = qr/\.(?|(tar)(?!\.)|tar\.(gz|xz|zst|bz2))/i; +our $VZTMPL_EXT_RE_1 = qr/\.(?|(tar)(?!\.)|tar\.(gz|xz|zst|bz2|xz))/i; our $BACKUP_EXT_RE_2 = qr/\.(tgz|(?:tar|vma)(?:\.(${\PVE::Storage::Plugin::COMPRESSOR_RE}))?)/; @@ -1761,18 +1761,21 @@ sub decompressor_info { lzo => ['tar', '--lzop'], zst => ['tar', '--zstd'], bz2 => ['tar', '--bzip2'], + xz => ['tar', '--xz'], }, vma => { gz => ['zcat'], lzo => ['lzop', '-d', '-c'], zst => ['zstd', '-q', '-d', '-c'], bz2 => ['bzcat', '-q'], + xz => ['xz', '-q', '-d', '-c'], }, iso => { gz => ['zcat'], lzo => ['lzop', '-d', '-c'], zst => ['zstd', '-q', '-d', '-c'], bz2 => ['bzcat', '-q'], + xz => ['xz', '-q', '-d', '-c'], }, }; diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm index 6f3d691..5b0216e 100644 --- a/src/PVE/Storage/Plugin.pm +++ b/src/PVE/Storage/Plugin.pm @@ -21,7 +21,7 @@ use JSON; use base qw(PVE::SectionConfig); -use constant KNOWN_COMPRESSION_FORMATS => ('gz', 'lzo', 'zst', 'bz2'); +use constant KNOWN_COMPRESSION_FORMATS => ('gz', 'lzo', 'zst', 'bz2', 'xz'); use constant COMPRESSOR_RE => join('|', KNOWN_COMPRESSION_FORMATS); use constant LOG_EXT => ".log"; diff --git a/src/test/archive_info_test.pm b/src/test/archive_info_test.pm index c5c3992..b8dfbff 100644 --- a/src/test/archive_info_test.pm +++ b/src/test/archive_info_test.pm @@ -115,19 +115,21 @@ my $tests = [ }, ]; -# add new compression fromats to test +# add new compression formats to test my $decompressor = { tar => { gz => ['tar', '-z'], lzo => ['tar', '--lzop'], zst => ['tar', '--zstd'], bz2 => ['tar', '--bzip2'], + xz => ['tar', '--xz'], }, vma => { gz => ['zcat'], lzo => ['lzop', '-d', '-c'], zst => ['zstd', '-q', '-d', '-c'], bz2 => ['bzcat', '-q'], + xz => ['xz', '-q', '-d', '-c'], }, }; @@ -167,7 +169,7 @@ for my $virt (sort keys %$bkp_suffix) { my $non_bkp_suffix = { 'openvz' => ['zip', 'tgz.lzo', 'zip.gz', ''], 'lxc' => ['zip', 'tgz.lzo', 'zip.gz', ''], - 'qemu' => ['vma.xz', 'vms.gz', 'vmx.zst', ''], + 'qemu' => ['vms.gz', 'vmx.zst', ''], 'none' => ['tar.gz'], }; diff --git a/src/test/list_volumes_test.pm b/src/test/list_volumes_test.pm index 0876902..d79e991 100644 --- a/src/test/list_volumes_test.pm +++ b/src/test/list_volumes_test.pm @@ -90,6 +90,7 @@ my @tests = ( "$storage_dir/images/16110/vm-16110-disk-1.raw", "$storage_dir/images/16110/vm-16110-disk-2.vmdk", "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_11_40.vma.gz", + "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_12_40.vma.xz", "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_12_45.vma.lzo", "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_13_55.vma", "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_13_55.vma.zst", @@ -136,6 +137,15 @@ my @tests = ( 'vmid' => '16110', 'volid' => 'local:backup/vzdump-qemu-16110-2020_03_30-21_11_40.vma.gz', }, + { + 'content' => 'backup', + 'ctime' => 1585602760, + 'format' => 'vma.xz', + 'size' => DEFAULT_SIZE, + 'subtype' => 'qemu', + 'vmid' => '16110', + 'volid' => 'local:backup/vzdump-qemu-16110-2020_03_30-21_12_40.vma.xz', + }, { 'content' => 'backup', 'ctime' => 1585602765, @@ -457,7 +467,6 @@ my @tests = ( "$storage_dir/private/subvol-19254-disk-0/19254", "$storage_dir/dump/vzdump-openvz-16112-2020_03_30-21_39_30.zip.gz", "$storage_dir/dump/vzdump-openvz-16112-2020_03_30-21_39_30.tgz.lzo", - "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_12_40.vma.xz", "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_12_40.vms.gz", ], expected => [], # returns empty list diff --git a/src/test/parse_volname_test.pm b/src/test/parse_volname_test.pm index 5c9478a..035e3ee 100644 --- a/src/test/parse_volname_test.pm +++ b/src/test/parse_volname_test.pm @@ -247,9 +247,9 @@ foreach my $s (@$disk_suffix) { # create more test cases for backup files matches my $bkp_suffix = { - qemu => ['vma', 'vma.gz', 'vma.lzo', 'vma.zst'], - lxc => ['tar', 'tgz', 'tar.gz', 'tar.lzo', 'tar.zst', 'tar.bz2'], - openvz => ['tar', 'tgz', 'tar.gz', 'tar.lzo', 'tar.zst'], + qemu => ['vma', 'vma.gz', 'vma.lzo', 'vma.xz', 'vma.zst'], + lxc => ['tar', 'tgz', 'tar.gz', 'tar.lzo', 'tar.xz', 'tar.zst', 'tar.bz2'], + openvz => ['tar', 'tgz', 'tar.gz', 'tar.lzo', 'tar.xz', 'tar.zst'], }; foreach my $virt (keys %$bkp_suffix) { @@ -277,7 +277,7 @@ foreach my $virt (keys %$bkp_suffix) { # create more test cases for failed backup files matches my $non_bkp_suffix = { - qemu => ['vms.gz', 'vma.xz'], + qemu => ['vms.gz'], lxc => ['zip.gz', 'tgz.lzo'], }; foreach my $virt (keys %$non_bkp_suffix) { diff --git a/src/test/path_to_volume_id_test.pm b/src/test/path_to_volume_id_test.pm index dfa51e6..ad3f39a 100644 --- a/src/test/path_to_volume_id_test.pm +++ b/src/test/path_to_volume_id_test.pm @@ -92,6 +92,13 @@ my @tests = ( 'backup', 'local:backup/vzdump-lxc-16112-2020_03_30-21_39_30.tar.lzo', ], }, + { + description => 'Backup, vma.xz', + volname => "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_12_40.vma.xz", + expected => [ + 'backup', 'local:backup/vzdump-qemu-16110-2020_03_30-21_12_40.vma.xz', + ], + }, { description => 'Backup, vma.zst', volname => "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_13_55.vma.zst", @@ -212,11 +219,6 @@ my @tests = ( volname => "$storage_dir/dump/vzdump-openvz-16112-2020_03_30-21_39_30.tgz.lzo", expected => [''], }, - { - description => 'Backup, wrong ending, qemu, vma.xz', - volname => "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_12_40.vma.xz", - expected => [''], - }, { description => 'Backup, wrong format, qemu, vms.gz', volname => "$storage_dir/dump/vzdump-qemu-16110-2020_03_30-21_12_40.vms.gz", -- 2.53.0