---
name: "hdup"
section: "1"
platform: "linux"
package: "hdup"
version: "2.0.14-6+b2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/hdup"
---

# hdup(1)

harddisk duplicator/harddisk backupper - backup to harddisk

## NAME

hdup - harddisk duplicator/harddisk backupper - backup to harddisk

## SYNOPSIS

**hdup** \[ *OPTION* \] *SCHEME* *HOST* \[ *@USER@REMOTEHOST* \] *(1st format)*\
 **hdup** \[ *OPTION* \] *restore* *HOST* *DATE* *DIRECTORY* \[ *@USER@REMOTEHOST* \] *(2nd format)*

## DESCRIPTION

**Hdup** is used to backup a filesystem. Features include:

- **o**

  incremental backups: monthly, weekly and daily dumps,

- **o**

  encryption of the archive (via **mcrypt** or **GPG**),

- **o**

  compression of the archive (bzip/gzip/lzop/none),

- **o**

  possibility to transfer the archive to a remote host,

- **o**

  possibility to restore the archive from a remote host,

- **o**

  ability to split up archives,

- **o**

  no obscure archive format (it is a normal compressed tar file), and

- **o**

  simple to use.

The behaviour of **hdup** is controlled by its configuration file (see **[hdup.conf(5)](/hdup.conf/5.md)**). Internally **hdup** uses **GNU tar** to actually create the backups.

### First format

When using the 1st format **hdup** performs a backup. Remember: **hdup** pushes a backup *from* the localhost *to* the remote host.

The sort of backup is specified by *SCHEME*:

- **monthly**

  Make a full (null) dump of the filesystem.

- **weekly**

  Make an incremental dump of the filesystem relative to the latest monthly dump. If **hdup** cannot find a monthly dump it will complain, unless *always backup* is on. Then a monthly dump will be performed.

- **daily**

  Make an incremental dump of the filesystem relative to the latest weekly dump. If **hdup** cannot find a weekly dump it will complain, unless *always backup* is on. Then a weekly dump will be performed.

*HOST* is the host of which **hdup** should perform the backup. This should match a '\[HOST\]' statement in the configuration file. The directories of that host (specified with 'dir = *dir1*, *dir2*', ...) will be backed up to the directory specified with 'archive dir = *dir*'.  If *HOST* is not found no backup will be made.

*@USER@REMOTEHOST* is the host to which the archive should be transfered. This must include the user name. E.g *@miekg@elektron.atoom.net.*  *It is illegal to specify the colon ':'.* **hdup** must be present on the remote host. The location of this remote **hdup** is specified using *remote hdup*.

Any program capable of transferring files can used for this purpose. Currently tested is **ssh**. Other programs like **rsync** (not tested) may also work. Any program with the following characteristics will do:

- **o**

  must be usable as a filter (read from stdin, write to stdout),

- **o**

  must support *user@remotehost* syntax.

### Second format

When using the 2nd format a previous backed up filesystem is restored. Remember: **hdup** pushes a restore *from* the remote *to*  the local host. This is opposite from the backup operation!

*HOST* is the host who's archives should be restored.

*DATE* everything up to this date will be restored. **hdup** will look for the most recent monthly archive, then the most recent weekly and finally for the daily to pad up to date given. The *DATE* can either be specified as DD-MM-YYYY (date spec = default), as YYYY-MM-DD (date spec = iso) or as MM-DD-YYYY (date spec = american). This is controlled from the configuration file.

A special date is 'static' which instructs **hdup** to look in the 'static' directory. This is used when 'no history = yes'. This is dangerous to use because **hdup** will overwrite the old backup file with the new one. When your system crashes during the overwrite you have no backup at all! Only use this when you *really* don't have room for two monthly backups.

Another special date is 'today' which instructs **hdup** to use the current date.

*DIRECTORY* tells **hdup** to which directory the archive should be untarred to. Be very careful when running **hdup** as root and specifying '/' as the directory. Version 1.4 and above refuses to restore to '/'. This can be overridden by specifying 'force = on/yes' in the configuration.

*@USER@REMOTEHOST* is the host to which the archive should be restored. This must include the user name. E.g *@miekg@elektron.atoom.net.* *As as version 1.6.6 it is illegal to specify the colon ':'. On the remosthost* *and in DIRECTORY* the archive is restored. **hdup** must be present  on the remote host.

### Status message

When **hdup** is finished with its current operation it will print an overview message:

