緣由

以前是通過 dotfiles 管理器備份各種 dotfile, 可以將系統快速恢復至理想狀態。

隨着使用的軟件越來越多, 系統的定製程度也越來越高。 加上有的軟件配置過於分散,這樣做的成本也越來越高。

所以直接備份整個系統是更好的選擇。

可用方案

Linux 上備份整個系統的方法有很多, 包括但不限於以下幾種。

  • Btrfs Snapshots (僅適用於 Btrfs)
  • LVM Snapshots (僅適用於啓用了 LVM 時)
  • tar 打包
  • dd
  • e2image (僅適用於 Ext2/3/4)
  • xfsdump (僅適用於 xfs)
  • Clonezilla
  • SquashFS
  • Rsync

具體使用

以上的方法各有各的好處或不足,我的選擇是 Rsync。

一切都得自動化,然後寫了個 Shell 來便捷的操作。

#!/bin/bash

#
# 備份 Root 分區的數據
#

# 開始備份
start_Backup() {
    sudo rsync --archive --acls --xattrs --exclude={"/boot/*","/dev/*","/media/*","/mnt/*","/proc/*","/run/*","/sys/*","/tmp/*","/lost+found"} --hard-links --delete --delete-excluded --sparse --numeric-ids --info=progress2 --human-readable "/" "$1"

    # 執行同步
    sync
}

# 判斷備份類型
backup_Type() {
    echo -e "周備份還是月備份? [ (w)Weekly / (m)Monthly ]"
    read -r W_or_M
    if [[ "$W_or_M" == w ]]; then
        start_Backup "$HOME/System Backup/Weekly/ROOT"
    elif [[ "$W_or_M" == m ]]; then
        start_Backup "$HOME/System Backup/Monthly/ROOT"
    else
        echo "參數錯誤"
    fi
}

# 開始執行 backup_Type 函數
backup_Type

拓展閱讀

以下是上面使用到的 Rsync 參數的解釋。

# 必要的參數
    #--archive                      # -a, 以遞歸方式傳輸文件,並保留所有文件屬性,等於 -rlptgoD (但不含 -H,-A,-X)
    #--acls                         # -A, 保留 ACL 屬性 (implies -p)
    #--xattrs                       # -X, 保留擴展屬性
    #--exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} # 排除文件與目錄
    #--exclude='*~'                 # 排除以 ~ 結尾的文件
    #--exclude-from=root.exclude    # 從 root.exclude 文件中讀取額外的排除列表
    #--hard-links                   # -H, 保留硬鏈接
    #--delete                       #     從 DEST 目錄中刪除無關文件
    #--delete-excluded              #     還從目錄中刪除排除的文件
    #--sparse                       # -S, 對稀疏文件進行特殊處理以節省 DST 的空間
    #--numeric-ids                  #     禁用用戶名和組名的映射,將轉移爲數字的組和用戶 ID
# 可選項
    #--info=progress2               #     顯示整體的進度和傳輸速度信息
    #--verbose                      # -v, 詳細模式輸出
    #--progress                     #     轉移期間顯示進度 
    #--human-readable               # -h, 以人類可讀的格式輸出數字
    #--inplace                      #     就地更新目標文件
    #--itemize-changes              # -i, 輸出所有更新的更改摘要