線上書籍

Home

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

  1. ZFS 建路陣列指令
ZFS 指令 啟用壓縮指令
(proxmox ve主機)
單一硬碟建立
ZFS檔案系統儲存池
zpool create -f -o ashift=12 <pool-name> <device> zfs set compression=lz4 <pool-name>
建立 Raid 0
最少1顆以上硬碟
zpool create -f -o ashift=12 <pool-name> <device1> <device2> ...

資料會平均分配寫入各顆硬碟,若其中一顆硬碟毀損,全部的資料也將會一起毀損。
優點是寫入速度快
zfs set compression=lz4 <pool-name>
建立 Raid 1
最少2顆以上硬碟
zpool create -f -o ashift=12 <pool-name> mirror <device1> <device2>

建立 Raid1(1+1=1) Mirror 格式,資料會同時寫入兩棵 HD。 (這是最佳建議方式,安全性也較高)
zfs set compression=lz4 <pool-name>
建立 Raid 10
最少4顆以上硬碟
zpool create -f -o ashift=12 <pool-name> mirror <device1> <device2> mirror <device3> <device4> zfs set compression=lz4 <pool-name>
建立 Raid Z-1
最少3顆以上硬碟
zpool create -f -o ashift=12 <pool-name> raidz1 <device1> <device2> <device3>
建立 Raid Z-2
最少4顆以上硬碟
zpool create -f -o ashift=12 <pool-name> raidz2 <device1> <device2> <device3> <device4>

  1. zfs 的即時壓縮功能(預設是關閉)
    主機的 CPU Loading 若效能還有剩餘,可以啟用 zfs compression 功能,
    但若效能剛好或不足,則建議使用較低的壓縮效率或關閉即時壓縮功能
    debian 主機
    compression YES YES on | off | lzjb | gzip | gzip-[1-9] | zle
    1. 查看 storage/compressed 檔案目錄屬性
      zfs get all storage/compressed

       
  2. 常用指令
    1. ZFS 的 zpool 指令
      1. # 建立 Raid1(1+1=1) Mirror 格式,資料會同時寫入兩棵 HD。
        # zpool create storagename mirror /dev/sdb /dev/sdc

        # df -h # 查看 storage pool 是有已經建立
        Filesystem Size Used Avail Capacity Mounted on 
        pool1            16G  112K   16G    1% /pool1
         
      2. # zpool status
        # 查看本機 ZFS 的狀態,這個系統中有一個 pool 名稱為 pool1 是由兩棵代號 sdb 及 sdc 的實體硬碟 mirror 而成

        root@debian8:~# zpool status
          pool: pool1
         state: ONLINE
         scrub: none requested
        config:

            NAME        STATE     READ WRITE CKSUM
            pool1       ONLINE       0     0     0
              mirror-0  ONLINE       0     0     0
                sdb     ONLINE       0     0     0
                sdc     ONLINE       0     0     0

        errors: No known data errors

      3. # zpool list
        # 查看 pool 的空間使用狀態
        root@debian8:~# zpool list
        NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
        pool1  7.94G   388K  7.94G     0%  1.00x  ONLINE  -
         
      4. # zpool offline pool1 /dev/sdb
        # 讓 storage 這個 pool 的 ad2 硬碟暫時離線
        root@debian8:~# zpool offline pool1 /dev/sdb
         
      5. # zpool status pool1
        # 查看狀態會有 DEGRADED 警告

        root@debian8:~# zpool status pool1
          pool: pool1
         state: DEGRADED
        status: One or more devices has been taken offline by the administrator.
            Sufficient replicas exist for the pool to continue functioning in a
            degraded state.
        action: Online the device using 'zpool online' or replace the device with
            'zpool replace'.
         scrub: none requested
        config:

            NAME        STATE     READ WRITE CKSUM
            pool1       DEGRADED     0     0     0
              mirror-0  DEGRADED     0     0     0
                sdb     OFFLINE      0     0     0
                sdc     ONLINE       0     0     0

        errors: No known data errors

      6. # zpool online pool1 /dev/sdb
        # 讓 pool1 這個 pool 的 /dev/sdb 硬碟重新上線

        root@debian8:~# zpool online pool1 /dev/sdb

      7. # zpool status pool1
        # 查看狀態 DEGRADED 警告已解除

        root@debian8:~# zpool status pool1
          pool: pool1
         state: ONLINE
         scrub: resilver completed after 0h0m with 0 errors on Sat Jul  1 11:24:41 2017
        config:

            NAME        STATE     READ WRITE CKSUM
            pool1       ONLINE       0     0     0
              mirror-0  ONLINE       0     0     0
                sdb     ONLINE       0     0     0  12K resilvered
                sdc     ONLINE       0     0     0

        errors: No known data errors

      8. # zpool export -f pool1
        # 卸除(umount) pool1 這個 pool 參數 -f (Force) 為強制卸除

        root@debian8:~# zpool export pool1 -f

      9. # df -h
        # 查看是否 umount,已無 pool1 這個 pool
        root@debian8:~# df -h
        檔案系統        容量  已用  可用 已用% 掛載點
        /dev/sda1       1.9G 1004M  733M   58% /
        udev             10M     0   10M    0% /dev
        tmpfs           150M  4.6M  145M    4% /run
        tmpfs           374M     0  374M    0% /dev/shm
        tmpfs           5.0M     0  5.0M    0% /run/lock
        tmpfs           374M     0  374M    0% /sys/fs/cgroup
         
      10. # zpool import
        # 列出目錄系統上存在但尚未掛載的 pool storage

        root@debian8:~# zpool import
          pool: pool1
            id: 244594555867708236
         state: ONLINE
        action: The pool can be imported using its name or numeric identifier.
        config:

            pool1                                                 ONLINE
              mirror-0                                            ONLINE
                disk/by-id/ata-VBOX_HARDDISK_VB5260512b-73cfc5a7  ONLINE
                disk/by-id/ata-VBOX_HARDDISK_VBff905153-79c3b58a  ONLIN


         
      11. # zpool import -f
        # 強制掛載目前系統上所有存在且未掛載(mount) 的 pool storage
      12. # zpool import pool1 # 掛載(mount) storage 這個 pool

        root@debian8:~# zpool import pool1

      13. # df -h # 查看是否 mount,已重新掛載 storage pool

        root@debian8:~# df -h
        檔案系統        容量  已用  可用 已用% 掛載點
        /dev/sda1       1.9G 1004M  733M   58% /
        udev             10M     0   10M    0% /dev
        tmpfs           150M  4.6M  145M    4% /run
        tmpfs           374M     0  374M    0% /dev/shm
        tmpfs           5.0M     0  5.0M    0% /run/lock
        tmpfs           374M     0  374M    0% /sys/fs/cgroup
        pool1           7.9G  112K  7.9G    1% /pool1

         

      14. # zpool scrub storage
        # 手動驗證 storage 這個 pool 中所有資料的完整性
        # 部份版本的 zfs 不提供
         
      15. # zpool replace pool1 /dev/sdd /dev/sde
        # 在 storage pool1 中用新的 /dev/sdd /dev/sde 取代原本的 /dev/sdb /dev/sdc 兩棵 HD

         
    2. ZFS 的 zfs 指令
       
      1. # zfs create pool1/compressed
        # 在 pool1 這個 pool 中建立一個檔案目錄叫 compressed
        # zfs list # 查看 ZFS 檔案狀態
        root@debian8:~# zfs list
        NAME               USED  AVAIL  REFER  MOUNTPOINT
        pool1              524K  7.81G   112K  /pool1
        pool1/compressed   112K  7.81G   112K  /pool1/compressed

        #以df -h 查看
        root@debian8:~# df -h
        檔案系統          容量  已用  可用 已用% 掛載點
        /dev/sda1         1.9G 1004M  733M   58% /
        udev               10M     0   10M    0% /dev
        tmpfs             150M  4.6M  145M    4% /run
        tmpfs             374M     0  374M    0% /dev/shm
        tmpfs             5.0M     0  5.0M    0% /run/lock
        tmpfs             374M     0  374M    0% /sys/fs/cgroup
        pool1             7.9G  120K  7.9G    1% /pool1
        pool1/compressed  7.9G  112K  7.9G    1% /pool1/compressed
         
      2. # zfs set compression=gzip pool1/compressed # 將 compressed 目錄設定成 gzip 壓縮格式
        # zfs set compression=off pool1/compressed # 解除 compressed 目錄設的壓縮格式

        # zfs mount # 查看所有 ZFS 掛載的磁區
        root@debian8:~# zfs mount
        pool1                           /pool1
        pool1/compressed                /pool1/compressed
         
      3. # zfs get all pool1/compressed # 查看 pool1/compressed 檔案目錄屬性

        root@debian8:~# zfs get all pool1/compressed
        NAME              PROPERTY              VALUE                    SOURCE
        pool1/compressed  type                  filesystem               -
        pool1/compressed  creation              六  7月  1 11:53 2017  -
        pool1/compressed  used                  112K                     -
        pool1/compressed  available             7.81G                    -
        pool1/compressed  referenced            112K                     -
        pool1/compressed  compressratio         1.00x                    -
        pool1/compressed  mounted               yes                      -
        pool1/compressed  quota                 none                     default
        pool1/compressed  reservation           none                     default
        pool1/compressed  recordsize            128K                     default
        pool1/compressed  mountpoint            /pool1/compressed        default
        pool1/compressed  sharenfs              off                      default
        pool1/compressed  checksum              on                       default
        pool1/compressed  compression           off                      default
        pool1/compressed  atime                 on                       default
        pool1/compressed  devices               on                       default
        pool1/compressed  exec                  on                       default
        pool1/compressed  setuid                on                       default
        pool1/compressed  readonly              off                      default
        pool1/compressed  zoned                 off                      default
        pool1/compressed  snapdir               hidden                   default
        pool1/compressed  aclmode               groupmask                default
        pool1/compressed  aclinherit            restricted               default
        pool1/compressed  canmount              on                       default
        pool1/compressed  xattr                 on                       default
        pool1/compressed  copies                1                        default
        pool1/compressed  version               4                        -
        pool1/compressed  utf8only              off                      -
        pool1/compressed  normalization         none                     -
        pool1/compressed  casesensitivity       sensitive                -
        pool1/compressed  vscan                 off                      default
        pool1/compressed  nbmand                off                      default
        pool1/compressed  sharesmb              off                      default
        pool1/compressed  refquota              none                     default
        pool1/compressed  refreservation        none                     default
        pool1/compressed  primarycache          all                      default
        pool1/compressed  secondarycache        all                      default
        pool1/compressed  usedbysnapshots       0                        -
        pool1/compressed  usedbydataset         112K                     -
        pool1/compressed  usedbychildren        0                        -
        pool1/compressed  usedbyrefreservation  0                        -
        pool1/compressed  logbias               latency                  default
        pool1/compressed  dedup                 off                      default
        pool1/compressed  mlslabel              off                      -

         

      4. # 只查看 pool1/compressed 目錄中 compression 屬性
        root@debian8:~# zfs get compression pool1/compressed
        NAME              PROPERTY     VALUE     SOURCE
        pool1/compressed  compression  off       default

      5. # zfs set quota=3G pool1/compressed # 可設定檔案空間大小為 3G 但 storage 這個 pool 總大小為 7.9G 如果 3G 滿了而 7.9G 還未用完會 share 給 /pool1/compressed 繼續使用
        # df -h # 查看 storage/compressed 的 Avail 變成 3G
        檔案系統          容量  已用  可用 已用% 掛載點
        pool1             7.9G  120K  7.9G    1% /pool1
        pool1/compressed  3.0G  112K  3.0G    1% /pool1/compressed
         
      6. # zfs set reservation=3g pool1/compressed
        # 設定保留了 3G 給 /pool1/compressed
        # df -h # 查看 pool1 的 Size 變成 4.9G,這是因為保留了 3G 給 /pool1/compressed,代表 /pool1/compressed 真正擁有 3G 別的 filesystem 是不能跟它 share 的
        root@debian8:~# zfs set reservation=3G pool1/compressed
        root@debian8:~# df -h
        檔案系統          容量  已用  可用 已用% 掛載點
        pool1             4.9G  120K  4.9G    1% /pool1
        pool1/compressed  3.0G  112K  3.0G    1% /pool1/compressed
         
      7. # zfs create pool1/data # 於 storage pool 中再建立一個 data 檔案目錄
        # zfs set mountpoint=/data pool1/data # 設定真實掛載點原本 Mounted on 會由 /pool1/data 變成到 /data
        # df

        檔案系統          容量  已用  可用 已用% 掛載點
        pool1/compressed  3.0G  112K  3.0G    1% /pool1/compressed
        pool1/data        4.9G  112K  4.9G    1% /data

      8. # zfs set sharenfs=rw pool1/data # 設定分享權限可讀及寫,通常用在 NFS 分享上root@debian8:~# zfs set sharenfs=rw pool1/data
        cannot share 'pool1/data':  exportfs failed
        property may be set but unable to reshare filesystem
      9. # zfs snapshot pool1/compressed@2017-07-05
        # touch /pool1/compressed/1234 # 建一個檔案到 compressed 目錄下
        # zfs snapshot pool1/compressed@2017-07-051
        # zfs snapshot pool1/compressed@2017-07-052
        # snapshot compressed 目錄,取個隨便名稱就用今天日期
      10. zfs list -t snapshot
        # 列出所有的snapshot(快照)
        root@debian8:~# zfs list -t snapshot
        NAME                           USED  AVAIL  REFER  MOUNTPOINT
        pool1/compressed@2017-07-05       0      -   112K  -
        pool1/compressed@2017-07-051      0      -   112K  -
        pool1/compressed@2017-07-052      0      -   112K  -
      11. zfs list -t all
        # 列出所有的zfs檔案系統
        root@debian8:~# zfs list -t all
        NAME                           USED  AVAIL  REFER  MOUNTPOINT
        pool1                         3.00G  4.81G   120K  /pool1
        pool1/compressed               112K  3.00G   112K  /pool1/compressed
        pool1/compressed@2017-07-05       0      -   112K  -
        pool1/compressed@2017-07-051      0      -   112K  -
        pool1/compressed@2017-07-052      0      -   112K  -
        pool1/data                     112K  4.81G   112K  /data
         
      12. # pool1/compressed@2017-07-051
        # 刪除 pool1/compressed@2017-07-051 這個 snapshot
        root@debian8:~# zfs list -t snapshot
        NAME                           USED  AVAIL  REFER  MOUNTPOINT
        pool1/compressed@2017-07-05       0      -   112K  -
        pool1/compressed@2017-07-052      0      -   112K  -
         
      13. # 回復到某一個快照點
        # 先刪除剛剛產生的檔案
        root@debian8:~# rm /pool1/compressed/1234
        root@debian8:~# ll /pool1/compressed/
        總計 17
        drwxr-xr-x 2 root root 2  7月  1 12:24 ./
        drwxr-xr-x 3 root root 3  7月  1 12:04 ../
        再將zfs檔案系統還原到刪除前的snapshot
        root@debian8:~# zfs rollback pool1/compressed@2017-07-052
        root@debian8:~# ls -alF /pool1/compressed/
        總計 18
        drwxr-xr-x 2 root root 3  7月  1 12:23 ./
        drwxr-xr-x 3 root root 3  7月  1 12:04 ../
        -rw-r--r-- 1 root root 0  7月  1 12:23 1234
      14. # zfs destroy pool1/compressed # 可刪除 pool1/compressed 檔案目錄

        root@debian8:~# zfs list -t all
        NAME                           USED  AVAIL  REFER  MOUNTPOINT
        pool1                         3.00G  4.81G   120K  /pool1
        pool1/compressed               280K  3.00G   112K  /pool1/compressed
        pool1/compressed@2017-07-05     88K      -   112K  -
        pool1/compressed@2017-07-052    80K      -   112K  -
        pool1/data                     112K  4.81G   112K  /data
        # 在 pool1/compressed 檔案系統裡還有兩個快照存在
        # 直接刪除檔案系統
        root@debian8:~# zfs destroy pool1/compressed
        cannot destroy 'pool1/compressed': filesystem has children
        use '-r' to destroy the following datasets:
        pool1/compressed@2017-07-05
        pool1/compressed@2017-07-052