2015年10月21日 星期三

ZFS NAS V2 - 使用OmniOS實做:(1) 建立、轉移、整理


    ZFS NAS V2 - 使用OmniOS實做:(1) 建立、轉移、整理

  1. 前言


    • 因為原本使用NexentaCore已經不再更新,所以在簡單測試後選擇了OmniOS
      OmniOS使用繼承了OpenSolaris的Illumos核心,保留了整合在核心的CIFS分享,和理論上最高效率的ZFS核心,同時因為主要為server用途,沒有不必要的桌面環境。


      安裝OmniOS的過程這裡這裡就直接省略。



  2. OmniOS安裝後基本設定

    • 首先是設定網路好方便用putty遠端登入操作
      OmniOS預設的root帳號沒有密碼
      列出可用的網路介面
      # dladm show-phys
      

      把其中一個e1000g0界面建立起來,連上ADSL router,當對外界面
      # ipadm create-if e1000g0
      

      使用DHCP模式 create-addr設定位址 -T dhcp代表使用DHCP模式 e1000g0/v4設定介面使用ip v4
      # ipadm create-addr -T dhcp e1000g0/v4
      

      假如使用靜態IP (IP不會因為DHCP變動,方便網域內PC遠端登入設定)
      create-addr設定位址
      -T static代表使用靜態IP模式
      -a 192.168.1.192/24指定IP(選一個ADSL router DHCP不會重複的IP)
      e1000g0/v4static設定介面使用靜態IP v4
      # ipadm create-addr -T static -a 192.168.1.192/24 e1000g0/v4static
      

      把第二個e1000g1界面建立起來,當對內NAS界面
      # ipadm create-if e1000g1
      

      對內使用靜態ip
      # ipadm create-addr -T static -a 192.168.0.192/24 e1000g1/v4static
      

      檢查設定完成的網路介面
      # ipadm show-addr
      

      要修改ip模式,可以用下列指令把建立的ip消除,再重新建立
      # ipadm delete-addr e1000g0/V4static
      

      使用靜態ip又要對外連線
      就要設定路由表,設定預設路由指向ADSL分享器
      # route -p add default 192.168.1.1
      

      檢查路由
      # netstat -rn -finet
      
      Routing Table: IPv4
        Destination           Gateway           Flags  Ref     Use     Interface
      -------------------- -------------------- ----- ----- ---------- ---------
      default              192.168.1.1          UG        1          0
      127.0.0.1            127.0.0.1            UH        2          0 lo0
      192.168.1.0          192.168.1.109        U         4       2295 e1000g0
      

      以及設定DNS指向ADSL分享器
      # echo 'nameserver 192.168.1.1' >> /etc/resolv.conf
      

      下兩行來自OmniOS安裝指示,看不懂直接照做
      # cp /etc/nsswitch.conf{,.bak}
      # cp /etc/nsswitch.{dns,conf}
      

      準備遠端登入帳號 首先把root加上密碼
      # passwd root
      

      增加遠端登入的admin帳號
      # useradd admin
      # passwd admin
      

      用putty連線操作,先用admin登入,再用su指令取得root權限,剩下就都在遠端登入下操作了。


  3. 預先規劃
    • ZFS NAS V2的CIFS分享結構

      這次簡化一些,把私人資料夾和一般收藏分成兩個ZFS檔案系統。
      用不同的帳號Razgriz是為了平時的主帳號LouisZZZ不要去意外修改到不必要的部份。

      private
      私人資料,分享的第一組ZFS檔案系統,平常掛成網路硬碟。
      擁有者LouisZZZ完整讀寫,群組xd維讀,所有人預設禁止,ACL增加admin完整權限。

      storage
      儲存,分享的第一組ZFS檔案系統,平常掛成網路硬碟。
      擁有者Razgriz完整讀寫,群組xd維讀,所有人預設唯讀,ACL增加admin完整權限。


  4. 建立zpool和設定zfs檔案系統
    • 建立zpool
      列出硬碟,利用format指令,列出後用ctrl+c取消。
      # format
      Searching for disks...done
      
      
      AVAILABLE DISK SELECTIONS:
             0. c1t5000C50030A0EC7Cd0 
                /scsi_vhci/disk@g5000c50030a0ec7c
             1. c1t5000C50030BBA036d0 
                /scsi_vhci/disk@g5000c50030bba036
             2. c1t5000C50030D6904Fd0 
                /scsi_vhci/disk@g5000c50030d6904f
             3. c1t5000CCA22ECB0CDDd0 
                /scsi_vhci/disk@g5000cca22ecb0cdd
             4. c1t5000CCA22ECB0D56d0 
                /scsi_vhci/disk@g5000cca22ecb0d56
             5. c1t5000CCA22ECB1F14d0 
                /scsi_vhci/disk@g5000cca22ecb1f14
             6. c1t5000CCA22ECBB515d0 
                /scsi_vhci/disk@g5000cca22ecbb515
             7. c1t5000CCA222DBC3C1d0 
                /scsi_vhci/disk@g5000cca222dbc3c1
             8. c3t0d0 
                /pci@0,0/pci1043,8497@1f,2/disk@0,0
      

      建立raidz1的v2-raidz,使用raidz1來達成至少一顆硬碟的容錯,同時保有最大的有效容量。
      # zpool create v2-raidz raidz c1t5000CCA22ECB0CDDd0 c1t5000CCA22ECB0D56d0 c1t5000CCA22ECB1F14d0 c1t5000CCA22ECBB515d
      

      檢查建立後的zpool狀況,確認有無異常。
      # zpool status v2-raidz
        pool: v2-raidz
       state: ONLINE
        scan: none requested
      config:
      
              NAME                       STATE     READ WRITE CKSUM
              v2-raidz                   ONLINE       0     0     0
                raidz1-0                 ONLINE       0     0     0
                  c1t5000CCA22ECB0CDDd0  ONLINE       0     0     0
                  c1t5000CCA22ECB0D56d0  ONLINE       0     0     0
                  c1t5000CCA22ECB1F14d0  ONLINE       0     0     0
                  c1t5000CCA22ECBB515d0  ONLINE       0     0     0
      
      errors: No known data errors
      

      檢查zpool的容量,這裡列出的是硬碟的純粹容量,並不考慮raidz1,所以是顯示7.25T
      # zpool list v2-raidz
      NAME       SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
      v2-raidz  14.5T   576K  14.5T         -     0%     0%  1.00x  ONLINE  -
      

      檢查zfs檔案系統下的容量,就是顯示raidz1及檔案系統設定下的有效容量。
      # zfs list v2-raidz
      NAME       USED  AVAIL  REFER  MOUNTPOINT
      v2-raidz   349K  10.2T   140K  /v2-raidz
      

      建立準備分享的檔案系統
      有幾項參數必須在建立檔案系統時就一起設定,建立之後就無法修改。
      casesensitivity=mixed 混合式大小寫,配合windows的習慣。
      nbmand=on 配合檔案系統同時作NFS和CIFS分享,使用的interlock模式。
      utf8only=on 檔案名稱只接受utf8的unicode編碼,不使用ansi編碼。每個參數前面都須要加上-o。
      # zfs create -o casesensitivity=mixed -o nbmand=on -o utf8only=on v2-raidz/storage
      # zfs create -o casesensitivity=mixed -o nbmand=on -o utf8only=on v2-raidz/private
      

      檢查建立起來的檔案系統。
      # zfs list
      NAME                         USED  AVAIL  REFER  MOUNTPOINT
      v2-raidz                     680K  10.2T   140K  /v2-raidz
      v2-raidz/private             140K  10.2T   140K  /v2-raidz/private
      v2-raidz/storage             140K  10.2T   140K  /v2-raidz/storage
      


  5. 建立帳號、CIFS分享和ACL權限設定
    • 建立帳號
      建立CIFS密碼,使用vi編輯/etc/pam.conf加入底下這一行
      other password required pam_smb_passwd.so.1 nowarn
      # echo 'other   password required       pam_smb_passwd.so.1 nowarn' >> /etc/pam.conf
      

      重新設定root密碼
      # passwd root
      

      以下根據預先完成的規劃進行 建立群組xd
      # groupadd xd
      

      建立使用者LouisZZZ屬於群組 xd
      # useradd -g xd LouisZZZ
      

      設定LouisZZZ的密碼
      # passwd LouisZZZ
      New Password:
      Re-enter new Password:
      passwd: password successfully changed for LouisZZZ
      

      建立使用者Razgriz屬於群組 xd
      # useradd -g xd Razgriz
      

      設定Razgriz的密碼
      # passwd Razgriz
      New Password:
      Re-enter new Password:
      passwd: password successfully changed for Razgriz
      

      開始設定CIFS分享 確認啟動OmniOS核心的相關CIFS服務


      手動啟動
      # svcadm enable -r smb/server
      

      確認啟動
      # svcs | grep smb
      online         10:00:21 svc:/network/smb/client:default
      online         10:00:21 svc:/network/smb/server:default
      online         10:00:22 svc:/network/shares/group:smb
      

      加入工作群組。
      # smbadm join -w XD-NETWORK
      After joining XD-NETWORK the smb service will be restarted automatically.
      Would you like to continue? [no]: y
      Successfully joined XD-NETWORK
      

      把v2-raidz/private及v2-raidz/storage分別用XD-private和XD-storage名稱設定為CIFS分享
      # zfs set sharesmb=name=XD-private v2-raidz/private
      # zfs set sharesmb=name=XD-storage v2-raidz/storage
      

      檢查目前系統中設定的分享,看分享的路徑和名稱是否正確,還沒有完全弄清楚要怎麼看。
      # sharemgr show -vp
      default nfs=()
      smb smb=()
              * /var/smb/cvol
                        c$=/var/smb/cvol       smb=(abe="false" guestok="false")      "Default Share"
      zfs smb=() nfs=()
          zfs/v2-raidz/private smb=()
                XD-private=/v2-raidz/private
          zfs/v2-raidz/storage smb=()
                XD-storage=/v2-raidz/storage
          zfs/xd-raidz/XD-private nfs=() smb=()
                v1-private=/xd-raidz/XD-private
          zfs/xd-raidz/XD-storage nfs=() smb=()
                v1-storage=/xd-raidz/XD-storage
      

      檢查ACL繼承設定
      把aclinherit設定成passthrough,我只記得設定成後passthrough實驗後符合需求,理由沒有紀錄到。
      # zfs set aclinherit=passthrough v2-raidz
      

      檢查aclinherit的設定值
      # zfs get aclinherit v2-raidz
      NAME         PROPERTY         VALUE         SOURCE
      v2-raidz  aclinherit  passthrough         local
      

      下層的v2-raidz/storage會自動繼承
      # zfs get aclinherit v2-raidz/storage
      NAME         PROPERTY         VALUE         SOURCE
      v2-raidz/storage  aclinherit  passthrough         inherited from v2-raidz
      

      所以v2-raidz/private同樣會自動繼承
      # zfs get aclinherit v2-raidz/private
      NAME         PROPERTY         VALUE         SOURCE
      v2-raidz/private  aclinherit  passthrough         inherited from v2-raidz
      

      設定ACL權限
      預設的read_set會沒辦法展開資料夾,所以只好加上x,變成r-x---a-R-c--s,才能在windows底下展開資料夾。其他的modify_set和full_set都沒有問題。說明是說權限加有r就能展開目錄,但是我試不出來。

      設定owner及group
      /v2-raidz/private設定為擁有者LouisZZZ,群組xd
      # chown -R LouisZZZ:xd /v2-raidz/private
      

      /v2-raidz/storage設定為擁有者Razgriz,群組xd
      # chown -R Razgriz:xd /v2-raidz/storage
      

      /v2-raidz/private的ACL權限設定為
      擁有者讀寫,群組維讀,所有人預設禁止,admin完整權限
      # chmod -R A=\
      owner@:modify_set:fd:allow,\
      group@:r-x---a-R-c--s:fd:allow,\
      everyone@::fd:allow,\
      user:admin:full_set:fd:allow \
      /v2-raidz/private
      

      /v2-raidz/storage的ACL權限設定為
      擁有者讀寫,群組維讀,所有人預設唯讀,admin完整權限
      # chmod -R A=\
      owner@:modify_set:fd:allow,\
      group@:r-x---a-R-c--s:fd:allow,\
      everyone@:r-x---a-R-c--s:fd:allow,\
      user:admin:full_set:fd:allow \
      /v2-raidz/storage
      

      owner和ACL設定,假如沒有要透過其他的電腦從CIFS轉移資料,這部分其實等檔案轉移完再進行。

  6. 安裝rsync作為轉移資料的工具,並進行轉移資料

    • # pkg search rsync
      INDEX       ACTION VALUE                                        PACKAGE
      basename    file   usr/bin/rsync                                pkg:/network/rsync@3.1.1-0.151014
      pkg.descr   set    rsync - faster, flexible replacement for rcp pkg:/network/rsync@3.1.1-0.151014
      pkg.fmri    set    omnios/network/rsync                         pkg:/network/rsync@3.1.1-0.151014
      pkg.summary set    rsync - faster, flexible replacement for rcp pkg:/network/rsync@3.1.1-0.151014
      
      # pkg install rsync

      rsync我用到的幾個參數
      -c 是我個人龜毛,因為是轉移系統,所以加上checksum比較。
      -a 只是方便,舊NAS的權限複製過來也沒有作用,還是必須重設。
      -v 因為要確認進度所以加上去,但是我其實只想知道,刪除掉的檔案紀錄,其他訊息我其實不需要知道。
      -q 安靜模式,略過正常資訊,僅顯示錯誤訊息
      --del 刪除目標多出來的檔案。


      第一輪先做轉移資料
      先跑單純的複製,所以不使用-c的chcksum比較。
      這次把舊ZFS硬碟裝入新NAS,直接rsync進行檔案複製
      # rsync -av /xd-raidz/XD-private/ /v2-raidz/private
      # rsync -av /xd-raidz/XD-storage/ /v2-raidz/storage
      

      複製完成後,建立snapshot避免意外。
      # zfs snapshot v2-raidz/private@20150924
      # zfs snapshot v2-raidz/storage@20150924
      

      列出snapshot確認,確認snapshot有確實建立。
      # zfs list -t snapshot
      NAME                                      USED  AVAIL  REFER  MOUNTPOINT
      rpool/ROOT/omnios-1@install               293M      -  1.59G  -
      rpool/ROOT/omnios-1@2015-09-18-10:47:38   301M      -  1.61G  -
      rpool/ROOT/omnios-1@2015-09-21-14:56:31   311M      -  1.74G  -
      v2-raidz/private@20150924                    0      -  1.51T  -
      v2-raidz/storage@20150924                2.09M      -  2.46T  -
      xd-raidz@20110522-DONE                   31.4K      -  46.4K  -
      xd-raidz@20121118                            0      -  46.4K  -
      xd-raidz/XD-private@20111107             30.2G      -   339G  -
      xd-raidz/XD-private@20120709             1.55M      -   416G  -
      xd-raidz/XD-private@20121118             1.85M      -   504G  -
      xd-raidz/XD-private@20130623              173G      -   677G  -
      xd-raidz/XD-private@20140816              267G      -  1.40T  -
      xd-raidz/XD-storage@20111107              199G      -  2.39T  -
      xd-raidz/XD-storage@20120709             1.12G      -  2.32T  -
      xd-raidz/XD-storage@20121118             7.21G      -  2.41T  -
      xd-raidz/XD-storage@20130623             1.96G      -  2.42T  -
      xd-raidz/XD-storage@20140816             44.4G      -  2.43T  -
      



      第二輪作資料比對
      針對已經複製完成的資料,再做第二輪的checksum比對,所以加上-c 表示使用checksum比較。
      假如第一輪的複製已經中斷過,會留下一些暫存檔案。假如在rsync沒有加上--del的刪除功能,對於目的地多出來的檔案會保留,但是目的是1:1的傳送,那些ctrl-c終止rsync留下來的暫存檔,和其他操作錯誤留下來的檔案都應該刪除。
      所以我用的指令改成。
      # rsync -cav --del /xd-raidz/XD-private/ /v2-raidz/private > /v2-raidz/private.txt
      # rsync -cav --del /xd-raidz/XD-storage/ /v2-raidz/storage > /v2-raidz/storage.txt
      

      用hold把重要的snapshot設定為keep狀態
      最終檢查完成後,確認所有檔案都正確,且更正權限後,除了建立snapshot,再額外用hold把snapshot設定為keep狀態,同樣是避免snapshot被意外修改。
      使用zfs hold指令
      # zfs hold keep v2-raidz/private@20150924
      # zfs hold keep v2-raidz/storage@20150924
      

      使用zfs holds 檢視snapshot 狀態。
      # zfs holds v2-raidz/storage@20150924
      NAME                       TAG   TIMESTAMP
      v2-raidz/storage@20150924  keep  Thu Sep 24 23:37 2015
      

      # zfs holds v2-raidz/private@20150924
      NAME                       TAG   TIMESTAMP
      v2-raidz/private@20150924  keep  Thu Sep 24 23:37 2015
      

沒有留言: