Some updates to the backup format:
[cumulus.git] / doc / format.txt
index 78f32c3..c273e21 100644 (file)
@@ -1,13 +1,19 @@
                        Backup Format Description
-                  for an LFS-Inspired Backup Solution
+         for Cumulus: Efficient Filesystem Backup to the Cloud
+                   Version: "Cumulus Snapshot v0.11"
 
-NOTE: This format specification is not yet complete.  Right now the code
-provides the best documentation of the format.
+NOTE: This format specification is intended to be mostly stable, but is
+still subject to change before the 1.0 release.  The code may provide
+additional useful documentation on the format.
+
+NOTE2: The name of this project has changed from LBS to Cumulus.  In
+some areas the name "LBS" is still used.
 
 This document simply describes the snapshot format.  It is described
 from the point of view of a decompressor which wishes to restore the
 files from a snapshot.  It does not specify the exact behavior required
-of the backup program writing the snapshot.
+of the backup program writing the snapshot.  For details of the current
+backup program, see implementation.txt.
 
 This document does not explain the rationale behind the format; for
 that, see design.txt.
@@ -16,7 +22,7 @@ that, see design.txt.
 DATA CHECKSUMS
 ==============
 
-In several places in the LBS format, a cryptographic checksum may be
+In several places in the Cumulus format, a cryptographic checksum may be
 used to allow data integrity to be verified.  At the moment, only the
 SHA-1 checksum is supported, but it is expected that other algorithms
 will be supported in the future.
@@ -40,7 +46,7 @@ A sample checksum string is
 SEGMENTS & OBJECTS: STORAGE AND NAMING
 ======================================
 
-An LBS snapshot consists, at its base, of a collection of /objects/:
+A Cumulus snapshot consists, at its base, of a collection of /objects/:
 binary blobs of data, much like a file.  Higher layers interpret the
 contents of objects in various ways, but the lowest layer is simply
 concerned with storing and naming these objects.
@@ -49,9 +55,9 @@ An object is a sequence of bytes (octets) of arbitrary length.  An
 object may contain as few as zero bytes (though such objects are not
 very useful).  Object sizes are potentially unbounded, but it is
 recommended that the maximum size of objects produced be on the order of
-megabytes.  Files of essentially unlimited size can be stored in an LBS
-snapshot using objects of modest size, so this should not cause any real
-restrictions.
+megabytes.  Files of essentially unlimited size can be stored in a
+Cumulus snapshot using objects of modest size, so this should not cause
+any real restrictions.
 
 For storage purposes, objects are grouped together into /segments/.
 Segments use the TAR format; each object within a segment is stored as a
@@ -115,12 +121,35 @@ is invalid to select using the slice syntax a range of bytes that does
 not fall within the original object.  The slice specification should be
 appended to an object name, for example:
     a704eeae-97f2-4f30-91a4-d4473956366b/000001ad[264+1000]
-selects only bytes 264..1263 from the original object.
+selects only bytes 264..1263 from the original object.  As an
+abbreviation, the slice syntax
+    [<length>]
+is shorthand for
+    [0+<length>]
+In place of a traditional slice, the annotation
+    [=<length>]
+may be used.  This is somewhat similar to specifying [<length>], but
+additionally asserts that the referenced object is exactly <length>
+bytes long--that is, this slice syntax does not change the bytes
+returned at all, but can be used to provide information about the
+underlying object store.
 
 Both a checksum and a slice can be used.  In this case, the checksum is
 given first, followed by the slice.  The checksum is computed over the
 original object contents, before slicing.
 
+Special Objects
+---------------
+
+In addition to the standard syntax for objects described above, the
+special name "zero" may be used instead of segment/sequence number.
+This represents an object consisting entirely of zeroes.  The zero
+object must have a slice specification appended to indicate the size of
+the object.  For example
+    zero[1024]
+represents a block consisting of 1024 null bytes.  A checksum should not
+be given.  The slice syntax should use the abbreviated length-only form.
+
 
 FILE METADATA LISTING
 =====================
@@ -166,7 +195,8 @@ for each field is specified in the field listing that follows.
         and those starting with 0x are intepreted as hexadecimal.
 
 Common fields (required in all stanzas):
-    name [encoded string]: Full path of the file archived.
+    path [encoded string]: Full path of the file archived.  Note: In
+        previous versions (<= 0.2) the name of this field was "name".
     user [special]: The user ID of the file, as an integer, optionally
         followed by a space and the corresponding username, as an
         escaped string enclosed in parentheses.
