28

I'm quite new to Ubuntu and want to create a backup. I'm really not sure what files and folders to include so that if I restore my system it will be as it is now. I can't seem to find good details of this anywhere. Hopefully someone could help me with this. Is it possible to backup everything as it is now so in the event of a system restore I don't have to reinstall programs and settings?

  • Yeah I too want to know what the important files are without having to backup the entire drive. Crontabs (root and user), exportfs etc. – Sridhar Sarnobat Jun 3 '18 at 18:06
24

My backup sets currently contain

/etc
/home
/root
/srv
/usr (/usr/local only, nothing else)
/var (except /var/run, /var/cache, /var/tmp)

Note this is for a server, so backing up things like /etc saves all my configuration for my services, I have web servers in /srv (though if you have them in /var/www, they would still be in this backup set), I have various scripts and things set up in /usr/local, etc. Backing up /home instead of /home/myusername is so that I can preserve all users. If all you want to keep is your user data, you only need your home directory.

  • Why are you including /root? – Mohammed Joraid Jul 19 '17 at 10:03
  • 2
    It's the home directory of the root user, I keep some sysadmin scripts in there, for backup etc. Though I've moved most of these to /usr/local/sbin/ – thomasrutter Jul 21 '17 at 11:03
  • Is there any need to include the .cache folder in each user's home directory (~/.cache), or can we omit that too? It can be tens of thousands of files and many gigabytes of data. My understanding is that if we don't include it it just means that applications have to re-generate temporary, cached files again next time they run, which increases run time and startup time but is harmless, right? – Gabriel Staples Jul 9 at 18:37
  • 1
    Excluding ~/.cache sounds ok to me. I don't exclude it myself but if you want to cut down on data transfer/sync time, that can be an option. – thomasrutter Jul 10 at 0:03
  • 1
    @GabrielStaples I don't use /opt but if you do use it, then you may include it in your backups. /opt tends to be unused by distros themselves leaving it up to the user, but application vendors who provide a Linux system with their third-party app installed on it might use /opt or if you develop your own software you may have it in /opt instead of /usr/local – thomasrutter Jul 10 at 0:06
10

What you need to backup depends on your particular system*.

So this is going to take a little work on your part to sort out. Start by figuring out what does not need to be backed up. First take a look at your root directory, and then work backwards.

For example, cd /; ls -F gives me:

bin/    initrd.img@      mnt/   snap/  vmlinuz@
boot/   initrd.img.old@  opt/   srv/   vmlinuz.old@
cdrom/  lib/             proc/  sys/
dev/    lib64/           root/  tmp/
etc/    lost+found/      run/   usr/
home/   media/           sbin/  var/

/cdrom, /media, and /mnt are mount points so don't need backup.

/dev, /lost+found, /proc, /run, /sys and /tmp get auto re-created on reboot. [I'm guessing the links: /initrd.img@, /initrd.img.old@, /vmlinuz@, /vmlinuz.old@ get re-created on boot ubuntu reinstall (I'm not sure which).]

On my system /root is empty (use sudo -s to open a shell as root user to view it ... be careful to exit immediately after you inspect /root.)

/snap is also empty. Perhaps it's a mount point.

/var contains variable data like system logging files, mail and printer spool directories, and transient and temporary files." I now back it up, except for /var/log. ref: http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/var.html)

/bin, /boot, /lib, /lib64, and /sbin presumably will get reloaded via a reinstall of Ubuntu unless you are doing system development work or something like that. You can either back these up or rely on a fresh install to recover them.

/home should be in it's own backup. There will be times when you will want to restore just /home.

That leaves other changes you've made to your system in /etc, /opt, /srv, and /usr which you will want to also backup, either together or individually.

Here are a couple of pages that might help understand these directories:

http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/the-root-directory.html http://www.tldp.org/LDP/intro-linux/html/sect_03_01.html#sect_03_01_03


A related line of thinking is: Say you just installed a fresh Ubuntu. What would you need to back up? Answer: nothing. You haven't changed anything yet, so you can simply reinstall Ubuntu. It restores /bin, /etc, /root, /usr, etc.

So the only reason you might want to backup /bin is because you have changed it or added to it. So part of backing up is understanding what is where and when it is created and modified. Just know that the rest of us struggle with this too.


*****And, although you didn't ask, one can make full disk or partition images. These take a lot of time to backup and restore and may leave your system down while that work is proceeding. And it's how I used to backup my Windows systems using Acronis. The one thing they provide you with is a partition map, and images from non-linux partitions. I now make these before I reorganize partitions, and before I test my backup restore functions.


