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

1. 簡介

  1. Linux-based 為基礎的手工NAS系統。
  2. 以VirtualBox安裝 Debian8(文字界面,節省記憶體使用量,並以最小安裝)做為 samba 分享主機。
  3. 以開源ZFS套件(以Debian 之 apt-get 指令即可安裝)
    將 samba 分享的目錄位置的指向以ZFS指令格式化成ZFS格式的硬碟儲存池(pool)或資料集(dataset),
    ZFS具有即時快照和即時回溯的功能,可以事先避免勒索軟體的威脅及檔案誤刪的損失。

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

2. 開始

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

2-1 Samba 簡介

  Samba 可用來讓 Unix、Linux、macOS 及 Windows 等作業系統間檔案資源流通,以 SMB/CIFS (Server Message Block/Common Internet File System) 網路協定做連結,衍生為印表機分享、雲端 網路儲存或整合 Windows Server 網域控制等功能的網通產品,早已存在大家身邊多時,是應用廣泛 的自由軟體。即使現今 NAS (Network Attached Storage) 軟硬體產品取得容易,操作技術門檻降低 ,Samba server 建置的實作,對於學習 Linux 伺服器管理技能應能有所助益。

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

2-2 Linux 伺服器安裝

  1. 安裝 VirtualBox 或 VMware Player 等虛擬機器軟體作為練習測試平台。
     
  2. 實作上可用 VirtualBox 或 VMware Player 或 Proxmox VE 來做為實做。
     
  3. 下載 Linux 安裝光碟映像檔,常見 Ubuntu、Debian 的近期版本皆可。
     
  4. VirtualBox 中新增虛擬機器,並安裝 Ubuntu Debian 等 Linux 作業系統。下載安裝光碟映像 iso 檔 ,毌需燒錄即可掛載使用,伺服器版本尤佳。
     
  5. Windows 虛擬機器的安裝,可供 Windows 平台 Samba 使用者測試使用,虛擬機器軟體新增 「VirtualBox Guest Additions」或「VMware Tools」,可提昇虛擬機器效能,並增加操作流暢 度與便利性。
     
  6. 以 Debian 8.x Server 版為例,「選擇軟體」時至少應有 SSH Server 軟體,以便後續遠端登入操 控。以精簡安裝為目的時,其他項目可全不勾選,日後再以「apt­-get」指令安裝所需套件。
     
  7. 安裝完成重新開機後,可視需求情況新增ntpdate 網路校時程式及檔案傳輸工具 rsync 等套件。
    ~# apt­get update;apt­get upgrade
    ~# apt­get install rsync ntpdate

     
  8. 新版 SSH Server 預設禁止 root 遠端登入,想變更設定時方法如下:
    user@debian:~$ su
    密碼:
    ~# pico /etc/ssh/sshd_config
    約28行處找到「PermitRootLogin」的設定項目
    PermitRootLogin without­password

    將「without­password」改為「yes」,如:
    PermitRootLogin yes

    重新啟動 SSH 服務:
    ~# service ssh restart

 

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

2-3 create mode

https://www.ubuntu-tw.org/modules/newbb/viewtopic.php?post_id=183878

create mode = 新增檔案時,檔案的權限
660 = 檔案擁有者、檔案群組擁有者,可讀+寫,其餘人不可讀寫

directory mod = 新增目錄時,目錄的權限
2770=目錄擁有者、目錄群組擁有者,可讀+寫+進入,其餘人無任何權限

特別說明 2770 前面那個 2,那是指當目錄底下新增檔案或目錄,該檔案或目錄的「群組」會自動變成頂層的群組。以此例子來說,就是群組會自動變成 上一層目錄所屬的群組。



 

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

3. 安裝

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

3-1 準備安裝軟體

  1. 下載VirtualBox
    https://www.virtualbox.org/wiki/Downloads
    http://download.virtualbox.org/virtualbox/5.1.22/VirtualBox-5.1.22-115126-Win.exe <-----下載
    http://download.virtualbox.org/virtualbox/5.1.22/Oracle_VM_VirtualBox_Extension_Pack-5.1.22-115126.vbox-extpack <-----下載
  2. 下載 Debian
    Debian8:從最小安裝光碟進行網路安裝
    debian-8.7.1-amd64-netinst.iso <-----下載 64位元版本
    debian-8.7.1-i386-netinst.iso <-----下載
    32位元版本
    Debian9:從最小安裝光碟進行網路安裝
    debian-9.0.0-amd64-netinst.iso
    debian-9.0.0-amd64-netinst.iso
  3. putty
    putty.exe

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

3-2 安裝 VirtualBox

  1. 下載 VirtualBox 5.1.22 版 後安裝。
  2. 再下載擴充套件 Oracle_VM_VirtualBox_Extension_Pack-5.1.22-115126.vbox-extpack 後安裝。

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

3-3 安裝Debian8

  1. 下載 Debian
    Debian8:從最小安裝光碟進行網路安裝
    debian-8.7.1-amd64-netinst.iso <-----下載 64位元版本
    debian-8.7.1-i386-netinst.iso <-----下載
    32位元版本
  2. 建立虛擬機 Debian8

     
  3. 設定記憶體


     
  4. 建立硬碟






     
  5. 初步完成





     
  6. 修改設定值


     
  7. 以光碟機優先開機,待會兒要用debian8的iso檔開機


     
  8. 啟用硬體3D加速


     
  9. 掛載Debian8的 iso 檔










     
  10. 設定網路卡的使用方式






     
  11. 設定完成


     
  12. 按下開始,開始安裝Debian8

     



  13.  



  14.  



  15.  



  16.  


  17.  



  18.  



  19.  



  20.  


  21.  


  22.  



  23.  



  24.  



  25.  



  26.  



  27.  



  28.  



  29.  



  30.  



  31.  



  32.  



  33.  



  34.  



  35.  



  36.  



  37.  



  38.  



  39.  



  40.  



  41.  



  42.  

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

3-3-1 完裝完成後手動設定固定ip

  1. 手動設定主機的 ip ,必須在路由器 dhcp 配發的範圍以外,以避免 ip 重覆。
    1. windows 系統使用windows cmd 指令 ipconfig 查詢目前網段及 gateway
      ipconfig /all
    2. Linux 系統使用Linux  command Line 指令
      ip a (debian 9)或 ifconfig (debian 8 以前)查詢目前網段
      及 gateway
      ~# ip a


      ~# ifconfig

       
  2. 修改主機ip設定
    ~# pico /etc/network/interfaces

     

    auto lo
    iface lo inet loopback

    auto eth0
    iface eth0 inet static

    address 172.20.2.21 <-----------172.20.2. 網段(和底下 gateway 要同網段)

    netmask 255.255.255.0

    gateway 172.20.2.254 <-----------172.20.2. 網段(這是AP的位址,也路路由的位址)


重新啟動網路設定 或 重新開機( 使用 reboot 指令)
~# service networking restart

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

3-4 微調

  1. Debian8 的 ip 目前為 dhcp 自動取得,在開啟  VirtualBox Debian8 登入後以指令查詢所取得的ip。
    ~# ifconfig

     
  2. 設定允許 root ssh 登入
     
    1. pico /etc/ssh/sshd_config

      找到 PermitRootLogin without-password
      改成 PermitRootLogin yes

      /etc/init.d/ssh restart

      service ssh restart

      即可.

  3. 安裝完成重新開機後,可視需求情況新增ntpdate 網路校時程式及檔案傳輸工具 rsync 等套件。
  4. ~# apt­-get update
    apt­-get upgrade
    apt­-get dist-upgrade
    ~# apt-­get install rsync ntpdate tree
  5. 新版 SSH Server 預設禁止 root 遠端登入,想變更設定時方法如下:
    user@debian:~$ su
    密碼:
    ~# pico /etc/ssh/sshd_config
    約28行處找到「PermitRootLogin」的設定項目
    PermitRootLogin without­password

    將「without­password」改為「yes」,如:
    PermitRootLogin yes

    重新啟動 SSH 服務:
    ~# service ssh restart


     
  6. 登入後,切換到 root
    debian@debian8:~$ cd
    debian@debian8:~$ pico .bashrc
    在最後面加入以下這一行
    alias ll='ls -alF'
    登出root後再重新登入root

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

3-5 安裝samba與相關套件

  1. 安裝 samba 套件
    ~# apt-get install samba

    安裝完成後先用 testparm 指令,查看目前設定狀態…

    root@debian8:~# testparm 
    Load smb config files from /etc/samba/smb.conf
    Processing section "[homes]"
    Processing section "[printers]"
    Processing section "[print$]"
    Loaded services file OK.
    Server role: ROLE_STANDALONE

    Press enter to see a dump of your service definitions

    # Global parameters
    [global]
        server role = standalone server
        map to guest = Bad User
        obey pam restrictions = Yes
        pam password change = Yes
        passwd program = /usr/bin/passwd %u
        passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
        unix password sync = Yes
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 1000
        dns proxy = No
        usershare allow guests = Yes
        panic action = /usr/share/samba/panic-action %d
        idmap config * : backend = tdb


    [homes]
        comment = Home Directories
        valid users = %S
        create mask = 0700
        directory mask = 0700
        browseable = No


    [printers]
        comment = All Printers
        path = /var/spool/samba
        create mask = 0700
        printable = Yes
        print ok = Yes
        browseable = No


    [print$]
        comment = Printer Drivers
        path = /var/lib/samba/printers
    root@debian8:~# 
     

    1. 查詢結果顯示,使用者家目錄已開放擁有者讀取權限,兩段與印表機分享相關的設定,用不到時可 以全部刪除。

    2.  使用者端「網路芳鄰」瀏覽 為了測試 Samba 功能,虛擬機器軟體中啟動 Windows 虛擬機器,順利的話可在「網路芳鄰」中看 到 Samba server 出現其中。

    3. 使用者端直接以網路位址開啟 Samba server Windows 使用者可在「檔案總管」網址列中,以路徑「\\hostname」或「\\IP位址」瀏覽 Samba 伺 服器。 如:\\debian 或 \\10.0.2.15

  2. 安裝 自動掛載 套件
    ~# apt-get install autofs
  3. 安裝網路檔案系統(NFS)分享套件
    ~# apt-get install nfs-kernel-server
    修改 /etc/exports,加入一行  /mnt   *(rw,sync,no_subtree_check)
    ~# pico /etc/exports
    重新啟動 nfs 服務
    ~# service nfs-kernel-server restart
    查看nfs是否有成功
    ~# showmount -e localhost

     

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

