線上書籍

Home

自建 samba + ZFS (snhpshot快照/任意還原點)檔案伺服器

  1. 指令說明
    同主機間不同 dataset 直接複製
    1. 先對 zfs/samba dataset 製作快照
      ~# zfs snapshot  zfs/samba@send
    2. 將 zfs/samba@send 複製到 另一個 dataset  backup/samba
      1. 若目的 backup/samba dataset 存在,且 backup/samba 有快照,則快照須先刪除
        ~# zfs send zfs/samba@backup1 | zfs receive -F backup/samba
      2. 若目的 backup/poolname dataset 不存在,那麼 zfs 會自動建立新的 backup/poolname dataset
        ~# zfs send zfs/samba@backup1 | zfs receive -F backup/poolname
         
  2. 詳細解說
    將資料保存在單一地點的單一儲存池上會讓資料暴露在盜竊、自然或人為的風險之下,定期備份整個儲存池非常重要,ZFS 提供了內建的序列化 (Serialization) 功能可以將資料以串流傳送到標準輸出。使用這項技術,不僅可以將資料儲存到另一個已連結到本地系統的儲存池,也可以透過網路將資料傳送到另一個系統,這種備份方式以快照為基礎 (請參考章節 ZFS 快照(Snapshot))。
    用來備份資料的指令為 zfs send 及 zfs receive。
    以下例子將示範使用兩個儲存池來做 ZFS 備份:
# zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT backup 7.94G 608K 7.94G 0% 1.00x ONLINE - zfs 7.94G 608k 7.94G 0% 1.00x ONLINE -
  1. 名為 zfs 的儲存池為主要的儲存池,資料會定期寫入與讀取的位置。第二個儲存池 backup 用來待命 (Standby),萬一主要儲存池無法使用時可替換。注意,ZFS 並不會自動做容錯移轉 (Fail-over),必須要由系統管理者在需要的時候手動完成。快照會用來提供一個與檔系統一致的版本來做備份,zfs 的快照建立之後,便可以複製到 backup 儲存池,只有快照可以做備份,最近一次快照之後所做的變更不會含在內容裡面。
# zfs snapshot zfs/samba@backup1 # zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT zfs@backup1 80k - 160k -
  1. 快照存在以後,便可以使用 zfs send 來建立一個代表快照內容的串流,這個串流可以儲存成檔案或由其他儲存池接收。串流會寫入到標準輸出,但是必須要重新導向到一個檔案或轉接到其他地方,否則會錯誤:
# zfs send zfs@backup1 Error: Stream can not be written to a terminal. You must redirect standard output.
  1. 要使用 zfs send 備份一個資料集,可重新導向到一個位於在已掛載到備份儲存池上的檔案。確定該儲存池有足夠的空間容納要傳送的快照,這裡指的是該快照中內含的所有資料,並非只有上次快照到該快照間的變更。
# zfs send zfs@backup1 > /backup/backup1 # zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT backup 7.94G 608K 7.94G 0% 1.00x ONLINE - zfs 7.94G 608k 7.94G 0% 1.00x ONLINE -
  1. zfs send 會傳輸在快照 backup1 中所有的資料到儲存池 backup。可以使用 cron(8) 排程來自動完成建立與傳送快照的動作。
  2. 若不想將備份以封存檔案儲存,ZFS 可用實際的檔案系統來接收資料,讓備份的資料可以直接被存取。要取得實際包含在串流中的資料可以用 zfs receive 將串流轉換回檔案與目錄。
    以下例子會以管線符號連接 zfs send 及 zfs receive,將資料從一個儲存池複製到另一個,傳輸完成後可以直接使用接收儲存池上的資料。一個資料集只可以被複製到另一個空的資料集。
# zfs snapshot zfs@replica1 # zfs send -v zfs@replica1 | zfs receive -F backup/mypool <--- 若不存在 backup/mypool ,zfs會自動建立一個 dataset send from @ to mypool@replica1 estimated size is 50.1M total estimated size is 50.1M TIME SENT SNAPSHOT # zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT backup 7.94G 1.28M 7.94G 0% 1.00x ONLINE - zfs 7.94G 1.04M 7.94G 0% 1.00x ONLINE -