使用 tar 備份整個系統

出自 Arch Linux 中文维基

本篇介紹如何使用 tar 進行全系統備份。

使用 tar 進行備份具有壓縮的優點,有助於節省磁盤空間,且使用簡單。此過程只需要以下幾個步驟:

  1. 從 LiveCD 啟動
  2. Change root 到 Linux 系統安裝位置
  3. 裝載其他(如有的話)分區/驅動器
  4. 添加排除對象
  5. 使用備份腳本進行備份

為最大限度減少停機時間,如果所有文件系統均駐留在 LVM 卷中,則可以使用LVM 快照在正在運行的系統上進行備份。

從 LiveCD 啟動[編輯 | 編輯原始碼]

許多 Linux 可啟動 CD、U盤等能夠 change root 到系統安裝位置。雖然不是必須 change root 才能執行備份,但這提供了運行腳本的功能,而無需將其傳輸到臨時驅動器或必須在文件系統中找到它。Live 媒體必須與已安裝的 Linux 系統的架構相同(即 i686 或 x86_64)。

Change root[編輯 | 編輯原始碼]

首先,應該在當前的 Linux 安裝系統中設置一個腳本環境。如果您不知道這是什麼,這表示您可以執行擁有的任意腳本,它們是常規程序一樣。如果您的系統未設置好,請參閱這文檔 了解如何操作。接下來要做的是 change root,要了解有關 change root 的更多信息,請參閱 此文檔。Change root 時,不需要裝載任何臨時文件系統(/proc/sys/dev)。臨時文件系統在系統啟動時填充,實際上不需要備份它們,因為它們會干擾正常(和必要的)填充過程,該過程會在任何升級時更改。要 change root,需要裝載當前的 Linux 安裝的 root 分區。示例:

# 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
# 如果使用 bash,獲取本地 .bashrc
source ~/.bashrc

裝載其他分區[編輯 | 編輯原始碼]

要使用的其他分區(如果有的話)需要裝載到適當的位置(例如,如果有單獨的 /home 分區)。

排除文件[編輯 | 編輯原始碼]

tar 能夠忽略指定的文件和目錄。語法是每行一個定義。tar 還可以理解正則表達式(regexp)。示例:

# 排除舊的備份                                                               
/opt/backup/arch-full*                                                                   
                                                                                
# 排除臨時文件                                                           
/tmp/*

# 排除 pacman 的緩存
/var/cache/pacman/pkg/
...

備份腳本[編輯 | 編輯原始碼]

使用 tar 備份是一個直接過程。以下是一個進行備份的基本腳本,並提供了幾項檢查。需要修改此腳本以定義備份位置,並排除文件(如果有的話),然後在 chroot 和裝載所有分區之後運行此腳本。

#!/bin/bash
# 全系統備份

# 備份目標位置
backdest=/opt/backup

# 備份名稱標籤
#PC=${HOSTNAME}
pc=pavilion
distro=arch
type=full
date=$(date "+%F")
backupfile="$backdest/$distro-$type-$date.tar.gz"

# 排除文件位置
prog=${0##*/} # 文件名中的程序名稱
excdir="/home/<user>/.bin/root/backup"
exclude_file="$excdir/$prog-exc.txt"

# 檢查 chroot 提示
echo -n "來自 LiveCD 的第一個 chroot。確定開始備份? (y/n):"
read executeback

# 檢查排除文件是否存在
if [ ! -f $exclude_file ]; then
  echo -n "沒有排除文件,是否繼續? (y/n):"
  read continue
  if [ $continue == "n" ]; then exit; fi
fi

if [ $executeback = "y" ]; then
  # -p、--acls 和 --xattrs 存儲所有權限、ACL 和擴展屬性。如果沒有這些屬性,許多程序會停止工作!
  # 可以安全地移除詳細信息標誌(-v)。如果使用的終端速度較慢,這可以加快備份過程。
  tar --exclude-from=$exclude_file --acls --xattrs -cpvf $backupfile /
fi

恢復[編輯 | 編輯原始碼]

要恢復以前的備份,需要裝載所有相關分區更改當前工作目錄為 root,然後執行

$ tar --acls --xattrs -xpf backupfile

backupfile 替換為備份存檔文件。必須手動刪除備份以來添加的所有文件。最簡單的方法是重新創建文件系統。

並行壓縮備份[編輯 | 編輯原始碼]

要使用並行壓縮(SMP),可以使用 pbzip2(Parallel bzip2):

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

etc-backup.tar.bz2 文件存儲到一個或多個脫機媒體上,如U盤、外置硬盤或光盤。有時,需要通過比較原始文件和目錄與其備份文件來驗證備份的完整性。可以維護備份文件的 hash 列表,以使比較過程更快速。

可以通過在臨時工作目錄中提取 etc-backup.tar.bz2 文件,並根據需要複製單個文件和目錄來恢復損壞的 /etc 文件。要恢復整個 /etc 目錄及其所有內容,可以以 root 身份執行以下命令:

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