| |
| --- |
| Hdup version.: 1.6.6 |
|  |
| Host.........: elektron |
| Date.........: 2003-02-02 |
| Scheme.......: monthly |
| Archive......: elektron.2003-02-02.monthly.tar.gz |
| Encryption...: no |
| Archive size.: 257k |
| Elapsed......: 0:01:27 |
| Status.......: successfully performed backup |

Which can be mailed to you via cron.

## OPTIONS

- **-c, --config=***config*

  Location of the configuration file. The default location of **hdup**'s configuration file is */etc/hdup/hdup.conf*.

- **-s, --specific=***file*

  Restore a specific file from an archive. *file* must be the **full** *path* *to the file, relative paths will not work.*

- **-i, --ignore-tar**

  **Ignore tar errors when restoring.**

- **-I, --ignore-conf**

  **Ignore errors in the configuration file.**

- **-P, --patched\_tar**

  **Tar is patched so that it can handle** *--no-recursion*, *--listed-incremental* and *--files-from* together. This options enables two things in hdup; 1) directory info is written to 'filelist' and 2) *--no-recursion* is given to **tar**.

  This solves the bug whereby **hdup** wouldn't include directory information in the archives.

- **-d, --dryrun**

  **Do a dryrun - don't do anything with the filesystem**

- **-q, --quiet**

  **Suppress the output of the subprocesses (like 'tar' and 'ssh').**

- **-q -q, --quiet --quiet**

  **Suppress the logging output from hdup**.

- **-q -q -q, --quiet --quiet --quiet**

  **No logging at all. Even no overview message.**

- **-V**

  **Be more verbose.**

- **-V -V**

  **Be even more verbose. This will show which files are backed up by** **hdup** IF you also supply the -D option.

- **-h, --help**

  **A help message.**

- **-v, --version**

  **Show the version of hdup.**

- **-D, --debug**

  **Show a lot of information which can aid debugging.**

**The -V and -q options do** *not* effect each other. A '-qqq -VV' option list will mean that **hdup** will show what is run, but nothing else (no overview message and no warning nor errors).

## ENCRYPTION

**hdup** can encrypt the archives, **mcrypt** is used for the actual encryption. As of version 1.6.25 **GPG** can also be used to encrypt the archive. Note that currently remotely restoring a GPG encrypted archives is not working.

### mcrypt

With **mcrypt --list** you get a list of the algorithms mcrypt supports:

| |
| --- |
| ... |
| *serpent* (32): cbc cfb ctr ecb ncfb ofb nofb |
| *wake* (32): stream |
| *loki97* (32): cbc cfb ctr ecb ncfb ofb nofb |
| *rijndael-128* (32): cbc cfb ctr ecb ncfb ofb nofb |
| *rijndael-192* (32): cbc cfb ctr ecb ncfb ofb nofb |
| ... |

If you want to use *loki97* you specify **algorithm = loki97** in hdup.conf. The same goes for all the other algorithms.

### GPG

To use **GPG** the following is needed. Set **algorithm = gpg** and **key = user ID of key**. In my case I've created a GPG key with user ID of 'miekg' so I use:\
 **algorithm = gpg**\
 **key = miekg**\
 The **key** is supplied to **gpg** with the *-r* argument. See the manpage  of **gpg** for more details.

When restoring a GPG encrypted archive you will be prompted to unlock your private key.

## AUTHOR

Written by Miek Gieben. Wouter van Gils helped a lot with testing pre-release versions. User feedback is appreciated.

## REPORTING BUGS

Report bugs to \<hdup-user@miek.nl\>.

## BUGS

The %a expansion is not always the same in the prerun and postrun scripts (when using encryption).

## LIMITATIONS

Under Linux kernel version 2.2 the archive size cannot exceed two (2) Gigabyte. If you need larger archives sizes you should upgrade your kernel. You can however solve this by using *chunk size*. Just define your maximum allowed size, something like *chunk size = 1800M* and you're set.

If you encrypt archives and want to restore them, you are forced to use one encryption scheme for all the backups. **hdup** does not store the key and algorithm with the archive, thus it is impossible to restore archives that use different keys and algorithms.

## COPYRIGHT

Copyright (C) 2001-2005 Miek Gieben. This is free software. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

## SEE ALSO

**[hdup.conf(5)](/hdup.conf/5.md)** for information about **hdup**'s configuration file.
