123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488 |
- .\" Man page generated from reStructuredText.
- .
- .
- .nr rst2man-indent-level 0
- .
- .de1 rstReportMargin
- \\$1 \\n[an-margin]
- level \\n[rst2man-indent-level]
- level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
- -
- \\n[rst2man-indent0]
- \\n[rst2man-indent1]
- \\n[rst2man-indent2]
- ..
- .de1 INDENT
- .\" .rstReportMargin pre:
- . RS \\$1
- . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
- . nr rst2man-indent-level +1
- .\" .rstReportMargin post:
- ..
- .de UNINDENT
- . RE
- .\" indent \\n[an-margin]
- .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
- .nr rst2man-indent-level -1
- .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
- .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
- ..
- .TH "BORG-CREATE" "1" "2025-05-19" "" "borg backup tool"
- .SH NAME
- borg-create \- Create new archive
- .SH SYNOPSIS
- .sp
- borg [common options] create [options] NAME [PATH...]
- .SH DESCRIPTION
- .sp
- This command creates a backup archive containing all files found while recursively
- traversing all paths specified. Paths are added to the archive as they are given,
- that means if relative paths are desired, the command has to be run from the correct
- directory.
- .sp
- The slashdot hack in paths (recursion roots) is triggered by using \fB/./\fP:
- \fB/this/gets/stripped/./this/gets/archived\fP means to process that fs object, but
- strip the prefix on the left side of \fB\&./\fP from the archived items (in this case,
- \fBthis/gets/archived\fP will be the path in the archived item).
- .sp
- When giving \(aq\-\(aq as path, borg will read data from standard input and create a
- file \(aqstdin\(aq in the created archive from that data. In some cases it\(aqs more
- appropriate to use \-\-content\-from\-command, however. See section \fIReading from
- stdin\fP below for details.
- .sp
- The archive will consume almost no disk space for files or parts of files that
- have already been stored in other archives.
- .sp
- The archive name does NOT need to be unique, you can and should use the same
- name for a series of archives. The unique archive identifier is its ID (hash)
- and you can abbreviate the ID as long as it is unique.
- .sp
- In the archive name, you may use the following placeholders:
- {now}, {utcnow}, {fqdn}, {hostname}, {user} and some others.
- .sp
- Backup speed is increased by not reprocessing files that are already part of
- existing archives and weren\(aqt modified. The detection of unmodified files is
- done by comparing multiple file metadata values with previous values kept in
- the files cache.
- .sp
- This comparison can operate in different modes as given by \fB\-\-files\-cache\fP:
- .INDENT 0.0
- .IP \(bu 2
- ctime,size,inode (default)
- .IP \(bu 2
- mtime,size,inode (default behaviour of borg versions older than 1.1.0rc4)
- .IP \(bu 2
- ctime,size (ignore the inode number)
- .IP \(bu 2
- mtime,size (ignore the inode number)
- .IP \(bu 2
- rechunk,ctime (all files are considered modified \- rechunk, cache ctime)
- .IP \(bu 2
- rechunk,mtime (all files are considered modified \- rechunk, cache mtime)
- .IP \(bu 2
- disabled (disable the files cache, all files considered modified \- rechunk)
- .UNINDENT
- .sp
- inode number: better safety, but often unstable on network filesystems
- .sp
- Normally, detecting file modifications will take inode information into
- consideration to improve the reliability of file change detection.
- This is problematic for files located on sshfs and similar network file
- systems which do not provide stable inode numbers, such files will always
- be considered modified. You can use modes without \fIinode\fP in this case to
- improve performance, but reliability of change detection might be reduced.
- .sp
- ctime vs. mtime: safety vs. speed
- .INDENT 0.0
- .IP \(bu 2
- ctime is a rather safe way to detect changes to a file (metadata and contents)
- as it can not be set from userspace. But, a metadata\-only change will already
- update the ctime, so there might be some unnecessary chunking/hashing even
- without content changes. Some filesystems do not support ctime (change time).
- E.g. doing a chown or chmod to a file will change its ctime.
- .IP \(bu 2
- mtime usually works and only updates if file contents were changed. But mtime
- can be arbitrarily set from userspace, e.g. to set mtime back to the same value
- it had before a content change happened. This can be used maliciously as well as
- well\-meant, but in both cases mtime based cache modes can be problematic.
- .UNINDENT
- .sp
- The mount points of filesystems or filesystem snapshots should be the same for every
- creation of a new archive to ensure fast operation. This is because the file cache that
- is used to determine changed files quickly uses absolute filenames.
- If this is not possible, consider creating a bind mount to a stable location.
- .sp
- The \fB\-\-progress\fP option shows (from left to right) Original and (uncompressed)
- deduplicated size (O and U respectively), then the Number of files (N) processed so far,
- followed by the currently processed path.
- .sp
- When using \fB\-\-stats\fP, you will get some statistics about how much data was
- added \- the \(dqThis Archive\(dq deduplicated size there is most interesting as that is
- how much your repository will grow. Please note that the \(dqAll archives\(dq stats refer to
- the state after creation. Also, the \fB\-\-stats\fP and \fB\-\-dry\-run\fP options are mutually
- exclusive because the data is not actually compressed and deduplicated during a dry run.
- .sp
- For more help on include/exclude patterns, see the \fIborg_patterns\fP command output.
- .sp
- For more help on placeholders, see the \fIborg_placeholders\fP command output.
- .SH OPTIONS
- .sp
- See \fIborg\-common(1)\fP for common options of Borg commands.
- .SS arguments
- .INDENT 0.0
- .TP
- .B NAME
- specify the archive name
- .TP
- .B PATH
- paths to archive
- .UNINDENT
- .SS options
- .INDENT 0.0
- .TP
- .B \-n\fP,\fB \-\-dry\-run
- do not create a backup archive
- .TP
- .B \-s\fP,\fB \-\-stats
- print statistics for the created archive
- .TP
- .B \-\-list
- output verbose list of items (files, dirs, ...)
- .TP
- .BI \-\-filter \ STATUSCHARS
- only display items with the given status characters (see description)
- .TP
- .B \-\-json
- output stats as JSON. Implies \fB\-\-stats\fP\&.
- .TP
- .BI \-\-stdin\-name \ NAME
- use NAME in archive for stdin data (default: \(aqstdin\(aq)
- .TP
- .BI \-\-stdin\-user \ USER
- set user USER in archive for stdin data (default: do not store user/uid)
- .TP
- .BI \-\-stdin\-group \ GROUP
- set group GROUP in archive for stdin data (default: do not store group/gid)
- .TP
- .BI \-\-stdin\-mode \ M
- set mode to M in archive for stdin data (default: 0660)
- .TP
- .B \-\-content\-from\-command
- interpret PATH as command and store its stdout. See also section Reading from stdin below.
- .TP
- .B \-\-paths\-from\-stdin
- read DELIM\-separated list of paths to back up from stdin. All control is external: it will back up all files given \- no more, no less.
- .TP
- .B \-\-paths\-from\-command
- interpret PATH as command and treat its output as \fB\-\-paths\-from\-stdin\fP
- .TP
- .BI \-\-paths\-delimiter \ DELIM
- set path delimiter for \fB\-\-paths\-from\-stdin\fP and \fB\-\-paths\-from\-command\fP (default: \fB\en\fP)
- .UNINDENT
- .SS Include/Exclude options
- .INDENT 0.0
- .TP
- .BI \-e \ PATTERN\fR,\fB \ \-\-exclude \ PATTERN
- exclude paths matching PATTERN
- .TP
- .BI \-\-exclude\-from \ EXCLUDEFILE
- read exclude patterns from EXCLUDEFILE, one per line
- .TP
- .BI \-\-pattern \ PATTERN
- include/exclude paths matching PATTERN
- .TP
- .BI \-\-patterns\-from \ PATTERNFILE
- read include/exclude patterns from PATTERNFILE, one per line
- .TP
- .B \-\-exclude\-caches
- exclude directories that contain a CACHEDIR.TAG file ( <http://www.bford.info/cachedir/spec.html> )
- .TP
- .BI \-\-exclude\-if\-present \ NAME
- exclude directories that are tagged by containing a filesystem object with the given NAME
- .TP
- .B \-\-keep\-exclude\-tags
- if tag objects are specified with \fB\-\-exclude\-if\-present\fP, don\(aqt omit the tag objects themselves from the backup archive
- .TP
- .B \-\-exclude\-nodump
- exclude files flagged NODUMP
- .UNINDENT
- .SS Filesystem options
- .INDENT 0.0
- .TP
- .B \-x\fP,\fB \-\-one\-file\-system
- stay in the same file system and do not store mount points of other file systems \- this might behave different from your expectations, see the description below.
- .TP
- .B \-\-numeric\-ids
- only store numeric user and group identifiers
- .TP
- .B \-\-atime
- do store atime into archive
- .TP
- .B \-\-noctime
- do not store ctime into archive
- .TP
- .B \-\-nobirthtime
- do not store birthtime (creation date) into archive
- .TP
- .B \-\-noflags
- do not read and store flags (e.g. NODUMP, IMMUTABLE) into archive
- .TP
- .B \-\-noacls
- do not read and store ACLs into archive
- .TP
- .B \-\-noxattrs
- do not read and store xattrs into archive
- .TP
- .B \-\-sparse
- detect sparse holes in input (supported only by fixed chunker)
- .TP
- .BI \-\-files\-cache \ MODE
- operate files cache in MODE. default: ctime,size,inode
- .TP
- .B \-\-read\-special
- open and read block and char device files as well as FIFOs as if they were regular files. Also follows symlinks pointing to these kinds of files.
- .UNINDENT
- .SS Archive options
- .INDENT 0.0
- .TP
- .BI \-\-comment \ COMMENT
- add a comment text to the archive
- .TP
- .BI \-\-timestamp \ TIMESTAMP
- manually specify the archive creation date/time (yyyy\-mm\-ddThh:mm:ss[(+|\-)HH:MM] format, (+|\-)HH:MM is the UTC offset, default: local time zone). Alternatively, give a reference file/directory.
- .TP
- .BI \-\-chunker\-params \ PARAMS
- specify the chunker parameters (ALGO, CHUNK_MIN_EXP, CHUNK_MAX_EXP, HASH_MASK_BITS, HASH_WINDOW_SIZE). default: buzhash,19,23,21,4095
- .TP
- .BI \-C \ COMPRESSION\fR,\fB \ \-\-compression \ COMPRESSION
- select compression algorithm, see the output of the \(dqborg help compression\(dq command for details.
- .UNINDENT
- .SH EXAMPLES
- .INDENT 0.0
- .INDENT 3.5
- .sp
- .EX
- # Backup ~/Documents into an archive named \(dqmy\-documents\(dq
- $ borg create my\-documents ~/Documents
- # same, but list all files as we process them
- $ borg create \-\-list my\-documents ~/Documents
- # Backup /mnt/disk/docs, but strip path prefix using the slashdot hack
- $ borg create \-\-repo /path/to/repo docs /mnt/disk/./docs
- # Backup ~/Documents and ~/src but exclude pyc files
- $ borg create my\-files \e
- ~/Documents \e
- ~/src \e
- \-\-exclude \(aq*.pyc\(aq
- # Backup home directories excluding image thumbnails (i.e. only
- # /home/<one directory>/.thumbnails is excluded, not /home/*/*/.thumbnails etc.)
- $ borg create my\-files /home \-\-exclude \(aqsh:home/*/.thumbnails\(aq
- # Backup the root filesystem into an archive named \(dqroot\-archive\(dq
- # use zlib compression (good, but slow) \- default is lz4 (fast, low compression ratio)
- $ borg create \-C zlib,6 \-\-one\-file\-system root\-archive /
- # Backup into an archive name like FQDN\-root
- $ borg create \(aq{fqdn}\-root\(aq /
- # Backup a remote host locally (\(dqpull\(dq style) using sshfs
- $ mkdir sshfs\-mount
- $ sshfs root@example.com:/ sshfs\-mount
- $ cd sshfs\-mount
- $ borg create example.com\-root .
- $ cd ..
- $ fusermount \-u sshfs\-mount
- # Make a big effort in fine granular deduplication (big chunk management
- # overhead, needs a lot of RAM and disk space, see formula in internals docs):
- $ borg create \-\-chunker\-params buzhash,10,23,16,4095 small /smallstuff
- # Backup a raw device (must not be active/in use/mounted at that time)
- $ borg create \-\-read\-special \-\-chunker\-params fixed,4194304 my\-sdx /dev/sdX
- # Backup a sparse disk image (must not be active/in use/mounted at that time)
- $ borg create \-\-sparse \-\-chunker\-params fixed,4194304 my\-disk my\-disk.raw
- # No compression (none)
- $ borg create \-\-compression none arch ~
- # Super fast, low compression (lz4, default)
- $ borg create arch ~
- # Less fast, higher compression (zlib, N = 0..9)
- $ borg create \-\-compression zlib,N arch ~
- # Even slower, even higher compression (lzma, N = 0..9)
- $ borg create \-\-compression lzma,N arch ~
- # Only compress compressible data with lzma,N (N = 0..9)
- $ borg create \-\-compression auto,lzma,N arch ~
- # Use short hostname and user name as archive name
- $ borg create \(aq{hostname}\-{user}\(aq ~
- # Backing up relative paths by moving into the correct directory first
- $ cd /home/user/Documents
- # The root directory of the archive will be \(dqprojectA\(dq
- $ borg create \(aqdaily\-projectA\(aq projectA
- # Use external command to determine files to archive
- # Use \-\-paths\-from\-stdin with find to back up only files less than 1MB in size
- $ find ~ \-size \-1000k | borg create \-\-paths\-from\-stdin small\-files\-only
- # Use \-\-paths\-from\-command with find to back up files from only a given user
- $ borg create \-\-paths\-from\-command joes\-files \-\- find /srv/samba/shared \-user joe
- # Use \-\-paths\-from\-stdin with \-\-paths\-delimiter (for example, for filenames with newlines in them)
- $ find ~ \-size \-1000k \-print0 | borg create \e
- \-\-paths\-from\-stdin \e
- \-\-paths\-delimiter \(dq\e0\(dq \e
- smallfiles\-handle\-newline
- .EE
- .UNINDENT
- .UNINDENT
- .SH NOTES
- .sp
- The \fB\-\-exclude\fP patterns are not like tar. In tar \fB\-\-exclude\fP .bundler/gems will
- exclude foo/.bundler/gems. In borg it will not, you need to use \fB\-\-exclude\fP
- \(aq*/.bundler/gems\(aq to get the same effect.
- .sp
- In addition to using \fB\-\-exclude\fP patterns, it is possible to use
- \fB\-\-exclude\-if\-present\fP to specify the name of a filesystem object (e.g. a file
- or folder name) which, when contained within another folder, will prevent the
- containing folder from being backed up. By default, the containing folder and
- all of its contents will be omitted from the backup. If, however, you wish to
- only include the objects specified by \fB\-\-exclude\-if\-present\fP in your backup,
- and not include any other contents of the containing folder, this can be enabled
- through using the \fB\-\-keep\-exclude\-tags\fP option.
- .sp
- The \fB\-x\fP or \fB\-\-one\-file\-system\fP option excludes directories, that are mountpoints (and everything in them).
- It detects mountpoints by comparing the device number from the output of \fBstat()\fP of the directory and its
- parent directory. Specifically, it excludes directories for which \fBstat()\fP reports a device number different
- from the device number of their parent.
- In general: be aware that there are directories with device number different from their parent, which the kernel
- does not consider a mountpoint and also the other way around.
- Linux examples for this are bind mounts (possibly same device number, but always a mountpoint) and ALL
- subvolumes of a btrfs (different device number from parent but not necessarily a mountpoint).
- macOS examples are the apfs mounts of a typical macOS installation.
- Therefore, when using \fB\-\-one\-file\-system\fP, you should double\-check that the backup works as intended.
- .SS Item flags
- .sp
- \fB\-\-list\fP outputs a list of all files, directories and other
- file system items it considered (no matter whether they had content changes
- or not). For each item, it prefixes a single\-letter flag that indicates type
- and/or status of the item.
- .sp
- If you are interested only in a subset of that output, you can give e.g.
- \fB\-\-filter=AME\fP and it will only show regular files with A, M or E status (see
- below).
- .sp
- A uppercase character represents the status of a regular file relative to the
- \(dqfiles\(dq cache (not relative to the repo \-\- this is an issue if the files cache
- is not used). Metadata is stored in any case and for \(aqA\(aq and \(aqM\(aq also new data
- chunks are stored. For \(aqU\(aq all data chunks refer to already existing chunks.
- .INDENT 0.0
- .IP \(bu 2
- \(aqA\(aq = regular file, added (see also \fIa_status_oddity\fP in the FAQ)
- .IP \(bu 2
- \(aqM\(aq = regular file, modified
- .IP \(bu 2
- \(aqU\(aq = regular file, unchanged
- .IP \(bu 2
- \(aqC\(aq = regular file, it changed while we backed it up
- .IP \(bu 2
- \(aqE\(aq = regular file, an error happened while accessing/reading \fIthis\fP file
- .UNINDENT
- .sp
- A lowercase character means a file type other than a regular file,
- borg usually just stores their metadata:
- .INDENT 0.0
- .IP \(bu 2
- \(aqd\(aq = directory
- .IP \(bu 2
- \(aqb\(aq = block device
- .IP \(bu 2
- \(aqc\(aq = char device
- .IP \(bu 2
- \(aqh\(aq = regular file, hardlink (to already seen inodes)
- .IP \(bu 2
- \(aqs\(aq = symlink
- .IP \(bu 2
- \(aqf\(aq = fifo
- .UNINDENT
- .sp
- Other flags used include:
- .INDENT 0.0
- .IP \(bu 2
- \(aq+\(aq = included, item would be backed up (if not in dry\-run mode)
- .IP \(bu 2
- \(aq\-\(aq = excluded, item would not be / was not backed up
- .IP \(bu 2
- \(aqi\(aq = backup data was read from standard input (stdin)
- .IP \(bu 2
- \(aq?\(aq = missing status code (if you see this, please file a bug report!)
- .UNINDENT
- .SS Reading backup data from stdin
- .sp
- There are two methods to read from stdin. Either specify \fB\-\fP as path and
- pipe directly to borg:
- .INDENT 0.0
- .INDENT 3.5
- .sp
- .EX
- backup\-vm \-\-id myvm \-\-stdout | borg create \-\-repo REPO ARCHIVE \-
- .EE
- .UNINDENT
- .UNINDENT
- .sp
- Or use \fB\-\-content\-from\-command\fP to have Borg manage the execution of the
- command and piping. If you do so, the first PATH argument is interpreted
- as command to execute and any further arguments are treated as arguments
- to the command:
- .INDENT 0.0
- .INDENT 3.5
- .sp
- .EX
- borg create \-\-content\-from\-command \-\-repo REPO ARCHIVE \-\- backup\-vm \-\-id myvm \-\-stdout
- .EE
- .UNINDENT
- .UNINDENT
- .sp
- \fB\-\-\fP is used to ensure \fB\-\-id\fP and \fB\-\-stdout\fP are \fBnot\fP considered
- arguments to \fBborg\fP but rather \fBbackup\-vm\fP\&.
- .sp
- The difference between the two approaches is that piping to borg creates an
- archive even if the command piping to borg exits with a failure. In this case,
- \fBone can end up with truncated output being backed up\fP\&. Using
- \fB\-\-content\-from\-command\fP, in contrast, borg is guaranteed to fail without
- creating an archive should the command fail. The command is considered failed
- when it returned a non\-zero exit code.
- .sp
- Reading from stdin yields just a stream of data without file metadata
- associated with it, and the files cache is not needed at all. So it is
- safe to disable it via \fB\-\-files\-cache disabled\fP and speed up backup
- creation a bit.
- .sp
- By default, the content read from stdin is stored in a file called \(aqstdin\(aq.
- Use \fB\-\-stdin\-name\fP to change the name.
- .SS Feeding all file paths from externally
- .sp
- Usually, you give a starting path (recursion root) to borg and then borg
- automatically recurses, finds and backs up all fs objects contained in
- there (optionally considering include/exclude rules).
- .sp
- If you need more control and you want to give every single fs object path
- to borg (maybe implementing your own recursion or your own rules), you can use
- \fB\-\-paths\-from\-stdin\fP or \fB\-\-paths\-from\-command\fP (with the latter, borg will
- fail to create an archive should the command fail).
- .sp
- Borg supports paths with the slashdot hack to strip path prefixes here also.
- So, be careful not to unintentionally trigger that.
- .SH SEE ALSO
- .sp
- \fIborg\-common(1)\fP, \fIborg\-delete(1)\fP, \fIborg\-prune(1)\fP, \fIborg\-check(1)\fP, \fIborg\-patterns(1)\fP, \fIborg\-placeholders(1)\fP, \fIborg\-compression(1)\fP, \fIborg\-repo\-create(1)\fP
- .SH AUTHOR
- The Borg Collective
- .\" Generated by docutils manpage writer.
- .
|