Backup and restore your Linux system disk

Published: Wed 03 June 2020
By evpo

In OS.

Backup your system disk when its not active

Boot-up another system with your system disk attached. Mount it and backup all system files:

mount ${srcdev} /mnt
cd /mnt
tar --exclude sys.tar.bz2 -czpf sys.tar.bz2 ./
umount /mnt

-z - infer the compression format from the extension

-p - save all permission flags

Copy sys.tar.bz2 to your backups.

Backup your dot files

cd ${HOME}
tar -czpvf ${HOME}/dot_files.tar.bz2 $(find ./ -maxdepth 1 -path './\.*')

In addition to the options above I added -v to show the list of the files being archived. I didn't do it in the previous command because it's a significant hit on performance.

Restore the system files

Mount the new empty formatted system partition:

mount ${tgtdev} /mnt

Decompress the system files:

cd /mnt
tar -xpf /home/sys.tar.bz2

chroot to the restored system files

cd /mnt
mount -t proc /proc proc/
mount --rbind /sys sys/
mount --rbind /dev dev/
mount --rbind /run run/
chroot /mnt /bin/bash

Activate MBS (Master Boot Record) and install Grub 2

grub-install --target=i386-pc ${tgtdisk}

Note that tgtdisk should the the disk, not the partition. For example: /dev/sdd

Now we need to generate and update grub.cfg in the new system.

cd /boot/grub
grub-mkconfig -o new.cfg

Check that the config makes sense and replace the current config:

mv new.cfg grub.cfg

Restore the home dot files

useradd -m user01
cd /home/user01
tar -xpvf /home/dot_files.tar.bz2

Custom grub menu entry

Sometimes you may need to use labels instead of disk's UUID to generate grub.cfg. This is required when you detach the disk and use it in another VM host. The UUID can change and the generated grub.cfg can become invalid.

Create custom.cfg in /boot/grub directory with the following content:

menuentry "Linux Today" --id ubuntu-by-label {
  insmod gzio
  insmod part_gpt
  insmod ext2
  search --no-floppy --set=root --label systemroot
  linux /boot/vmlinuz-5.4.0-33-generic root=LABEL=systemroot ro  maybe-ubiquity
  initrd /boot/initrd.img-5.4.0-33-generic
}

Open /etc/default/grub and update GRUB_DEFAULT:

GRUB_DEFAULT=ubuntu-by-label

Generate grub.cfg as in "Activate MBS (Master Boot Record) and install Grub 2" above. For curious, custom.cfg is a special name that the default configuration includes from grub.cfg.

links