2018年1月30日 星期二

用 logrotate 實現 「近密遠疏」 的備份計畫

Logrotate 本來是拿來備份系統 log 檔用的; 不過被我拿來充份利用、 備份自己的資料 :-) 我每天都會 (至少一次) 把最近幾天內更動過的檔案 (文件/圖片/...) 備份起來, 比方叫做 backup.zip 。 因為這個檔案很小, 所以可以不時上傳到雲端、 下載到隨身碟上。 但偶爾還是會需要挖出較舊的備份, 把檔案還原到舊版。 所以我會用 logrotate 把過去一週的 backup.zip 每天保留一個版本。

首先用 EDITOR=nano VISUAL=nano crontab -e 編輯你的 crontab, 在最後面加一句: 37 4 * * * /home/ckhung/work/daily-job.sh 之類的, 設定每天半夜 4:37 執行 daily-job.sh 。

我的 daily-job.sh 長得像這樣:

date >> /home/ckhung/archive/cron.log
find /home/ckhung/work -type f -mtime -3 | zip -@y /home/ckhung/archive/backup.zip
/usr/sbin/logrotate -s /home/ckhung/archive/logrotate.status /home/ckhung/work/logrotate.conf
DAYOFWEEK=$(date +"%w")
if [ "$DAYOFWEEK" == 6 ]; then
    # 每週六要做的事
    echo
fi

date 那句是為了要確認 cron 有設定成功, 每天有按時執行。 find 那句把 ~/work 底下最近 3 天內修改過的檔案都壓縮起來。 logrotate 那句會根據 ~/work/logrotate.conf 的設定來幫 backup.zip 做備份。 注意: 在 ubuntu 底下, logrotate 的執行檔不是放在 /usr/bin ! 如果沒有寫完整的路徑, 這句話會失敗。 最後那段 if 只是在示範如何順便把每週固定做的事順便寫在同一個檔案裡, 這樣 crontab 就不需要另外加一句。

至於 work/logrotate.conf 的內容則長得像這樣:

missingok
copy

/home/ckhung/archive/backup.zip {
    daily
    rotate 7
}

/home/ckhung/archive/backup.zip.1 {
    weekly
    rotate 5
}

/home/ckhung/archive/backup.zip.1.1 {
    monthly
    rotate 12
}

這樣可以製造 「近密遠疏」 的備份效果, 也就是說, 最近一週每天有一個版本的備份 (backup.zip.1 到 backup.zip.7)、 最近一個月每週至少有一個版本的備份 (backup.zip.1.1 到 backup.zip.1.5)、 最近一年每個月至少有一個版本的備份 (backup.zip.1.1.1 到 backup.zip.1.1.12)。 實際上我只做前兩層, 沒有做第三層, 所以隔一陣子之後, 所有的備份看起來類似這樣:

ckhung@localhost:~/copy $ ls -trl update*
-rw-r--r-- 1 ckhung ckhung  90742  1月  1 04:37 update.zip.1.5
-rw-r--r-- 1 ckhung ckhung 532881  1月  7 04:37 update.zip.1.4
-rw-r--r-- 1 ckhung ckhung 515260  1月 15 04:37 update.zip.1.3
-rw-r--r-- 1 ckhung ckhung  73122  1月 21 04:37 update.zip.1.2
-rw-r--r-- 1 ckhung ckhung 711893  1月 24 04:37 update.zip.7
-rw-r--r-- 1 ckhung ckhung 749767  1月 25 04:37 update.zip.6
-rw-r--r-- 1 ckhung ckhung 742107  1月 26 04:37 update.zip.5
-rw-r--r-- 1 ckhung ckhung 163966  1月 27 04:37 update.zip.4
-rw-r--r-- 1 ckhung ckhung 163966  1月 28 04:37 update.zip.3
-rw-r--r-- 1 ckhung ckhung 163966  1月 29 04:37 update.zip.2
-rw-r--r-- 1 ckhung ckhung 163966  1月 29 04:37 update.zip.1.1
-rw-r--r-- 1 ckhung ckhung 163966  1月 30 04:37 update.zip.1
-rw-r--r-- 1 ckhung ckhung 163966  1月 30 10:30 update.zip

配合人腦 「對最近的事情比較關心」 的特性, 用很少的空間, 備份很久的資料, 很方便吧!

4 則留言:

  1. logrotate的執行檔是不是放在/usr/bin似乎得看distribution是怎麼打包的

    回覆刪除
  2. 貴哥要不要以分享一下自己怎麼整理、備份檔案?一直覺得整理檔案很痛苦……,學校的教材、自己的作業、程式或單純大資料,很多東西積在一起,之前整理過幾次,但過一陣子又會亂掉。

    回覆刪除
    回覆
    1. 這個講起來有點囉嗦零碎沒什麼技巧,不知道該怎麼寫。 簡單講就是按照大小和更新頻率分類。

      佔很多空間、很少更新的檔案 (例如下載的 .iso、 自己建的虛擬機映像檔) 放在同一個目錄 (叫做 archive/ 好了), 久久 rsync 一次就可以了。

      另一個主要目錄 (叫做 work/ 好了) 放的是較常查看或常更新的檔案, 檔案大小通常不大。 這些檔案除了可以每天 rsync 之外, 還可以 「find 最近幾天內修改的檔案」 再 zip 壓縮放隨身碟上。 這些小檔累積起來, 每年連同 e-mail 一起大備份一次, 移到 archive/。 然後 work/ 底下就可以大掃除, 丟掉很久沒用到的子目錄, 反正已有備份。

      部落格的圖片每張小小的, 但數量很多。 產生之後就不再變動。 反正是公開的, 就乾脆放到 github 上面去。 其他凡是知識類、 適合公開分享的東西, 就盡量都貼到部落格或 github 公有雲上面去。 這樣還可以被 google cache 起來、 被 wayback machine 備份。

      刪除