File Formats¶
Proxmox File Archive Format (.pxar)¶
![digraph g {
graph [
rankdir = "LR"
fontname="Helvetica"
];
node [
fontsize = "16"
shape = "record"
];
edge [
];
"archive" [
label = "archive.pxar"
shape = "record"
];
"rootdir" [
label = "<f0> ENTRY| \{XATTR\}\* extended attribute list\l | \{ACL_USER\}\* USER ACL entries\l | \{ACL_GROUP\}\* GROUP ACL entries\l| \[ACL_GROUP_OBJ\] the ACL_GROUP_OBJ \l| \[ACL_DEFAULT\] the various default ACL fields\l|\{ACL_DEFAULT_USER\}\* USER ACL entries\l|\{ACL_DEFAULT_GROUP\}\* GROUP ACL entries\l|\[FCAPS\] file capability in Linux disk format\l|\[QUOTA_PROJECT_ID\] the ext4/xfs quota project ID\l| { PAYLOAD | SYMLINK | DEVICE | { <de> \{DirectoryEntries\}\* | GOODBYE}}"
shape = "record"
];
"entry" [
label = "<f0> size: u64 = 64\l|type: u64 = ENTRY\l|feature_flags: u64\l|mode: u64\l|flags: u64\l|uid: u64\l|gid: u64\l|mtime: u64\l"
labeljust = "l"
shape = "record"
];
"direntry" [
label = "<f0> FILENAME |{ENTRY | HARDLINK}"
shape = "record"
];
"archive" -> "rootdir":f0
"rootdir":f0 -> "entry":f0
"rootdir":de -> "direntry":f0
}](_images/graphviz-74536ae6d775ebdefa6f97f2ccb7c1ac2b469716.png)
Proxmox File Archive Format - Meta (.mpxar)¶
Pxar metadata archive with same structure as a regular pxar archive, with the
exception of regular file payloads not being contained within the archive
itself, but rather being stored as payload references to the corresponding pxar
payload (.ppxar) file.
Can be used to lookup all the archive entries and metadata without the size overhead introduced by the file payloads.
![digraph g {
graph [
rankdir = "LR"
fontname="Helvetica"
];
node [
fontsize = "16"
shape = "record"
];
edge [
];
"archive" [
label = "archive.mpxar"
shape = "record"
];
"rootdir" [
label = "<fv>FORMAT_VERSION\l|PRELUDE\l|<f0>ENTRY\l|\{XATTR\}\* extended attribute list\l|\{ACL_USER\}\* USER ACL entries\l|\{ACL_GROUP\}\* GROUP ACL entries\l|\[ACL_GROUP_OBJ\] the ACL_GROUP_OBJ \l|\[ACL_DEFAULT\] the various default ACL fields\l|\{ACL_DEFAULT_USER\}\* USER ACL entries\l|\{ACL_DEFAULT_GROUP\}\* GROUP ACL entries\l|\[FCAPS\] file capability in Linux disk format\l|\[QUOTA_PROJECT_ID\] the ext4/xfs quota project ID\l|{<pl> PAYLOAD_REF|SYMLINK|DEVICE|{<de> \{DirectoryEntries\}\*|GOODBYE}}"
shape = "record"
];
"entry" [
label = "<f0> size: u64 = 64\l|type: u64 = ENTRY\l|feature_flags: u64\l|mode: u64\l|flags: u64\l|uid: u64\l|gid: u64\l|mtime: u64\l"
labeljust = "l"
shape = "record"
];
"direntry" [
label = "<f0> FILENAME\l|{ENTRY\l|HARDLINK\l}"
shape = "record"
];
"payloadrefentry" [
label = "<f0> offset: u64\l|size: u64\l"
shape = "record"
];
"archive" -> "rootdir":fv
"rootdir":f0 -> "entry":f0
"rootdir":de -> "direntry":f0
"rootdir":pl -> "payloadrefentry":f0
}](_images/graphviz-652cb002d7a1bedc42065f696b6e43f718871867.png)
Proxmox File Archive Format - Payload (.ppxar)¶
Pxar payload file storing regular file payloads to be referenced and accessed by
the corresponding pxar metadata (.mpxar) archive. Contains a concatenation
of regular file payloads, each prefixed by a PAYLOAD header. Further, the
actual referenced payload entries might be separated by padding (full/partial
payloads not referenced), introduced when reusing chunks of a previous backup
run, when chunk boundaries did not aligned to payload entry offsets.
All headers are stored as little-endian.
|
header of |
|
header of |
Payload |
raw regular file payload |
Padding |
partial/full unreferenced payloads, caused by unaligned chunk boundary |
... |
further concatenation of payload header, payload and padding |
|
header of |
Proxmox Catalog File Format (.pcat1)¶
The catalog file uses the following structure:
|
|
|
Catalog data table. See |
... |
More catalog data tables. |
|
Points at the start of the '/' catalog entry. Stored as little-endian. |
Catalog Data Tables¶
Each table represents the contents of a single directory.
|
Total length of the contents inside this table. |
|
Number of entries present in the table. |
|
Concatenated |
Catalog Table Entries¶
Each entry consists of the length and value of its name. Additional, file`
and ``directory type entries contain a PAYLOAD field. For directory
entries, the offset_back payload stores the backward byte distance from the
start of the parent directory table to the start of the referenced child
directory table. The start offset of the child directory table can be computed
as parent_table_start - offset_back.
|
The type of entry (see entry types). |
|
Length of file or directory name. Stored as variable length encoded u64. |
|
The raw UTF-8 string bytes of the name. |
|
Bytes based on
|
Entry Types:¶
|
Directory |
|
File |
|
Symlink |
|
Hardlink |
|
Block device |
|
Char device |
|
FIFO |
|
Socket |
Variable Length Encoding:¶
The asterisk notation indicates variable-length integers:
u64*: Unsigned variable-length integer. Each encoded byte is 8 bits wide. Bit 7, the most significant bit, is the continuation flag. Bits 0 through 6 carry value bits. The first encoded byte stores the lowest order 7 value bits, the second encoded byte stores the next 7 value bits, and so on.
i64*: Signed variable-length integer. Each nonzero encoded byte is 8 bits wide. Bit 7, the most significant bit, is the continuation flag. Bits 0 through 6 carry value bits. The first encoded byte stores the lowest-order 7 value bits, the second encoded byte stores the next 7 value bits, and so on. Non-negative values end with a byte whose continuation flag is clear. Negative values end with an additional 0x00 terminator byte.
Data Blob Format (.blob)¶
The data blob format is used to store small binary data. The magic number decides the exact format:
|
unencrypted |
uncompressed |
|
unencrypted |
compressed |
|
encrypted |
uncompressed |
|
encrypted |
compressed |
The compression algorithm used is zstd. The encryption cipher is
AES_256_GCM.
Unencrypted blobs use the following format:
|
|
|
Encrypted blobs additionally contain a 16 byte initialization vector (IV), followed by a 16 byte authenticated encryption (AE) tag, followed by the encrypted data:
|
|
|
|
|
Fixed Index Format (.fidx)¶
All numbers are stored as little-endian.
|
|
|
Unique ID |
|
Creation Time (epoch) |
|
SHA-256 over the index (without header) |
|
Image size |
|
Chunk size |
|
Overall header size is one page (4096 bytes) |
|
First chunk digest |
|
Second chunk digest |
... |
Next chunk digest ... |
Dynamic Index Format (.didx)¶
All numbers are stored as little-endian.
|
|
|
Unique ID |
|
Creation Time (epoch) |
|
SHA-256 over the index (without header) |
|
Overall header size is one page (4096 bytes) |
|
End of first chunk |
|
First chunk digest |
|
End of second chunk |
|
Second chunk digest |
... |
Next chunk offset/digest |