「備份不測試等於沒備份」。本文系統整理 Linux 備份的裝置層 (磁帶/SCSI/ATAPI)、工具層 (tar/star/cpio/dump)、策略層 (完全/增量/差分)、自動化腳本與驗證機制,構建企業級資料保護知識體系。
Linux 將所有裝置抽象為 /dev 下的節點檔案,備份即對節點讀寫。
| 裝置類型 | 回卷裝置 (操作後自動回帶) | 不回卷裝置 (停留當前位置) |
|---|---|---|
| 第 1 SCSI 磁帶機 | /dev/st0 | /dev/nst0 |
| 第 n SCSI 磁帶機 | /dev/st[n-1] | /dev/nst[n-1] |
| 第 1 ATAPI 磁帶機 | /dev/ht0 | /dev/nht0 |
| 第 1 軟碟式磁帶機 | /dev/ft0 | /dev/nft0 |
crw-rw-rw- 1 root tape 9, 0 /dev/st0 (字元裝置、主設備號 9、次設備號 0)。mknod /dev/nst0 c 9 1 (需核心已載入對應驅動 cat /proc/devices 驗證)。mt -f /dev/nst0 eod:定位至資料結束處 (EOD),準備追加備份。mt -f /dev/nst0 fsf N:前進 N 個檔案標記 (File Mark)。mt -f /dev/st0 rewind:回卷。ln -sf /dev/nst0 /dev/tape,並設定環境變數 export TAPE=/dev/tape,後續 mt/tar 可省略 -f 參數,避免誤用回卷裝置覆寫資料。| 工具 | 特色 | 典型指令 |
|---|---|---|
| tar (Tape ARchiver) | 最通用、跨平台、支援壓縮 (z/j/J)、排除模式、增量 (--newer) | tar -cvf /dev/tape /home (完整)tar -cvf /dev/tape --newer "2024-01-01" /home (增量) |
| star (Schily Tar) | 支援 ACL、xattr、長路徑、更快、更穩健 | star -cv f=/dev/tape /home |
| cpio | 從 stdin 讀檔案清單、適合配合 find、複製整個目錄樹 | find /home -print0 | cpio -ov0 > /dev/tape |
| dump/restore | 檔案系統級備份、支援增量等級 0-9、需卸載或唯讀掛載 | dump -0u -f /dev/tape /home (0 級完全)dump -1u -f /dev/tape /home (1 級增量) |
| 策略 | 空間佔用 | 備份速度 | 還原速度 | 還原所需媒體 | 適用場景 |
|---|---|---|---|---|---|
| 完全備份 | 最大 | 最慢 | 最快 | 1 卷 | 週末/月度基線、小資料量 |
| 增量備份 | 最小 | 最快 | 最慢 | 完全 + 所有增量 | 每日/每小時高頻、資料量大 |
| 差分備份 | 中等 | 中等 | 中等 | 完全 + 最近一次差分 | 平衡折衷、還原窗口有要求 |
--newer DATE 或 --newer-mtime DATE (僅備份 mtime 較新者)。
#!/bin/bash
# /usr/local/sbin/tape_backup.sh
# 必須在週一首次執行,單磁帶循環覆寫
DEVICE="/dev/nst0" # 不回卷裝置
REWIND_DEV="/dev/st0" # 回卷裝置
MAILLIST="admin@example.com"
LOG="/var/log/tape_backup.log"
DOW=$(date +%u) # 1=Mon ... 6=Sat 7=Sun
DATE=$(date +%F)
DAY=$(date +%A)
mt -f "$REWIND_DEV" rewind 2>>"$LOG"
mt -f "$DEVICE" eod 2>>"$LOG"
if [ "$DOW" -eq 6 ]; then
# 週六:完全備份
echo "$DATE" > /etc/.last_full
tar -cvf "$DEVICE" / --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/mnt --exclude=/media --exclude=/tmp 2>>"$LOG" | tee -a "$LOG"
mt -f "$REWIND_DEV" rewind
tar -tvf "$DEVICE" 2>>"$LOG" | tail -20 >>"$LOG" # 驗證前 20 行
mt -f "$REWIND_DEV" rewind
cp /etc/.last_full /etc/.last_inc
else
case "$DOW" in
7) exit 0 ;; # 週日不備份
1) # 週一:基於上次完全備份的差分
echo "$DATE" > /etc/.last_inc
tar -cvf "$REWIND_DEV" --newer "$(cat /etc/.last_full)" / --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/mnt --exclude=/media --exclude=/tmp 2>>"$LOG" | tee -a "$LOG"
cp /etc/.last_inc /etc/.last_inc
;;
*) # 週二至五:基於上次差分的差分 (遞增)
mt -f "$DEVICE" eod
echo "$DATE" > /etc/.last_inc
tar -cvf "$DEVICE" --newer "$(cat /etc/.last_inc)" / --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/mnt --exclude=/media --exclude=/tmp 2>>"$LOG" | tee -a "$LOG"
mt -f "$REWIND_DEV" rewind
mt -f "$DEVICE" fsf $((DOW - 2)) # 定位到當天段
tar -tvf "$DEVICE" 2>>"$LOG" | tail -20 >>"$LOG"
mt -f "$REWIND_DEV" rewind
cp /etc/.last_inc /etc/.last_inc
;;
esac
fi
mail -s "Tape Backup $DAY $DATE" "$MAILLIST" < "$LOG"
tar -tvf /dev/tape 列出內容;tar -df /dev/tape 比對檔案系統 (僅報告差異)。/restore_test,校驗 md5sum、權限、時間戳、符號連結完整性。zfs send/recv、btrfs send/receive 實現增量異地複製。從 /dev/nst0 磁帶節點到 BorgBackup 去重加密雲備份,工具迭代不斷,**核心原則永恆**:3-2-1 原則 (3 份拷貝、2 種介質、1 份異地)、定期驗證還原、記錄恢復手冊、自動化無人值守。將備份視為系統生命線,而非事後補票,才能在數據災難降臨時從容應對。