@@ -176,14 +206,19 @@ Common fields (required in all stanzas):
     mode [integer]: Unix mode bits for the file.
     type [special]: A single character which indicates the type of file.
         The type indicators are meant to be consistent with the
-        characters used to indicate file type in a directory listing:
-            -   regular file
+        characters used with the -type option to find(1), and the file
+        type checks in test(1):
+            f   regular file
             b   block device
             c   character device
             d   directory
             l   symlink
             p   pipe
             s   socket
+        Note that previous versions used '-' to indicate a regular file.
+        This character should not be generated in any new snapshots, but
+        may be encountered in old snapshots (those with a format version
+        <= 0.2).
     mtime [integer]: Modification time of the file.
 
 Optional common fields:
@@ -199,6 +234,7 @@ Optional common fields:
         produced by the standard tool is <major>/<minor>/<inode> (where
         <major> and <minor> specify the device of the containing
         filesystem and <inode> is the inode number of the file).
+    ctime [integer]: Change time for the inode.
 
 Special fields used for regular files:
     checksum [string]: Checksum of the file contents.
@@ -211,6 +247,16 @@ Special fields used for regular files:
         references which should be parsed in the same manner as the data
         field.
 
+Special fields used for symbolic links:
+    target[encoded string]: The target of the symlink, as returned by
+        readlink(2).  Note: In old version of the format (<= 0.2), this
+        field was called "contents" instead of "target".
+
+Special fields used for block and character device files:
+    device[special]: The major and minor number of the device.  Encoded
+        as "major/minor", where major is the major device number encoded
+        into an integer, and minor is the minor device number.
+
 
 SNAPSHOT DESCRIPTOR
 ===================
@@ -226,20 +272,29 @@ The name of snapshot descriptor file is
 logically distinct sets of snapshots (such as snapshots for two
 different directory trees) that are being stored in the same location.
 <timestamp> gives the date and time the snapshot was taken; the format
-is %Y%m%dT%H%M%S (20070806T092239 means 2007-08-06 09:22:39).
+is %Y%m%dT%H%M%S (20070806T092239 means 2007-08-06 09:22:39).  It is
+recommended that the timestamp be given in UTC for consistent sorting
+even if the offset from UTC to local time changes, however the
+authoritative timestamp (including timezone) can be found in the Date
+field.  (In version v0.10 and earlier the timestamp is given in local
+time; in current versions UTC is used.)
 
 The contents of the descriptor are a set of RFC 822-style headers (much
 like the metadata listing).  The fields which are defined are:
-    Format: The string "LBS Snapshot v0.2" which identifies this file as
-        an LBS backup descriptor.  The version number (v0.2) might
-        change if there are changes to the format.  It is expected that
-        at some point, once the format is stabilized, the version
-        identifier will be changed to v1.0.
+    Format: The string "Cumulus Snapshot v0.11" which identifies this
+        file as a Cumulus backup descriptor.  The version number (v0.11)
+        might change if there are changes to the format.  It is expected
+        that at some point, once the format is stabilized, the version
+        identifier will be changed to v1.0.  (Earlier versions, format
+        v0.8 and earlier, used the string "LBS Snapshot" instead of
+        "Cumulus Snapshot", reflecting an earlier name for the project.
+        Consumers should be prepared for either name.)
     Producer: A informative string which identifies the program that
         produced the backup.
-    Date: The date the snapshot was produced.  This matches the
-        timestamp encoded in the filename, but is written out in full.
-        A timezone is given.  For example: "2007-08-06 09:22:39 -0700".
+    Date: The date the snapshot was produced, in the local time zone.
+        This matches the timestamp encoded in the filename, but is
+        written out in full.  A timezone (offset from UTC) is given.
+        For example: "2007-08-06 02:22:39 -0700".
     Scheme: The <scheme> field from the descriptor filename.
     Segments: A whitespace-seprated list of segment names.  Any segment
         which is referenced by this snapshot must be included in the
@@ -252,3 +307,6 @@ like the metadata listing).  The fields which are defined are:
         the snapshot descriptor file, but with extension .sha1sums
         instead of .lbs) containing SHA-1 checksums of all segments.
         This field contains a checksum of that file.
+    Intent: Informational; records the value of the --intent flag when
+        the snapshot was created, and can be used when determining which
+        snapshots to later delete.