使用 tar 进行完整系统备份

出自 ArchWiki

本条目或章节需要语言、wiki 语法或风格方面的改进。请参阅 Help:Style 以获取参考。

原因: 使用半成品脚本而不是解释基本选项和参考手册,与诸如 Help:Reading 等条目重复,大量 Help:Style 问题(在 Talk:Full system backup with tar 中讨论)

本文将向您展示如何使用 tar 进行完整系统备份。

使用 tar 备份的优点是可以使用压缩来帮助节省磁盘空间,并且操作简单。此过程仅需几个步骤,它们是

  1. 从 LiveCD 启动
  2. 将 root 切换到 Linux 安装
  3. 挂载额外的(如果有)分区/驱动器
  4. 添加排除项
  5. 使用备份脚本进行备份

为了最大限度地减少停机时间,如果所有文件系统都位于 LVM 卷上,则可以使用 LVM 快照 在正在运行的系统上执行备份。

使用 LiveCD 启动

许多 Linux 可启动 CD、USB... 都可以让您将 root 切换到您的安装。虽然切换 root 不是进行备份的必要条件,但它提供了直接运行脚本的能力,而无需将其传输到临时驱动器或在文件系统中查找它。Live 介质必须与您当前 Linux 安装的架构相同(即 i686 或 x86_64)。

更改 root

首先,您应该在当前的 Linux 安装上设置脚本环境。如果您不知道那是什么,则意味着您可以像执行常规程序一样执行您可能拥有的任何脚本。如果您没有,请参阅这篇关于如何操作的文章。接下来您需要做的是更改 root,要了解更多关于更改 root 的信息,请阅读此文。当您更改 root 时,您不需要挂载任何临时文件系统(/proc/sys/dev)。这些临时文件系统在启动时填充,实际上您不希望备份它们,因为它们可能会干扰正常的(和必要的)填充过程,该过程可能在任何升级时发生变化。要更改 root,您将需要挂载当前 Linux 安装的根分区。例如

# mkdir /mnt/arch
# mount /dev/your-partition-or-drive

使用 fdisk -l 来发现您的分区和驱动器。现在 chroot

# cd /mnt/arch
# chroot . /bin/bash
警告: 不要使用 arch-chroot 来 chroot 到目标系统 - 备份过程将失败,因为它会尝试备份临时文件系统、所有系统内存和其他有趣的东西。请改用普通的 chroot

此示例显然使用 bash,但如果可用,您可以使用其他 shell。现在您将处于脚本环境中(前提是您的 ~/.bashrc 在进入时已加载)

~/.bash_profile
# If using bash, source the local .bashrc
source ~/.bashrc

挂载其他分区

您使用的其他分区(如果有)将需要挂载到其正确的位置(例如,如果您有单独的 /home 分区)。

排除文件

tar 能够忽略指定的文件和目录。语法是每行一个定义。tar 还具有理解正则表达式 (regexps) 的能力。例如

# Not old backups                                                               
/opt/backup/arch-full*                                                                   
                                                                                
# Not temporary files                                                           
/tmp/*

# Not the cache for pacman
/var/cache/pacman/pkg/
...

备份脚本

使用 bsdtar 进行备份是一个简单的过程。这是一个可以做到这一点并提供一些检查的基本脚本。您需要修改此脚本以定义您的备份位置和排除文件(如果您有),然后在您 chroot 并挂载所有分区后运行此命令。请注意,带有 --xattrs 的 GNU tar 不会保留扩展属性

#!/bin/bash
# full system backup

# Backup destination
backdest=/opt/backup

# Labels for backup name
#PC=${HOSTNAME}
pc=pavilion
distro=arch
type=full
date=$(date "+%F")
backupfile="$backdest/$distro-$type-$date.tar.gz"

# Exclude file location
prog=${0##*/} # Program name from filename
excdir="/home/<user>/.bin/root/backup"
exclude_file="$excdir/$prog-exc.txt"

# Check if chrooted prompt.
echo -n "First chroot from a LiveCD.  Are you ready to backup? (y/n): "
read executeback

# Check if exclude file exists
if [ ! -f $exclude_file ]; then
  echo -n "No exclude file exists, continue? (y/n): "
  read continue
  if [ $continue == "n" ]; then exit; fi
fi

if [ $executeback = "y" ]; then
  # -p, --acls and --xattrs store all permissions, ACLs and extended attributes. 
  # Without both of these, many programs will stop working!
  # It is safe to remove the verbose (-v) flag. If you are using a 
  # slow terminal, this can greatly speed up the backup process.
  # Use bsdtar because GNU tar will not preserve extended attributes.
  bsdtar --exclude-from="$exclude_file" --acls --xattrs -cpvaf "$backupfile" /
fi

恢复

要从先前的备份恢复,请挂载所有相关分区,将当前工作目录更改为根目录,并执行

$ bsdtar --acls --xattrs -xpzf backupfile

backupfile 替换为备份存档。必须手动删除自备份以来添加的所有文件。重新创建文件系统是执行此操作的简便方法。

使用并行压缩进行备份

要使用并行压缩 (SMP) 进行备份,请使用 pbzip2 (Parallel bzip2)

# bsdtar -cvf /path/to/chosen/directory/etc-backup.tar.bz2 -I pbzip2 /etc

etc-backup.tar.bz2 存储在一个或多个离线介质上,例如 USB 闪存盘、外部硬盘驱动器或 CD-R。偶尔通过将原始文件和目录与其备份进行比较来验证备份过程的完整性。可以维护备份文件的哈希列表,以加快比较速度。

通过在临时工作目录中提取 etc-backup.tar.bz2 文件,并根据需要复制单个文件和目录,来恢复损坏的 /etc 文件。要恢复整个 /etc 目录及其所有内容,请以 root 身份执行以下命令

# bsdtar -xvf etc-backup.tar.bz2 -C /