3-6 安裝 zfs 套件

  1. 安裝 zfs 套件
    ~ # apt-get install zfs-fuse

     
  2. 查看 zfs 版本
    ~ # zfs upgrade -v
    ~ # zfs upgrade

     
  3. 限制 zfs 所使用的第1層快取(參考)
    ~ # pico /etc/zfs/zfsrc


    ubuntu16.0x(例:acfs16.04/ezgo13)的zfs設定檔
    root@ezgo13:~# cat /etc/modprobe.d/zfs.conf
    # 4G
    #options zfs zfs_arc_max=4299967296
    # 3G
    #options zfs zfs_arc_max=3224975472
    # 2G
    #options zfs zfs_arc_max=2149983648
    # 1G
    options zfs zfs_arc_max=1074991824
    # 756M
    #options zfs zfs_arc_max=792723456
    # 256M
    # options zfs zfs_arc_min=268435456
    # 128M
    #options zfs zfs_arc_max=134217728
    # 100M
    #options zfs zfs_arc_min=104857600


    找到下列這一行,最小值是16Mb,安裝完套件後的設定值是 100Mb,如果主機的記憶體足夠的話,可以指定更多的記憶體讓 zfs 使用
    max-arc-size = 100
    1. 100表示 zfs 可以使用的 arc 快取最高為100Mb
    2. 不同的系統中,zfs的設定值表示方式可以會有所不同
    3. 若主機主要是當 Storage 使用,則儘量給予最大的記憶體量,例如 4G~256G,
      通常是給予 (主機的記憶體G數-1G ) 給 zfs 的 arc 使用
    4. 若主機未限制第1層 arc 快取,則 zfs 最大將會使用到 (主機的記憶體G數-1G)

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

3-7 新增二顆儲存虛擬硬碟

  1. 將虛擬機 Debian8 關機
  2. 新增 2顆虛擬硬碟。
    1. 新增第1顆虛擬硬碟








      到這裡新增1顆虛擬硬碟



       
    2. 再新增第2顆虛擬硬碟
      要注意的是第2顆虛擬硬碟的檔名不能重覆


      完成了新增2顆虛擬硬碟




       
  3. 再將虛擬機 Debian8 開機

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

4. samba 設定

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

4-1 Samba 伺服器設定

smb.conf 為 Samba 伺服器重要的設定檔,所有設定參數都在其中。如同一般 Linux 設定檔,主要 設定項目也都提供註解說明。

全域設定、列印分享及目錄分享等類別,以及工作群組與分享目錄參數,為 smb.conf 的主要設定項目。

Samba 安裝後有很多預設值,即使 smb.conf 未更動也能作用,建議先保留預設值,必要時再新增 參數變更,查詢預設值可用「man smb.conf」指令。

Samba 每次設定變更後,皆需重新啟服務讓設定內容生效。

root@debian8:~# /etc/init.d/smbd restart
[ ok ] Restarting smbd (via systemctl): smbd.service.
全部 ok 表示 Samba 服務功能大致正常。

root@debian8:~# service smbd restart
root@debian8:~#

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

4-2 基本設定

  1. 使用 samba 網路芳鄰的服務,通常都需要使用者帳號與密碼做為驗證,所以,要先建立 samba 的帳號、密碼。
    1. 先建立系統帳號
      ~#   useradd username

       
    2. 再建立 samba 的密碼(samba會先檢查系統目前是否已有此使用者,才允許新增該使用者的samba密碼)
      smbpasswd -a username
      root@samba:~# smbpasswd -a user1
      New SMB password:
      Retype new SMB password:


       
  2. samba 設定檔修改後,均需重新啟動 samba 服務才能對剛剛所做的修改生效。
    重新啟動 samba 服務:
    root@samba:~# service smbd restart

     

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

4-2-1 新增任何使用者及訪客皆可讀寫之分享資料夾

[shared]

comment = Shared Folder

path = /home/samba/shared

read only = no

guest ok = yes

create mask = 0777

directory mask = 0777

# 資料夾顯示名稱,建議使用英文字元。實作中文也相容。

# 分享資料夾註解說明,此為非必要項目。

# 分享資料夾路徑。<---- 要手動建立路徑

# 允許寫入。

# 允許訪客瀏覽。

# 預設新增檔案權限,非必要項目。

# 預設新增資料夾權限,非必要項目。

  1. ~# pico /etc/samba/smb.conf
     
  2. 建立分享目錄
    path = /home/samba/shared  , 所以我們在伺服器上也要建立相對應的目錄

    root@samba:/# mkdir /home/samba/shared  -p

    root@samba:/# cd /home/samba/

    root@samba:/home/samba# ls -alF

    總計 4

    drwxr-xr-x 2 root root 4096  7月  5 12:48 share
  3. 目前 /home/samba/shared 目錄除了 root 可以讀寫,其餘人等只能看不能寫,
    因此,我們要變更這個目錄的讀寫權限

    root@samba:/home/samba# chmod 777 shared/

    root@samba:/home/samba# ls -alF

    總計 4

    drwxrwxrwx 2 root root 4096  7月  5 12:48 shared

     
  4. 重新啟動 samba
    service smbd restart

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

4-2-2 使用者家目錄權限設定

  1. 新增使用者帳號及建立 Samba 連線密碼。
    以使用者名稱 user1 為例:

     
    1. ~# useradd ­ user1                <----- 先建立系統帳號(不會同步建立家目錄)
      ~# mkdir /home/user1          <----- 手動建立家目錄
      ~# chown user1.user1 /home/user1     <----- 手動變更家目錄 擁有者.群組


       
    2. ~# adduser user1  <----- 會同步建立家目錄
      ~# smbpasswd ­-a user1       <----- 再建立 samba 密碼 <------ 要特別注意喔!
  2. samba 網路芳鄰的登入密碼設定
    smbpasswd -a  user1

     
  3. 修改 smb.conf 使用者家目錄權限設定
    (安裝完 samba 後預設的 [homes]就有完整的設定,差別只在 read only = yes 改成no)
    ~# pico /etc/samba/smb.conf

     

    [homes]

    comment = Home Directories

    browseable = no

    read only = no

    create mask = 0700

    directory mask = 0700

    valid users = %S


    # 預設分享資料夾註解說明。

    # 分享資料夾隱藏。

    # 允許寫入。

    # 預設新增檔案權限。

    # 預設新增資料夾權限。

    # 允許任何可登入的使用者登入。

  4. 重新啟動 samba
    service smbd restart

     
  5. 因為 browseable = no ,所以要進入家目錄時需手動輸入自己的目錄
    例如,自己的帳號是 user1,那麼在路徑上就輸入
    \\192.168.88.45\user1


     
  6. 建立 windows  批次檔
    netdelete.bat
    net use * /delete

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

4-2-3 設定需帳號密碼才可登入瀏覽提高檔案伺服器管理安全層級

~# pico /etc/samba/smb.conf

約117行

map to guest = bad user

預設狀態為允許未登入訪客瀏覽,將此設定項目刪除,或加 上「;」讓設定失效,改為需帳號密碼才可登入使用。

如:
; map to guest = bad user

 

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

4-2-4 增一般使用者唯讀分享資料夾

  1. ~# pico /etc/samba/smb.conf

[public]

path = /home/samba/public

guest ok = yes

write list = user1

# 資料夾顯示名稱,建議使用英文字元。中文其實也可以。

# 分享資料夾路徑

# 允許訪客使用。

# 允許特定使用者寫入。

  1. 手動建立分享資料夾
    ~# mkdir /home/samba/public -p

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

4-2-5 增隱藏分享資料夾

~# pico /etc/samba/smb.conf

[library]

path = /home/samba/library

browseable = no

read only = no

guest ok = yes

create mask = 0777

directory mask = 0777

# 資料夾顯示名稱,建議使用英文字元。中文名稱也可以。

# 分享資料夾路徑。<----- 記得要手動建立分享目錄

# 分享資料夾隱藏。<----- 不會顯示在網芳

# 允許寫入。

# 允許訪客瀏覽。

# 預設新增檔案權限,非必要項目。

# 預設新增資料夾權限,非必要項目。

 

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

4-2-6 修改主機名稱

Samba 在網路芳鄰中出現的主機名稱預設與 hostname 相同,修改 hostname 時

~# pico /etc/hostname

修改後重新開機,通常需幾分鐘後才能生效。

也可在 smb.conf 的 global 區段中,加入「netbios name」設定內容。
如: netbios name = servername
Samba 基本設定至此完成。

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

4-3 進階設定

利用  Linux 系統中 使用者和群組 的設定來達到所有的分享目錄皆在同一個 share 分部目錄底下,同時又能做到權限控管/讀寫/顯示及隱藏的功能。

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

4-3-1 實作-samba 設定