(I'm very open to suggestions as to how I could make this better.)

  • This is great when you're focussed on configurations and don't need the binaries, like you said they can be installed again and this is much lighter to export and than to reinstall askubuntu.com/a/55906/104223 – CTS_AE Jan 17 '17 at 4:39
5

If I reinstall my desktop system, I backup

  • /etc
  • /var, I'm too lazy to exclude some sub-folders
  • /opt

/home is on a separate partition and has a backup made every day.

After the reinstall, I restore the parts from my backup, which I really need.

With this strategy, all my configurations, local mails and crontab configurations are safe and I have to reinstall my needed applications only.

My personal scripts are saved in my home folder (daily backup, remember?), therefore I don't use /usr/local.

  • 1
    Will it work if I backup root, that is everything?: ./ – Suspended Feb 25 '16 at 13:25
  • That would be like a clone of what I'm using now. – Suspended Feb 25 '16 at 13:26
  • What is in /opt that we need? ie: why back it up? – Gabriel Staples Jul 9 at 18:42
3

Most people just backup their home directory: /home/$USER/. If you want to back up the configuration files and settings, those are stored in folders and files in your home directory that start with a . (dot). Make a list of packages that you use (and PPAs) and it will be easy to reinstall all your packages should you need. Or, use the command described in this comment.

Deja Dup Backup is a great tool that comes as a default on Ubuntu. Other options include command line (rsync, rsnapshot, rdiff-backup, etc).

Finally, to backup the whole disk as an image, check out clonezilla.

  • 2
    Also, in addition to what the answer psny linked to, it wouldn't hurt to create a back up of the whole /etc/ directory which stores system wide settings. If you've made some changes there, it would be helpful to have an archive to get those changes from. – Marcin Kaminski Dec 1 '12 at 15:12
  • 2
    If you have any crontabs setup, then backup /var/spool/cron too. – Ian Dunn Apr 29 '15 at 7:08
3

Let's collect a list of files here. I've made this post "community wiki."

Of course, it varies from person to person. Mine is used mainly as a web server and NFS server.

mkdir $MY_BACKUP_FOLDER
cd $MY_BACKUP_FOLDER

crontabs

sudo rsync -a --relative /var/spool/cron/crontabs .

NFS shares

sudo rsync -a --relative /etc/exports .

sudoers

sudo rsync -a --relative /etc/sudoers .

apache config

sudo rsync -a --relative /etc/apache2/apache2.conf .

autofs

sudo rsync -a --relative /etc/auto* .

fstab

sudo rsync -a --relative /etc/fstab .

hosts

sudo rsync -a --relative /etc/hosts .

samba

sudo rsync -a --relative /etc/samba/smb.conf .

USB Device (udev) rules

sudo rsync -a --relative /etc/udev .

systemd

mlocate

sudo rsync -a --relative /etc/updatedb.conf .

Ubuntu launcher ("Start Menu") .desktop files, incl. any custom ones you've set up:

sudo rsync -a --relative /usr/share/applications .

home dir can be preserved if you do a ubuntu reinstall

1

Just a reminder if you're using DejaDup (or anything else really), also exclude any cloud storage folders (likely in your home), such as Dropbox. If you're paying for s3 storage this could be a bad mistake.

0

Use Deja Dup backup. It is provided by default. Go to settings and keep only root folder (/) as "folders to include" and add media folder (/media) in "folders to ignore".

Because of this, all your programs will be backed up in case of system damage (rare) except your other drives which normally remain unaffected.

0

I backup what is important to me which can loosely be defined as my intellectual property plus efforts spent configuring Ubuntu to work perfectly (for me).

I have the backup run every morning at 4:00 am or whenever Laptop resumes from suspend. It is controlled through /etc/cron.daily script.

The best kind of backup is off-site in case of fire or flood where computer sits so I take advantage of free 15GB gmail.com account and send a compressed daily backup there.

After a couple of years I hit my 15 GB "free" quota so wrote a script to recycle backups into 180 days, 78 weeks, 36 months and 100 yearly backups.

Here is the daily backup script of what's important to me:

#!/bin/bash

# NAME: daily-backup.sh
# PATH: /mnt/e/bin
# DESC: Backup scripts, documents and configuration files to .tar

# DATE: July 11, 2017. Modified July 7, 2019.

HomeDir="/home/USER_NAME"                    # Required for cron compatibility
EmailAddr="EMAIL_NAME@gmail.com"

# PARM: 1=backup file name. Extension .tar.gz automatically appended.

# NOTE: To include MBR (Master Boot Record) in backup create an image using:
#       sudo dd if=/dev/sda of="$HOME/.mbr.sav" bs=512 count=1

# NOTE: CLONE CURRENT INSTALLATION TO NEW MACHINE
#       =========================================

#       To restore use Live USB to install Ubuntu alongside Windows 10
#       Connect to network with password xxxxxxxxx

#       Install Google Chrome
#       (https://askubuntu.com/questions/510056/how-to-install-google-chrome):

#           wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub 
#               | sudo apt-key add
#           echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/
#               stable main' | sudo tee /etc/apt/sources.list.d/google-chrome.list
#           sudo apt update
#           sudo apt install google-chrome-stable

#       Open gmail.com and download attachment `$1` which is usually called
#           Backup-yymmdd-DayOfWeekName.tar

#       Make missing home/bin directory which tar doesn't create automatically:
#           mkdir ~/bin

#       Restore the daily backup using:
#           sudo tar -xvf Backup-yymmdd-DayFfWeekName.tar -C /
#           yar -xvf Backup-yymmdd-DayFfWeekName.tar -C /

#       Patch /etc/default/grub with new machine parameters, ie for nvme use:
#           acpiphp.disable=1

#       Use `sudo apt install aptitude-common`
#       Clone packages using `aptitude-create-state-bundle` on Source
#       Copy state-bundle.tar file from Source to Target machine
#       Restore packages using `aptitude-run-state-bundle` on Target

#       Manually copy ~/Pictures, ~/Videos, etc. not in daily backup.

#       sudo update-grub        # NVMe suspend/resume acpiphp.disable=1
#       sudo update-initramfs   # to get plymouth sunrise splash screen

if [[ $# -ne 1 ]]; then
    echo 'One argument required for file name, e.g. "Backup-2017-10-21-Saturday"'
    echo '.tar will automatically be added as a file extension'
    exit 1
fi

Filename="$1.tar"

cd $HomeDir ||
    exit 1

dpkg --get-selections > .packages       # List of installed applications

tar -cvpf "$Filename" bin               # create .tar & add user scripts
tar -rvpf "$Filename" .config/autostart # autostart programs configuration
tar -rvpf "$Filename" /usr/local/bin    # add global root-based scripts
tar -rvpf "$Filename" /etc/cron*        # crontab, cron.d, cron.daily, etc
tar -rvpf "$Filename" /etc/system*      # systemd files: login.conf, etc.
tar -rvpf "$Filename" /lib/systemd/system-sleep
tar -rvpf "$Filename" /etc/rc.local     # Startup script: calls zaprestore.
tar -rvpf "$Filename" /etc/sudoers      # 120 minute sudo, stars in password
tar -rvpf "$Filename" /etc/environment  # PATH backup
tar -rvpf "$Filename" /etc/default/grub # bootstrap loader
#July 20, 2018 - /boot/grub takes 5MB+
#tar -rvpf "$Filename" /boot/grub        # Custom grub fonts and splash...
tar -rvpf  "$Filename" /usr/share/plymouth   # ... screen (plymouth)
#included above tar -rvpf "$Filename" /usr/share/plymouth/themes/earth-sunrise/
tar -rvpf "$Filename" /usr/share/grub/themes/Tuxkiller2/
tar -rvpf "$Filename" /etc/grub.d       # 00_header, etc. changes
tar -rvpf "$Filename" Desktop           # files and links on desktop
tar -rvpf "$Filename" Documents/*.od*   # Libre Office: *.ods, *.odt, etc.

# Trusted keys to install from third party PPAs
tar -rvpf "$Filename" /etc/apt/trusted.gpg
tar -rvpf "$Filename" /etc/apt/trusted.gpg.d

# Sources for repositories - 1) Main single file - 2) directory of files
tar -rvpf "$Filename" /etc/apt/sources.list
tar -rvpf "$Filename" /etc/apt/sources.list.d

# find all $HOME/.config files and add to .tar
find .* -maxdepth 0 -type f -exec tar -rvf "$Filename" {} +

# Nautilus custom scripts
tar -rvpf "$Filename" .local/share/nautilus/scripts

# /etc/udev rules
tar -rvpf "$Filename" /etc/udev/rules.d

# /etc/rc.local
tar -rvpf "$Filename" /etc/rc.local

# /etc/X11/xorg.conf.d
tar -rvpf "$Filename" /etc/X11/xorg.conf.d

# /mnt/e - shared WSL + Linux
tar -rvpf "$Filename" /mnt/e/bin
tar -rvpf "$Filename" /mnt/e/Documents

# ~/eyesome - Development version
tar -rvpf "$Filename" eyesome

# ~/gmail - Python and Bash scripts but NOT huge data files
tar -rvpf "$Filename" gmail/*.py
tar -rvpf "$Filename" gmail/*.sh
tar -rvpf "$Filename" gmail/go
tar -rvpf "$Filename" gmail/BackupSets
tar -rvpf "$Filename" gmail/BackupDays

echo "Complete file list with sizes..."
tar -tvf "$Filename" > BackupLog    # list filenames and sizes
chmod a+w BackupLog                 # give user delete access

echo "Compressing with gzip..."
gzip "$Filename"
Filename="$Filename.gz"

echo "Emailing: $EmailAddr"

# From: https://internetlifeforum.com/gmail/2251-gmail-some-file-types-blocked-fix-how-go-around/
# cat archive.tar.gz | base64 > file
# then i sent the file via email:
# echo "Base64 encoded file" | mutt -a file -s subject -- mymail@gmail.com
# then mail was delivered properly! Then when one need to get readable archive 
# again, he need to decode it by base64. In my case i do it via linux command line:
# cat file | base64 -d > decodedarchive.tar.gz

Filename64="$Filename.64"
cat "$Filename" | base64 > "$Filename64"
mail -a "$Filename64" -s "$Filename64" "$EmailAddr" < BackupLog

ls -la "$Filename" "$Filename64"
rm     "$Filename" "$Filename64"

exit 0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.