將 samba 伺服器上的分享目錄全部集中在同一個目錄

  1. 設定修改 samba 的設定檔 
    ~# pico /etc/samba/smb.conf

     

    [行政辦公]
            comment      =       行政辦公
            path              =       /home/samba
            browseable  =       yes
            read only      =       no
            #       和上面一行一樣  可讀寫
            #       writeable       =       yes
            guest ok       =       yes

            # 只允許 使用者 user1和 群組 allteachers
      # 的成員可以進入
            valid users     =       user1,@allteachers
            veto files   =   /*.inf/*.com/*.exe/*.lnk/*.cmd/*.dll/*.doc/\
    *.docx/*.m??/*.wav/*.reg/*.rm*/*.url/*.vob/*.vbs/*.vbe/*.eml/\
    *.nws/Riched20.dll/*.ccc/*.vvv/*.CCC/*.VVV/\
    *.wncry/*.WNCRY/

    # samba 分享目錄名稱
    # 註解
    # 分享目錄在主機上的路徑
    # 是否可流灠
    # 可讀寫

    # 可讀寫 的另一種寫法
    # 是否允許無帳號密碼者
    # 如果有開免帳密分享的目錄
    # 允許進入本分享目錄的使用者或群組
    禁止存取的檔案及檔案類型


    最後一行的檔案類型設定要全部寫在一行,若要折行的話,必須在最後面加上\字元。

    veto files = /*.inf/*.com/*.exe/*.lnk/*.cmd/*.dll/*.doc/*.docx/*.m??/*.wav/*.reg/*.rm*/*.url/*.vob/*.vbs/*.vbe/*.eml/*.nws/Riched20.dll/*.ccc/*.vvv/*.CCC/*.VVV/*.wncry/*.WNCRY/

     

  2. 手動建立分享路徑
    ~# mkdir /home/samba   <---若未建立上方 path = /home/path 的路徑目錄,在重新啟動 samba後,以滑鼠點選要進入 行政辦公 目錄時會出現 路徑無法使用的的錯誤。

     

  3. 開啟網路芳鄰登入
    這時會發現,無法登入。

    1. 原因:samba 伺服器上的密碼設定與OS的帳號密碼是各自獨立
      ~# passwd user1
      是設定登入伺服器主機帳號的密碼,但 samba user和 debian user分開管理的。
      所以,我們還要另外設定使用者 user1 的 samba 密碼。
      root@debian8:~# useradd  user1             <------新增 user1 帳號
      root@debian8:~# smbpasswd -a user1  <------新增 samba user1 的帳號密碼
      New SMB password:
      Retype new SMB password:
      root@debian8:~#
      這樣,使用者 user1 就能透過網路芳鄰登入 samba 伺服器

      新版的 samba 使用者密碼 設定可使用 pdbedit -a user1 來設定
      經測試 不管是 smbpasswd 或 pdbedit 功能一致


    2. 重點整理:
      samba 網路芳鄰的登入

      1. 先建立主機的帳號 --->  useradd user1

      2. 再新增主機帳號的 samba 密碼  ---> smbpasswd -a user1
         

    3. 如何刪除 samba 使用者帳號
      root@debian8:smbpasswd -x user1
      Deleted user user1.



      root@debian8:# pdbedit -x user1
      root@debian8:#

       

    4. 列出samba使用者資訊
      root@debian8:~# pdbedit -v user1

      Unix username:        user1
      NT username:          
      Account Flags:        [U          ]
      User SID:             S-1-5-21-482853127-1074029144-2756240993-1006
      Primary Group SID:    S-1-5-21-482853127-1074029144-2756240993-513
      Full Name:            葉大雄
      Home Directory:       \\debian8\user1
      HomeDir Drive:        
      Logon Script:         
      Profile Path:         \\debian8\user1\profile
      Domain:               DEBIAN8
      Account desc:         
      Workstations:         
      Munged dial:          
      Logon time:           0
      Logoff time:          三, 06  2月 2036 23:06:39 CST
      Kickoff time:         三, 06  2月 2036 23:06:39 CST
      Password last set:    五, 30  6月 2017 14:06:54 CST
      Password can change:  五, 30  6月 2017 14:06:54 CST
      Password must change: never
      Last bad password   : 0
      Bad password count  : 0
      Logon hours      

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

4-3-2 建立目錄結構

  1. 建立目錄結構
    cd /home/samba
           mkdir 01-教務處
           cd 01-教務處
                  mkdir 01-教務主任
                  mkdir 02-教學組長
                  mkdir 03-訓導組長
                  mkdir 04-設備組長

     
  2. tree /home/samba

    root@debian8:/home/samba# tree /home/samba/
    /home/samba/
    └── 01-教導處
        ├── 01-教務主任
        ├── 02-教務組長
        ├── 03-訓導組長
        └── 04-設備組長

    5 directories, 0 files

    (tree 指令請以 apt-get install tree  安裝)

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

4-3-3 建立使用者

  1. 系統記錄使用者帳號的設定檔
    /etc/passwd

     
  2. 請建立user0~user4共五個帳號,但不建立家目錄, 並設定 samba 密碼
    ~# useradd user0

    ~# useradd user1
    ~# useradd user2

    ~# useradd user3

    ~# useradd user
    4
    ~# smbpasswd -a user0

    ~# smbpasswd -a user1
    ~# smbpasswd -a user2

    ~# smbpasswd -a user3

    ~# smbpasswd -a user4
  3. 如何新增、刪除一位使用者
    1. 同時建立使用者目錄,並設定登入密碼
      root@debian8:~# adduser user1
      Adding user `user1' ...
      Adding new group `user1' (1001) ...
      Adding new user `user1' (1001) with group `user1' ...
      Creating home directory `/home/user1' ...
      Copying files from `/etc/skel' ...
      輸入新的 UNIX 密碼:         密碼不設定,直接按 Enter ,使用者 user1 將無法以 ssh 登入主機)
      再次輸入新的 UNIX 密碼:       (密碼不設定,直接按 Enter ,使用者 user1 將無法以 ssh 登入主機)
      passwd:密碼已成功地變更
      正在改變 user1 的使用者訊息
      請輸入新值,或直接按 ENTER 鍵以使用預設值
          全名 []:           (這裡可以輸入使用者的本名,例:葉大雄)
          房間號碼 []: 
          工作電話 []: 
          住家電話 []: 
          其它 []: 
      Is the information correct? [Y/n] y
      root@debian8:~#
    2. 只建立帳號,不建立使用者目錄,也不設定密碼
      root@debian8:~# useradd user1
      root@debian8:~# cat /etc/passwd |grep user1
      user1:x:1001:1001::/home/user1:/bin/sh
      root@debian8:~# ll /home/
      總計 12
      drwxr-xr-x  3 root   root   4096  6月 30 10:10 ./
      drwxr-xr-x 23 root   root   4096  6月 16 15:20 ../
      drwxr-xr-x  2 debian debian 4096  6月 13 15:23 debian/
      root@debian8:~#
       
    3. 刪除使用者
      1. 刪除使用者帳號,
        並同時刪除使用者家目錄(加 -r 參數則會連同家目錄及/var/mail/user1一併刪除)

        root@debian8:~# userdel user1 -r
        root@debian8:~# ll /home/
        總計 12
        drwxr-xr-x  3 root   root   4096  6月 30 10:10 ./
        drwxr-xr-x 23 root   root   4096  6月 16 15:20 ../
        drwxr-xr-x  2 debian debian 4096  6月 13 15:23 debian/  <----- 家目錄 /home/user1 已經刪除了
        root@debian8:~# cat /etc/passwd |grep user1                 <----- 在/etc/passwd 裡 user1 的帳號已經刪除了
        root@debian8:~#
         
      2. 僅刪除使用者帳號
        root@debian8:~# userdel user1
        root@debian8:~# cat /etc/passwd | grep user1
        root@debian8:~# ls -alF /home/
        總計 16
        drwxr-xr-x  4 root   root   4096  6月 30 10:25 ./
        drwxr-xr-x 23 root   root   4096  6月 16 15:20 ../
        drwxr-xr-x  2 debian debian 4096  6月 13 15:23 debian/
        drwxr-xr-x  2   1001   1001 4096  6月 30 10:25 user1/       <------ 家目錄 /home/user1  還在
        root@debian8:~#

  4. 設定使用者禁止登入伺服主機
    若不提供個人家目錄,請在 /etc/passwd 中每一個新增的帳號裡的 /bin/bash 改為 /bin/false
    這樣該使用者就無法登入主機,減少主機被入侵的機率,同時增加系統的安全性。
    root@debian8:~# pico /etc/passwd

    找到  user1 這一行
    user1:x:1001:1001:葉大雄,,,:/home/user1:/bin/bash
    改為
    user1:x:1001:1001:葉大雄,,,:/home/user1:/bin/false

     
  5. 設定使用者登入主機密碼(請謹慎開放此項功能)
    1. root@debian8:~# passwd user1
      輸入新的 UNIX 密碼:
      再次輸入新的 UNIX 密碼:
      passwd:密碼已成功地變更

       
    2. 修改 user1 在 /etc/passwd 裡允許登入主機設定
      root@debian8:~# pico /etc/passwd
      找到  user1 這一行
      user1:x:1001:1001:葉大雄,,,:/home/user1:/bin/bash

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

4-3-4 建立群組

  1. 系統記錄群組的設定檔
    /etc/group

     
  2. 建立 allteacher、g00、g01 三個群組
    群組 allteacher 組員:  user0、user1、user2、user3、user4 (可以登入行政辦公 目錄)
    群組      g00
    組員: user0、user1、user2、user3、user4 (教務處人員,可以進入 01-教務處 目錄)
    群組      g01 組員: user0、user1 (校長、主任,可以讀取教務處人員各目錄)




     
  3. 如何建立群組
    root@debian8:~# addgroup allteacher
    Adding group `allteacher' (GID 1002) ...
    Done.


    請依序完成 g00 、g01 群組的建立

  4. 將已建立的使用者 user1 加入到 群組 allteacher 裡,成為 群組 allteacher 的成員
    root@debian8:~# usermod   -a       -G allteacher          user1
    請依序完成步驟2裡群組與組員的對應



     
  5. 如何刪除群組
    1. 新建一個練習用的群組 test
      root@debian8:/home/samba#    addgroup    test
      Adding group `test' (GID 1009) ...
      Done.
    2. 刪除群組 test
      root@debian8:/home/samba# delgroup        test
      Removing group `test' ...
      Done.
      root@debian8:/home/samba#

       
  6. 小技巧:查看使用者屬於哪些群組
    ~# groups user1
    user1 : user1 g00 g01 allteacher

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

4-3-5 實作-分享目錄權限設定

  1. 到目前為止,已經可以登入samba 提供的網路芳鄰,但我們可以發現,在該行政目錄底下,無法新增任何一個檔案。這是因為 Linux 上該分享目錄所在路徑(/home/samba) 的權限設定所官理。

     
  2. 目錄權限變更
    cd /home
    chmod 755 samba/
              <--------- 設定 /home/samba 目錄可以j點選進入

    cd samba/
    chown root.g00 01-教務處/           <----------  g00 群組
    chmod        750 01-教務處/           <---------- 可以進入

    cd 01-教務處/
    chown user1.g01 01-教務主任/    <----------  g01 群組
    chmod          750
      01-教務主任/    <---------- 可以讀取

    chown user2.g01 02-教務組長/    <----------  g01 群組
    chmod           750 02-教務組長/    <---------- 可以讀取

    chown user3.g01 03-訓導組長/    <----------  g01 群組
    chmod           750 03-訓導組長/
        <---------- 可以讀取

    chown user4.g01 04-設備組長/    <----------  g01 群組
    chmod           750 04-設備組長/
        <---------- 可以讀取


     
  3. 變更結果
    cd /home/
    ls -alF

    drwxr-x---  3 root   root   4096  7月  5 20:14 samba/

    cd samba/
    ls -alF

    drwxr-x--- 6 root g00  4096  7月  5 19:39 01-教務處/

    cd 01-教務處/
    ls -alF

    drwxr-x--- 2 user1 g01  4096  6月 30 14:45 01-教務主任/
    drwxr-x--- 2 user2 g01  4096  6月 30 14:45 02-教務組長/
    drwxr-x--- 2 user3 g01  4096  6月 30 14:46 03-訓導組長/
    drwxr-x--- 2 user4 g01  4096  6月 30 14:46 04-設備組長/




     
  4. 目錄權限:

    我們看到這一行,samba/ 目錄前的第1個d 表示這是目錄
    drwxr-xr-x  2 root   root   4096  6月 30 14:17 samba/
    接下來第1組rwx表示 是使用者 root 所擁有的權限  r 可讀取 w 可寫入 x 可執行
    接下來第2組rwx表示 是群 組 root 所擁有的權限  r 可讀取 - 不可寫入 x 可執行
    接下來第3組rwx表示 任何其他人 所擁有的權限  r 可讀取 - 不可寫入 x 可執行
    r ---> 4             rwx ---> 7 讀寫進入         r--     ---> 4  讀           --x   可進入
    w --> 2             rw-  ---> 6 讀寫                -wx  ---> 3  寫 進入

    x ---> 1             r-x  ---> 5 讀  進入           -w-   ---> 2  寫
    -----------------------------------------------------------------------------------------------------------------

     
  5. 到目前為止我們建立了教務處的目錄結構

    root@debian8:~# tree /home/samba/
    /home/samba/
    └── 01-教務處    (群組 g00--->可進入目前的目錄)
        ├── 01-教務主任  (使用者user1 群組 g01/ 使用者user1可讀寫 群組g00可讀取)
        ├── 02-教務組長  (使用者user2 群組 g01/ 使用者user2可讀寫 群組g01可讀取)
        ├── 03-訓導組長  (使用者user3 群組 g01/ 使用者user3可讀寫 群組g01可讀取)
        └── 04-設備組長  
    (使用者user4 群組 g01/ 使用者user4可讀寫 群組g01可讀取)

    5 directories, 0 files
    root@debian8:~#


     
  6. 變更目錄權限
     
    1. 在 samba 分享目錄 行政辦公底下的 01-教務處,
      只允許教務處群組的人員(使用者)進入

      並且 01-教務處目錄 下各目錄間的權限分開
      上層的職位可以讀取下層的目錄,但不可寫入或修改。

      在教務處底下的各目錄間禁止互相讀取及寫入

       
  7. 到此 教務處的權限已設置完成
    1. 校長(user0)、教務主任(user1)、教務組長(user2)、訓導組長(user3)、設備組長(user4)同屬於 g00群組,
      所以可以進入 01-教務處目錄
    2. 校長(user0)、教務主任(user1)同屬於 g01群組,所以可以讀取 01-教務主任目錄
    3. 教務主任(user1)可以讀寫 /home/samba/01-教導處/01-教務主任/ 目錄
      群組 g01 只允許 讀取  /home/samba/01-教導處/01-教務主任/ 目錄
    4. 教務組長(user2)可以讀寫 /home/samba/01-教導處/02-教務組長/ 目錄
      群組 g01
      只允許 讀取  /home/samba/01-教導處/02-教務組長/ 目錄
    5. 訓導組長(user3)可以讀寫 /home/samba/01-教導處/03-設備組長/ 目錄
      群組 g01
      只允許 讀取  /home/samba/01-教導處/03-設備組長/ 目錄
    6. 設備組長(user4)可以讀寫 /home/samba/01-教導處/04-訓導組長/ 目錄
      群組 g01
      只允許 讀取  /home/samba/01-教導處/04-訓導組長/ 目錄

       
    7. 組長間之能讀寫自己的目錄,無法讀寫其它人員的目錄內容。

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

5. ZFS

  1. 先在虛擬機中新增兩顆虛擬硬碟做為 zfs 實作使用

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

5-1 ZFS - Raid

來源:http://note.zn2.us/zfs-raid.htm (原作者 夢見草 同意使用)

ZFS-RAID

建立日期:2017/05/02
更新日期:2017/07/03


1.
raid12.raidz3.管理與維護4.效能測試



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

5-1-1 建raid1

1.raid1


 

raid1即mirror

pve wiki上的教法,建 raid1 語法:

zpool create 儲存池名稱 raid格式 裝置名稱
zpool create -m 掛載點 儲存池名稱 裝置名稱
zpool create -f -o ashift=12 儲存池名稱 mirror 裝置1 裝置2
zpool的用法詳細說明

這段主要就講這一行指令

zpool create -f -o ashift=12 vic1 mirror sdb sdc

上面這個指令會建立一個 vic1 的儲存池(storage pool)、自動產生zfs檔案系統和掛載點(預設都是在系統的根目錄底下),並且會自動掛載該檔案系統。

 

一個指令就幫你做了這麼多事,真是簡便到有點不太習慣,它把我這些全都做了:
建raid指令mdadm、格式化mkfs.ext4、建掛載點mkdir /mnt/vic1、掛載mount

註: 裝置名寫 sdc 即可,也可寫全路徑名稱 /dev/sdc
註2:這一頁舊資料都有提到了,也可以用 ls /dev/disk/by-id 的方式來建儲存池,因為它是硬碟上的序號,比較不會變動。
注意要找那個帶廠牌、型號、序號的那個才是哦!
範例如下:
ls -al /dev/disk/by-id
ata-TOSHIBA_MG04ACA400N_178IK6ORFVLC -> ../../sdb
ata-TOSHIBA_MG04ACA400N_178IK6OSFVLC -> ../../sda
注記一下,有空時再來研究 vdev_id 這個指令和 vdev_id.conf 這檔要怎麼設定,它們都可用 man 來查看。

可用參數說明:

 

-m 指定掛載點,這個掛載點可不用先建資料夾。若已建資料夾也沒關係,但該資料夾內有檔案則會報錯
-f Forces use of vdevs, 即便它正在使用中或有其它的衝突。並非所有裝置都可靠此指令解決。
-o ashift=12 是指先進格式化(4K)的硬碟所需要下的參數。但新版的zpool本身已有支援4K sector的功能了,所以不用特別指定這個參數。

4K問題參考資料:心誌Silent Melodydelphji's Chaos
若想查你的 zpool 建立時是否有使用 ashift 指定12 可用此指令zdb |grep ashift來查詢那個數值是否等於12

 

若你有4顆硬碟想要建mirror的話,會建議你這麼下指令:

 

zpool create vic1 mirror sdb sdc mirror sdd sde

這樣你建出來的 raid 會變成 raid10 效能會比較好。
或是你一開始只有兩顆硬碟先建mirror了,後來想要再加兩顆進去,指令是這麼下的
zpool create vic1 mirror sdb sdc
zpool add vic1 mirror sdd sde

使用zpool statu 看的效果如下:

NAME		STATE		READ		WRITE		CKSUM
vic1		ONLINE		0		0		0
mirror-0	ONLINE		0		0		0
  sdb		ONLINE		0		0		0
  sdc		ONLINE		0		0		0
mirror-1	ONLINE		0		0		0
  sdd		ONLINE		0		0		0
  sde		ONLINE		0		0		0

 

 

不建議使用這樣的方式來下指令
zpool create vic1 mirror sdb sdc sdd sde

若想建立單顆硬碟的儲池存指令語法:

zpool create 儲存池名稱 裝置名稱

zfs 在預設的情況下,不帶任何參數所建立的儲存池就是raid0
裝置名稱可以寫成 /dev/sdb 或簡寫成 sdb 都可以
例:
zpool create vic2 sdb

若你一開始只是建立單碟,之後想要多加一顆進這個儲存池以達加速效果,也很容易實現

zpool add vic2 /dev/sdc

attach指令說明
zpool attach 這個指令是用來加硬碟,但它只能加硬碟進mirrors的最上面那顆硬碟裡


錯誤訊息參考:
$zpool create test1 sdd
invalid vdev specification
use '-f' to override the following errors:
/dev/sdd does not contain an EFI label but it may contain partition
information in the MBR.
若出現以上的錯誤訊息,大意是指 sdd 已有分割區了,使用參數 -f 來強制覆蓋過去即 $zpool create -f test1 sdd

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

5-1-2 建raidz

建raidz1指令
zpool create vic1 raidz1 sdb sdc

建raidz2指令
zpool create vic1 raidz2 sdb sdc sdd


多顆硬碟簡便指令
zpool create -f vic1 raidz2 sd{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p}
但不建議你這樣用,因為硬碟代號常會跳動,請改用下面的指令

範例:使用16顆硬碟來建raidz2

這16顆硬碟我們要用它的wwn號來建立,但由於我們要建16顆硬碟,一個個查wwn號 copy和貼上 有點費時,因此就用了點小技巧

①.先列出清單
ls -l /dev/disk/by-id/ > list.txt
②.刪除分割區代號
主要查找 -part 此字串,整行刪掉
sed -in '/-part/d' list.txt
③.使用vim編輯
vim list.txt
刪掉ata和使用 ctrl+v 來刪掉前面的字串
④.使用sort排序
cat list.txt |sort -t ' ' -k 3 > list2.txt
⑤.再用vim進去修改
vim list2.txt
最後結果

上面的內容,進vim把後面的 ...給刪掉即可
最後要執行的指令如下,16顆硬碟分兩個群組



若要加SSD for cache用,指令範例
zpool add vic1 cache sdx
另外拿一顆硬碟當spare
zpool add vic1 spare sdx


參考資料:raidz擴充容量zfs extend disk


初學者看過來:
當你在用了ZFS一段時間之後,你可能會發現底下這兩個指令都可以建立資料夾
zfs create vic1/folder1
mkdir /vic1/folder1
這兩個指令都可以建 folder1 資料夾,看起來和使用上好象沒有什麼差別?
簡要說明如下:
mkdir 是linux底下的指令,它所建的資料夾沒有zfs的許多功能可用
zfs create 所建的資料夾是一個資料集(中文翻譯常沒有統一,因此請記它的英文Dataset),你可針對這個資料集做很多zfs特有功能的細部設定,如拍快照、壓縮、重覆資料刪除。

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

5-1-3 管理與維護

參考此頁的一段原文:
Be careful here. Keep in mind that if any single vdev fails, the entire pool fails with it. There is no fault tolerance at the pool level, only at the individual vdev level! So if you create a pool with single disk vdevs, any failure will bring the whole pool down.

要好好理解上面這段話,任何單一的 vdev 故障,都會導致整個 pool 的故障, pool 沒有任何的容錯機制,只有在 vdev 層級才有容錯機制。基於上述的提醒,若你有16顆硬碟,是想要用兩組 vdev 來建 pool的話,是非常不建議你用兩組 raidz1 來建 pool,即 8顆raid1 兩組,這樣對資料是很危險的。

說明:底下的SOP範例都是使用硬碟代號來組建raid,在實際使用上硬碟代號經常會變動,因此不太建議使用硬碟代號來組建raid,而建議改用wwn 或硬碟序號來建raid,具體執行指令可參考上一章節 2.建raidz

(1).RAID硬碟故障更換SOP

Ⓞ 先看狀態

指令:
zpool status 儲存池名稱

  pool: vic1
 state: ONLINE
  scan: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	vic1        ONLINE       0     0     0
	  mirror-0  ONLINE       0     0     0
	    sdc     ONLINE       0     0     0
	    sdd     ONLINE       0     0     0

errors: No known data errors

並用指令 hdparm -i /dev/sdX 查清楚每一顆硬碟序號,才不會在換硬碟時搞錯顆硬碟了

①先將故障硬碟設定離線

zpool offline vic1 /dev/sdc

或是另一個指令 (不建議)
zpool detach pool-name /dev/sdd

detach與offline的差別:
detach: 若沒有其它有效的備份碟的話,執行此指令會被拒絕。若此碟可能還會被加回此儲存池(pool)的話,請用offline來替代。

②關機卸載故障硬碟,並換上新硬碟

開機後先用指令查看狀態

  pool: vic1
 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'.
  scan: none requested
config:

	NAME                                          STATE     READ WRITE CKSUM
	vic1                                          DEGRADED     0     0     0
	  mirror-0                                    DEGRADED     0     0     0
		ata-WDC_WD40EZRZ-00WN9B0_WD-WCC4E2LALV2A  ONLINE       0     0     0
		sdd                                       OFFLINE      0     0     0

上面會看到 /dev/sdd 還在,只是呈離線狀態

③replace指令

先用指令 hdparm -i /dev/sd? 查出我們剛換上去的新硬碟現在是哪個硬碟代號,只能一個個查了
我查出新硬碟位於 /dev/sdc
zpool replace -f vic1 /dev/sdd /dev/sdc

再看狀態

pool: vic1
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
	continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Mon Jul 18 02:24:48 2016
	922M scanned out of 372G at 28.8M/s, 3h39m to go
	922M resilvered, 0.24% done
config:

	NAME                                          STATE     READ WRITE CKSUM
	vic1                                          DEGRADED     0     0     0
	  mirror-0                                    DEGRADED     0     0     0
		ata-WDC_WD40EZRZ-00WN9B0_WD-WCC4E2LALV2A  ONLINE       0     0     0
		replacing-1                               OFFLINE      0     0     0
		  sdd                                     OFFLINE      0     0     0
		  sdc                                     ONLINE       0     0     0  (resilvering)

已經下了 replace 指令了,也看到了它正在重建資料當中 (resilvering)
但是 sdd 還在,估計最後還得下個卸載指令
zpool detach vic1 /dev/sdd
更正:資料重建完之後它就會消失了。

做完以上動作基本上就可以了

(2)mirror碟救援SOP

若因為機器故障,無法再開機,就必須把 mirror 硬碟,拿其中一顆到另外一台機器上讀取
底下是在另一台機器上的操作方式:

①list

指令
zpool list
看有沒有自動偵測到可用的 pool 若有的話就可直接下指令掛載

②mount

指令
zfs mount -a
上面這指令是掛載pool裡所有可掛載的內容

③import

上述兩招若不行,就是沒有偵測到可用的 pool, 改下此指令
zpool import
上面的指令會列出可用的 pool name
後面帶pool名稱,則可掛載
zpool import vic1
會提示一些警告訊息,可能要加 -f 強制選項才能掛載

(3)系統碟SOP

這裡是介紹使用 pve 安裝介面使用 zfs raid1 來安裝系統,所做出來的系統碟在遇到問題時怎麼排除
系統碟使用zfs主要按照此頁 pve wiki 上面的資料來操作

實作指令:待補...

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

5-1-4 效能測試

4.效能測試

由於raidz有多種組合,對於硬碟數量比較多的人確實有必要了解一下什麼樣的組合效能才是最好,當然可用的最大空間也是考量之一,因此底下的測試也有把可用空間寫進去。

說明一下我的測試環境:
CPU:CPU E5-2660 v4 *2
RAM:64G*4=256GB
HDD:Segate 7200RPM 1TB*28顆硬碟
主機板型號:X10DSC+
機殼型號:6048R-E1CR60L
SAS卡型號:AOC-S3008L-L8-P 使用晶片是LSI 3008
背板型號:BPN-SAS3-946SEL1

 

 

底下的測試主要參考這兩頁而來:calomel.orgicesquare.com


說明一下我的測速指令:
#寫入測速指令
dd if=/dev/zero of=/vic2/file.out bs=4096 count=80000000 &
327680000000 bytes (328 GB) copied, 597.424 s, 548 MB/s
指令的最後方加個 & 符號,將程序丟到背景去跑,接著可用 kill -USR1 PID號 來看dd的執行狀態
共寫入328GB,需要寫入這麼大的檔案用意是要超出我系統上的256G RAM,避免cache影響到測速。

寫入時亦可用底下的指令來看IO狀況
zpool iostat vic2 -v 1

#讀取測試指令
dd if=/vic2/file.out of=/dev/null bs=4096 &
327680000000 bytes (328 GB) copied, 456.144 s, 718 MB/s

zfs建28顆硬碟 raid 指令參考:


底下是測試報告:

 

 

格式 組數 硬碟數 可用總容量 寫MB/s 讀MB/s 備註
raidz3 1 28 22T 541 700
raidz3 2 14 20T 566 769~780
raidz3 4 7 14T 525 751
raidz2 1 28 23T 548 718
raidz2 2 14 21T 566~580 823~830 註1
raidz2 3 9 19T 539 542 註2
raidz2 4 7 18T 544 906
raidz1 1 28 24T 551 692
raidz1 2 14 23T 576 880
raidz1 4 7 21T 565 889
raid0 1 28 25T 592 1126 註3
mirror 1 28 899G 202 585
mirror 2 14 1.8T 441 652
mirror 14 2 13T 579 939 註4

註1:因考慮用raidz2 2組*14顆這樣的組合,所以測了兩次以上。其實不只raidz2其它組合每次測的數字都不太一樣,因此只能取個範圍值。
註2:3組*9顆硬碟=共27顆硬碟,沒錯少一顆硬碟沒用上。
註3:raid0無法分組別,也無資料保護,因此實務上不太會這樣用,在此是純測速用
註4:mirror 14組*2顆 它的速度接近raid0了,至於1組mirror裡面超過兩顆以上的硬碟其實意義不大,讀寫效能都很差。

心得:之前看到這個官方建議,單一個vdev不要超過9個硬碟,經我實測的結果,發現這個建議好象沒有什麼用,超過9個硬碟的效能一樣好,沒有太大效能損失。若你不需要那麼多的儲存空間的話,而又需要資料有比較安全的保護,會推薦你使用 mirror 14組*2顆 這樣子的組合,效能接近 raid0 ,若比較需要多一點儲存空間的話,那會建議你使用 raidz2 2組*14顆 這樣的組合。

至於raidz1 (同raid5),若你的資料很重要的話,不管是哪樣的組合都不推薦你使用,雖然它的效能跟可用空間看來都不錯,但因為它只允許一顆硬碟壞掉,這很危險。在實際使用上,我們的硬碟大多都是同一時期買進的,當用了一段時間之後,出現第一顆硬碟故障時,也差不多是其它硬碟要到壽了,此時你將一顆新硬碟替換上去時,其它的硬碟為了要同步資料,就開始被狂操,而那些快到壽的硬碟很有可能就被你操掛了,因此在第一顆新硬碟還未同步完,就又出現第二顆硬碟故障,那你整個raid的資料就會死掉。而在 zfs raidz1 裡,不管是兩組raidz1或是4組 raidz1 只要其中一組 raidz1 同時壞兩顆硬碟,那你整個儲存池(pool)會被退出。


上述的測試報告,有網友提醒我有效能不足的問題,因此我又做了不同的測試

 

 

mdadm raid0 測試

我擔心有可能是zfs效能不足的問題,因此我把 zfs 毀了,改用 mdadm 來建 raid0 測試

mdadm建raid0指令和測試指令參考:

 

底下是 mdadm raid0的測試報告

硬碟數量 28顆 13顆 8顆 4顆
寫入速度 1.3GB/s 976 MB/s 919 MB/s 876 MB/s

 

 

注意上面的硬碟數,從最少的看起4顆就有876MB/s,但可不是隨著硬碟越多,速度就會跟著往上升...跟什麼因素有關,目前我不清楚。

網友提醒我 zfs pool 預設的 record size 是 128kb,可參閱此頁。建議我的dd測試指令可改用128kb來測試看看。
1kb=1024bytes
128kb → 1024*128 = 131072 bytes
256kb → 1024*256 = 262144 bytes 因此我們的測試指令改為
寫入測試指令
dd if=/dev/zero of=/vic2/file.out bs=131072 count=40000 &
上面的bs=131072 可簡寫成 bs=128k
讀取測試指令
dd if=/vic2/file.out if=/dev/zero bs=131072 &

測出來的寫入速度
raid0 有達到最高3GB/s
mirror 2顆*14組 達 2.5GB/s
但是讀取速度就少的可憐了,都只有11MB/s
由於效能最好的raid0跟mirror測出來的讀取速都只有11MB/s這麼低,因此就不多做其它組合的測試了,意義不大。

測試結論

 

使用dd 指定 bs=128k 的方式來測寫入速度,請參考下圖

上圖是使用此指令 zpool iostat vic2 -v 1 來看的。
3.5" HDD 7200轉的傳輸速率在 65~115MB/s 之間,上圖的每顆單碟的速度都接近100MB/s了,這個128k的寫入測試,可說是把單碟的最高效能給逼出來了。
2.64GB/s 這數字是浮動的,我看到最高達 3GB/s ,總共28顆硬碟,也就是說單碟速度有超過 100MB/s。
此測試報告主要是要確認此台主機硬體的架構沒有問題即可,之前我擔心是否SAS卡或背板(expander)頻寬有效能不足的問題,經此測試確認了沒有效能不足的問題之後,就可安心使用了。美超微有針對我這台機器提供了測試報告給我,我這台機器背板的頻寬上限是6GB/s 他的測試是大約在25顆左右的硬碟數量即達此極限。

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

5-2 查看已建立的新硬碟

  1. 查看系統中硬碟的數量
    ~ # ls -alF /dev/sd*


     
  2. 在這裡可以見到 /dev/sdb 和 /dev/sdc 兩顆尚未使用的硬碟
    ~# ls -alF /dev/disk/by-id/


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

5-3 認識 zfs格式化 指令

  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

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

5-4 單一硬碟

  1. 將單一硬碟格式化為 ZFS 格式
    ~ # zpool create -f -o ashift=12 zfspool   /dev/sdb
    ~ # zpool create -f -o ashift=12 zfspool2 /dev/sdc

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

5-5 以 ZFS 製作 ZFS Raid0

  1. 需求:最少1顆以上硬碟
    將2硬碟格式化為 ZFS 格式,並合併為一個  zfs  pool
    資料會平均分配寫入各顆硬碟,若其中一顆硬碟毀損,全部的資料也將會一起毀損。
    優點則是寫入速度快

     
  2. 指令:
    ~ # zpool create -f -o ashift=12   zfsraid0   /dev/sdb /dev/sdc



     
  3. 同理,若要把N顆硬碟合併為一個 zfs pool ,在指令列的後方將硬碟的代號依序指定即可。
    ~ # zpool create -f -o ashift=12   zfsraid0   /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg  \
    /dev/sdh  /dev/sdi /dev/sdj /dev/sdk /dev/sdl /dev/sdm /dev/sdn /dev/sdo /dev/sdp /dev/sdq

     
  4. 優點:寫入與讀取會將資料分散在各顆硬碟上,讀取與寫入速度非常快。
    缺點:當其中一顆硬碟損壞時幾乎等於這個 Raid0 陣列上的資料全數毀損。

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

5-6 以 ZFS 製作 ZFS Raid1

  1. 需求:最少2顆以上硬碟
    建立 Raid1(1+1=1) Mirror 格式,
    資料會同時寫入兩棵 HD。(這是最佳建議方式,安全性也較高)

     
  2. 指令:
    ~ # zpool create -f -o ashift=12   zfsraid1  mirror   /dev/sdb /dev/sdc


     
  3. 同理,若要把N顆硬碟建立為一個 zfs Raid1 ,在指令列的後方將硬碟的代號依序指定即可。
    指令:
    ~ # zpool create -f -o ashift=12   zfsraid1  mirror   /dev/sdb /dev/sdc  /dev/sdd /dev/sde \
    /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk /dev/sdl /dev/sdm /dev/sdn
    成功建立 zfs Raid1 後,這個 zfsraid1 的 pool 裡面的每一顆硬碟裡的內容是完全一模一樣的。

     
  4. 若開機硬碟是以 ZFS Raid1 建立的,那麼,每一顆硬碟單獨接上時都能開機。

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

5-7 作業

  1. 將兩顆8G的虛擬硬碟分別製作成 ZFS raid0 檔案系統並分別掛載於 /zfs , /backup目錄上。
    並分別於 /zfs , /backup 底下建立一個 samba 的資料集(dataset),並且啟用 即時壓縮功能(gzip)
    過程:

    <<參考步驟>>

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

5-7-1 作業過程

  1. 將原來的儲存池缷載
    root@debian8:/# zpool export pool1

     
  2. 製作 zfs 檔案系統
    1. 將其中一顆虛擬硬碟以 zfs raid0掛載至/zfs , 並在其下建立一個 samba 的 資料集(dataset)
      root@debian8:/# zpool create -o ashift=12 zfs sdb
      invalid vdev specification
      use '-f' to override the following errors:

      /dev/sdb is part of exported pool 'zfs'


      (註:/dev/sdb 已經有 pool1 的 儲存池,請使用 -f 參數強制複寫)

      root@debian8:/# zpool create -o ashift=12 zfs sdb -f   <-----注意,後面加上 -f 強制參數
      root@debian8:/# zfs create zfs/samba                        <-----建立 samba 資料集
      root@debian8:/# zfs set compression=gzip zfs/samba <-----啟用 gzip 壓縮
      root@debian8:/# df -h
      檔案系統        容量  已用  可用 已用% 掛載點
      /dev/sda1       1.9G  1.1G  679M   61% /
      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
      zfs             7.9G  112K  7.9G    1% /zfs
      zfs/samba       7.9G  112K  7.9G    1% /zfs/samba

      root@debian8:/# zfs get all zfs/samba|grep com
      zfs/samba  compressratio         1.00x                    -
      zfs/samba  compression           gzip                     local

       
    2. 將另一顆虛擬硬碟 /dev/sdc 按照上一步驟操做,掛載目錄為 bakup
      root@debian8:/# zpool create -o ashift=12 backup sdc
      invalid vdev specification
      use '-f' to override the following errors:
      /dev/sdc is part of exported pool 'pool1'
      root@debian8:/# zpool create -o ashift=12 backup sdc -f
      root@debian8:/# zfs create backup/samba
      root@debian8:/# zfs set compression=gzip backup/samba
      root@debian8:/# df -h
      檔案系統        容量  已用  可用 已用% 掛載點
      /dev/sda1       1.9G  1.1G  679M   61% /
      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
      zfs             7.9G  120K  7.9G    1% /zfs
      zfs/samba       7.9G  112K  7.9G    1% /zfs/samba
      backup          7.9G  120K  7.9G    1% /backup
      backup/samba    7.9G  112K  7.9G    1% /backup/samba

      root@debian8:/# zfs get all backup/samba|grep com
      backup/samba  compressratio         1.00x                    -
      backup/samba  compression           gzip                     local

       

 

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

6. samba 目錄+zfs 檔案系統

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

6-1 將 samba 的 分享目錄移至 zfs 硬碟上

  1. 將 原來 /home/samba/ 底下的所有目錄和檔案同步到 /zfs/samba/
    root@debian8:/# rsync -avP /home/samba/ /zfs/samba/
    sending incremental file list
    ./
    01-教導處/
    01-教導處/01-教務主任/
    01-教導處/02-教務組長/
    01-教導處/03-設備組長/
    01-教導處/04-訓導組長/

    sent 285 bytes  received 39 bytes  648.00 bytes/sec
    total size is 0  speedup is 0.00
    root@debian8:/#


     

  2. 修改 /etc/samba/smb.conf 的分享路徑 到 /samba
    root@debian8:/# pico /etc/samba/smb.conf
    [行政辦公]
            comment         =       行政辦公
            path                =       /home/samba       
    改為
    [行政辦公]
            comment         =       行政辦公
            path                =       /zfs/samba

    再按 Ctrl+O   , Enter   存檔, Ctrl + X 退出編輯器
     

  3. 重新啟動 samba 服務
    root@debian8:/# service smbd restart

    root@debian8:/# service smbd reload

    使用 testparm 查看參數

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

6-2 zfs 快照與回復

  1. zfs快照指令
    1. 建檔案系統快照
      zfs snapshot 儲存池名稱@註解
      zfs snapshot zfs@snapshot
      zfs snapshot zfs/samba@snapshot

      實作:
      root@debian8:/# zfs snapshot zfs/samba@2017-07-05
      root@debian8:/# zfs list -t snapshot
      NAME                   USED  AVAIL  REFER  MOUNTPOINT
      zfs/samba@2017-07-05      0      -   112K  -


       
    2. zfs snapshot zfs/samba@GMT-`date -u +%Y.%m.%d-%H.%M.%S`
      實作:
      root@debian8:/# zfs snapshot zfs/samba@GMT-`date -u +%Y.%m.%d-%H.%M.%S`
      root@debian8:/# zfs list -t snapshot
      NAME                                USED  AVAIL  REFER  MOUNTPOINT
      zfs/samba@GMT-2017.07.03-08.19.06      0      -   112K  -


       
    3. 建快照含底下所有的子目錄都同步建立快照
      zfs snapshot -r zfs@GMT-`date -u +%Y.%m.%d-%H.%M.%S`
      實作:
      root@debian8:/# zfs snapshot -r zfs@GMT-`date -u +%Y.%m.%d-%H.%M.%S`
      root@debian8:/# zfs list -t snapshot
      NAME                                USED  AVAIL  REFER  MOUNTPOINT
      zfs@GMT-2017.07.03-08.20.21            0      -   120K  -
      zfs/samba@GMT-2017.07.03-08.20.21      0      -   112K  -



       
    4. 列出現有的檔案系統快照
      zfs list -t snapshot


       
    5. 回存快照(回到過去)
      我們可以完全回覆到某一個時間點所做的快照副本(就像大雄的時光機一樣).
      zfs rollback -r zfs/samba@20141226
      1. zfs snapshot zfs/samba@GMT-`date -u +%Y.%m.%d-%H.%M.%S`
      2. 透過網路芳鄰將檔案存入 行政辦公\01-教導處\01-教務主任\  目錄中
      3. zfs snapshot zfs/samba@GMT-`date -u +%Y.%m.%d-%H.%M.%S`
      4. 行政辦公\01-教導處\01-教務主任\  目錄中 的檔案刪除
      5. 以 zfs rollback -r zfs/samba@步驟3 的快照
        查閱剛剛刪除的檔案是否回復
      6. 以 zfs rollback -r zfs/samba@步驟1 的快照
        查閱剛剛回復出現的檔案是否又不見了。

         

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

6-3 zfs 分割區 直接複製備份 (Replication)

  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 sendzfs 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 sendzfs 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  -

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

6-4 不同主機間 dataset 複製

步驟:

  1. 製作快照:將要傳送的資料池(dataset, 相當於分割區的概念)製作快照
  2. 將製作的快照傳送到另一台主機(pve)

實作:

  1. 將虛擬機 的 dataset zfs/samba 先建立快照
    root@debian8:~# zfs snapshot -r zfs/samba@GMT-`date -u +%Y.%m.%d-%H.%M.%S`
    root@debian8:~# zfs list -t snapshot
    NAME                                USED  AVAIL  REFER  MOUNTPOINT
    zfs/samba@GMT-2017.07.04-13.45.57      0      -   152K  -
    root@debian8:~#
  2. 將虛擬機 的 dataset zfs/samba 建立的快照 zfs/samba@GMT-2017.07.04-13.45.57
    透過網路 以zfs 複製/備份 到
    另一台主機 pve 的 backup/samba dataset

    來源:本  機
    zfs dataset:zfs/samba@GMT-2017.07.04-13.45.57
    目的:遠端主機 pve (或 主機pve的ip 192.168.200.12)
    zfs dataset:backup/samba

    開始傳送
    # zfs send zfs/samba@GMT-2017.07.04-13.45.57 | ssh pve zfs receive backup/samba

    # zfs send zfs/samba@GMT-2017.07.04-13.45.57 | ssh 192.168.200.12 zfs receive backup/samba

    說明:
    1. 1.zfs     zfs檔案系統提供的處理指令
    2. @GMT-2017.07.04-13.45.57 dataset 因為還掛載於系統上(使用中),所以先製作快照,zfs會將這個dataset 的時間點快照複製到遠端主機,這樣才不會影響到系統對這個dataset的讀寫
    3. send 傳送
    4. ssh pve 透過ssh 連線到 主機 pve 或 主機的ip
    5. receive 接收
    6. 若遠端主機(接收方)的目的 dataset (backup/samba)原本不存在,zfs會自動建立。
    7. 但遠端目的dataset文件系統若已經存在,為避免將遠端覆蓋zfs會自動停止傳送,可加上 -F 參數強制 覆蓋.
      # zfs send zfs/samba@GMT-2017.07.04-13.45.57 | ssh pve zfs receive backup/samba  -F


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

6-4-1 本機對本機實做

  1. 先查詢目前已建立的 snapshot
    1. root@debian8:~# zfs list -t snapshot
      NAME                                   USED  AVAIL  REFER  MOUNTPOINT
      backup/samba@GMT-2017.07.04-13.45.57    80K      -   152K  -
      zfs/samba@GMT-2017.07.04-13.45.57       80K      -   152K  -

       
    2. 將 zfs/samba 及 backup/samba 所有的快照刪除
      root@debian8:~# zfs destroy backup/samba@GMT-2017.07.04-13.45.57
      root@debian8:~# zfs destroy zfs/samba@GMT-2017.07.04-13.45.57

       
  2. 製作快照:將要傳送的資料池(dataset, 相當於分割區的概念)製作快照
    1. root@debian8:~# zfs snapshot -r zfs/samba@GMT-`date -u +%Y.%m.%d-%H.%M.%S`
      root@debian8:~# zfs list -t snapshot
      NAME                                USED  AVAIL  REFER  MOUNTPOINT
      zfs/samba@GMT-2017.07.04-14.25.00      0      -   152K  -

       
    2. 查看目前 /zfs/samba 底下的目錄及檔案

      root@debian8:~# tree /zfs/samba/
      /zfs/samba/
      └── 01-教導處
          ├── 01-教務主任
          ├── 02-教務組長
          ├── 03-設備組長
          └── 04-訓導組長

      5 directories, 0 files

  3. 將 /backup/samba 目錄底下清空
    root@debian8:~# rm /backup/samba/* -rf
    root@debian8:~# ls -alF /backup/samba/
    總計 17
    drwxr-xr-x 2 root root 2  7月  4 22:29 ./
    drwxr-xr-x 4 root root 5  7月  4 21:55 ../

     

  4. 將 dataset zfs/samba 建立的快照 zfs/samba@GMT-2017.07.04-14.25.00
    透過網路 以zfs 複製/備份 到
    另一台主機 "(現在以本機 localhost 來模擬操作) 的 backup/samba dataset

    root@debian8:~# zfs send zfs/samba@GMT-2017.07.04-14.25.00 | ssh localhost zfs receive backup/samba
    The authenticity of host 'localhost (::1)' can't be established.
    ECDSA key fingerprint is 68:82:38:50:e1:f7:44:67:2c:8a:48:bf:b5:c5:ba:c5.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
    root@localhost's password:
    cannot receive new filesystem stream: destination 'backup/samba' exists
    must specify -F to overwrite it
    root@debian8:~# zfs send zfs/samba@GMT-2017.07.04-14.25.00 | ssh localhost zfs receive backup/samba -F
    root@localhost's password:
    cannot receive new filesystem stream: I/O error

     

  5.  

    查看目前 /backup/samba 底下的目錄及檔案

    /backup/samba/
    └── 01-教導處
        ├── 01-教務主任
        ├── 02-教務組長
        ├── 03-設備組長
        └── 04-訓導組長

    5 directories, 0 files
     

  6. 查看目前的快照(快照也會同時複製到遠端)
    root@debian8:~# zfs list -t snapshot
    NAME                                   USED  AVAIL  REFER  MOUNTPOINT
    backup/samba@GMT-2017.07.04-14.25.00    80K      -   152K  -
    zfs/samba@GMT-2017.07.04-14.25.00       80K      -   152K  -

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

6-5 差異性備份(增量複製)

  1. 重點:
    1. 將快照 zfs/samba@1 到 zfs/samba@2 之間的差異 傳送到遠端主機
    2. 從原始快照傳送增量串流以建立複製。接收端必須存有原始快照,才能接受增量串流。
       
  2. 建立兩邊預設同步的快照
     
    1. 先建立 zfs/samba 快照
      root@debian8:~# zfs snapshot zfs/samba@1

       
    2. 將 zfs/samba@1 傳送到遠端主機的  bacupd/samba dataset
      root@debian8:~# zfs send     zfs/samba@1 | ssh localhost      zfs receive      backup/samba -F
      root@localhost's password:    <------這裡輸入遠端主機的密碼
      cannot receive new filesystem stream: I/O error

       
    3. 現在兩邊主機的 dataset 目前已同步
      root@debian8:~# zfs list -t snapshot

      NAME             USED  AVAIL  REFER  MOUNTPOINT
      backup/samba@1      0      -   152K  -
      zfs/samba@1         0      -   152K  -


       

  3. 來源端增量
     

    1. 在 /zfs/samba/ dataset 下增加檔案/目錄
      root@debian8:~# cd /zfs/samba/

    2. 將 /var/ 目錄複製到 /zfs/samba/ 底下
      root@debian8:/zfs/samba# rsync -avP      /var/     /zfs/samba/var/

      root@debian8:/zfs/samba# ls -alF
      總計 34
      drwxr-xr-x  4 root root  4  7月  4 23:17 ./
      drwxr-xr-x  4 root root  4  7月  3 22:22 ../
      drwxr-xr-x  6 root root  6  7月  1 10:10 01-教導處/
      drwxr-xr-x 11 root root 13  6月 13 14:04 var/

       

    3. 目錄容量明顯增加
      root@debian8:/zfs/samba# du -d1 -h
      43K    ./01-教導處
      145M    ./var
      145M


       

  4. /zfs/samba/ 檔案及目錄增加或修改過後

    1. 製作第2次快照
      root@debian8:/zfs/samba# zfs snapshot zfs/samba@2

       

    2. 目前快照
      root@debian8:/zfs/samba# zfs list -t snapshot
      NAME             USED  AVAIL  REFER  MOUNTPOINT
      backup/samba@1      0      -   152K  -
      zfs/samba@1       96K      -   152K  -
      zfs/samba@2         0      -   144M  -

       

  5. 將增量的部份傳送到遠端主機

    1. 使用 參數 -I (大寫的 i ) 來傳送增量快照
      ~# zfs send -I zfs/samba@1 zfs/samba@2 | ssh localhost zfs receive backup/samba -F
      root@localhost's password:     <-----這裡輸入遠端主機密碼
      root@debian8:/zfs/samba#

       

    2. 目前快照,可以發現本端主機與遠端主機的快照也同步了
      root@debian8:/zfs/samba# zfs list -t snapshot
      NAME             USED  AVAIL  REFER  MOUNTPOINT
      backup/samba@1    96K      -   152K  -
      backup/samba@2      0      -   144M  -
      zfs/samba@1       96K      -   152K  -
      zfs/samba@2       88K      -   144M  -


       

  6. 使用增量快照的方式,在資料的傳輸上要比傳統使用 rsync 的方式所需要傳輸的資料少,時間上也較節省。若有一個10G的大檔案變更檔名,以rsync的方式來同步時,就必須重新傳送10G的資料量,而以zfs快照增量的方式,僅僅只需要傳送「變更檔名」的改變。
    而且,zfs還提供本機與遠端每一次變更的快照。


     

  7. 參考資料
    http://docs.oracle.com/cd/E19253-01/819-0362/ghgfx/index.html

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

6-6 rollback 快照時光機

  1. 製作快照
    zfs snapshot zfs@1

  2. 在 /zfs 上新增檔案、目錄
    rsync -avP /usr/   /zfs/usr/

    再次 /zfs 上新增檔案、目錄
    rsync -avP /var/   /zfs/var/

     
  3. 製作快照
    zfs snapshot zfs@2

     
  4. 刪除 /zfs/usr/ 目錄
    rm /zfs/usr/ -rf
    ls -alF /zfs/


    zfs rollback zfs@2
    ls -alF

     
  5. 刪除 /zfs/var/ 目錄
    rm /zfs/var/ -rf
    ls -alF /zfs/


    zfs rollback zfs@2
    ls -alF

     
  6. 刪除 /zfs/ 目錄下所有目錄、檔案
    rm /zfs/*    -rf
    ls -alF /zfs/FA


    zfs rollback zfs@2
    ls -alF

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

6-7 從快照中還原個別檔案或目錄

  1. 查詢目前主機上的 zfs pool
    ~# zpool list
    ~# zfs list


    可以找到目錄有一個 zfs pool ,名稱為 pool2T
    ~# df -h


     
  2. 將 pool2T 的隱藏快照目錄顯示開啟
    1. 取得目錄 pool2T 的 snapdir 值
      ~#    zfs get snapdir             pool2T
    2. 將 snapdir 設定為 visible 
      ~#    zfs set snapdir=visible pool2T
    3. /pool2T 目錄底下將會出現 .zfs 這個目錄


       
    4. 快照檔案目錄的存取
      1. 連入 pool2T 目錄下的 .zfs 目錄
        ~#  cd /pool2T/.zfs
        ~#  ls -alF

         
      2. 快照的檔案全部放在 .zfs 目錄下的 snapshot/ 目錄裡
        ~#  cd snapshot
        ~# ls


         
      3. 接著再進入依時間建立的快照目錄(目錄名稱就是建立快照時 @ 後面的字元),依需要分別將快照目錄下的檔案複製出來即可。
         
  3. 關閉快照目錄顯示
    ~#  zfs set snapdir=hidden pool2T
    ~#  cd /pool2T
    ~#  ls -alF
    我們可以發現 .zfs 目錄已經被隱藏起來了。


     
  4. 注意事項
    1. 當對 儲存池 (pool)設定開啟或關閉時,底下的資料集(dataset)會同步開啟或關閉快照目錄的顯示。
    2. 若曾對該儲存池底下的資料集做個別的快照目錄開啟或關閉,那麼下次再由最上層的儲存池做快照目錄開啟或關閉變更時,底下曾單獨變更過的資料集就不會與儲存池同步開啟或關閉。

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

6-7-1 從快照還原個別檔案-原理

https://www.freebsd.org/doc/zh_TW/books/handbook/zfs-zfs.html

快照會掛載在父資料集下的隱藏目錄:.zfs/snapshots/snapshotname。預設不會顯示這些目錄,即使是用 ls -a 指令。雖然該目錄不會顯示,但該目錄實際存在,而且可以像一般的目錄一樣存取。一個名稱為 snapdir 的屬性可以控制是否在目錄清單中顯示這些隱藏目錄,設定該屬性為可見 (visible) 可以讓這些目錄出現在 ls 以及其他處理目錄內容的指令中。

# zfs get snapdir mypool/var/tmp
NAME            PROPERTY  VALUE    SOURCE
mypool/var/tmp  snapdir   hidden   default
% ls -a /var/tmp
.               ..              passwd          vi.recover
# zfs set snapdir=visible mypool/var/tmp
% ls -a /var/tmp
.               ..              .zfs            passwd          vi.recover

要還原個別檔案到先前的狀態非常簡單,只要從快照中複製檔案到父資料集。在 .zfs/snapshot 目錄結構下有一個與先前所做的快照名稱相同的目錄,可以很容易的找到。在下個範例中,我們會示範從隱藏的 .zfs 目錄還原一個檔案,透過從含有該檔案的最新版快照複製:

# rm /var/tmp/passwd
% ls -a /var/tmp
.               ..              .zfs            vi.recover
# ls /var/tmp/.zfs/snapshot
after_cp                my_recursive_snapshot
# ls /var/tmp/.zfs/snapshot/after_cp
passwd          vi.recover
# cp /var/tmp/.zfs/snapshot/after_cp/passwd /var/tmp

執行 ls .zfs/snapshot 時,雖然 snapdir 可能已經設為隱藏,但仍可能可以顯示該目錄中的內容,這取決於管理者是否要顯示這些目錄,可以只顯示特定的資料集,而其他的則不顯示。從這個隱藏的 .zfs/snapshot 複製檔案或目錄非常簡單,除此之外,嘗試其他的動作則會出現以下錯誤:

# cp /etc/rc.conf /var/tmp/.zfs/snapshot/after_cp/
cp: /var/tmp/.zfs/snapshot/after_cp/rc.conf: Read-only file system

這個錯誤用來提醒使用者快照是唯讀的,在建立之後不能更改。無法複製檔案進去或從該快照目錄中移除,因為這會變更該資料集所代表的狀態。

快照所消耗的空間是依據自快照之後父檔案系統做了多少變更來決定,快照的 written 屬性可以用來追蹤有多少空間被快照所使用。

使用 zfs destroy dataset@snapshot 可以摧毀快照並回收空間。加上 -r 可以遞迴移除所有在父資料集下使用同名的快照。加入 -n -v 來顯示將要移除的快照清單以及估計回收的空間,而不會實際執行摧毀的操作。

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

6-8 刷洗 scrub (linux的 fsck)

  1. scrub(刷洗):
    相對於傳統 unix 檔案系統的 fsck,ZFS 稱之為 scrub。
    若使用 scrub,ZFS 會去檢查儲存資料的確認索引值並修正有誤的


     
  2. 指令
    1. zpool scrub  poolname
      ~#  zpool scrub pool2T

       
    2. ~# zpool status
      1. UBUNTU 16.04的畫面

         
      2. Debian 主機的 scrub 過程
        1. 剛執行

           
        2. 執行3個多小時後,在720G的容量裡已scrub 337G,進度已達46.88%,預估還需3小時45分

           
    3. 參考:
      http://ithelp.ithome.com.tw/articles/10057507

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

7. 參考文件

  1. 劉亦士 2016/07/19 自由軟體 Linux 檔案伺服器管理研習
  2. Linux 帳號與身份管理
    http://linux.vbird.org/linux_basic/0410accountmanager/0410accountmanager-fc4.php
  3. SAMBA+ZFS
    http://note.zn2.us/zfs.htm
  4. 楊金龍 ZFS-RAID
    http://note.zn2.us/zfs-raid.htm
  5. ZFS 特色與術語
    https://www.freebsd.org/doc/zh_TW.UTF-8/books/handbook/zfs-term.html

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

7-1 VirtualBox 虛擬機使用 實體硬碟

http://www.gienginali.idv.tw/modules/tad_book3/page.php?tbdsn=48

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

7-2 Proxmox Physical disk to kvm (KVM 虛擬機直接使用實體硬碟)

http://www.gienginali.idv.tw/modules/tad_book3/page.php?tbdsn=574

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

7-3 How To Create A NAS Using ZFS and Proxmox (with pictures)

How To Create A NAS Using ZFS and Proxmox (with pictures)

https://forum.level1techs.com/t/how-to-create-a-nas-using-zfs-and-proxmox-with-pictures/117375

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

7-4 zfs 入門與管理技術

作者:夢見草
http://note.zn2.us/zfs.htm