2011年6月2日 星期四

ZFS NAS - 使用NexentaCore實做:(1) 全部在command line底下完成,建立、轉移、整理

ZFS NAS - 使用NexentaCore實做:(1) 全部在command line底下完成,建立、轉移、整理

  1. 前言
    1. 原本是打算使用napp-it來達成ZFS NAS的所有設定,但是為了確定自己使用ZFS NAS時,所需要的所有功能都沒有問題,在測試完需要的功能後,發現大部分需要的指令都用過了,所以就乾脆試試全程都用指令完成,不要去依賴napp-it的介面。
      這樣只要準備好一張NexentaCore的光碟,有需要的時候加上自己的筆記,就可以很迅速的重建ZFS NAS系統。我自己試過的結果是,不包含從舊NAS轉移資料的時間,從NexentaCore的光碟安裝,到透過指令把所有的設定完成,然後ZFS NAS可以使用,大約是1個小時,算是相當快速了,只是事前的規劃都要預先完成。
      安裝NexentaCore的過程這裡這裡就直接掠過。

  2. 預先規劃

    • 我個人的CIFS分享結構

    • 把個人資料夾和一般收藏分成兩個ZFS檔案系統,一開始是考慮個人資料因為比較重要,可能會用copy=2的設定。同時個人資料夾會用比較高的頻率建立snapshot。所以分成兩個檔案系統比較好管理。

      private
      私人資料,分享的第一組ZFS檔案系統。

      private/personal
      私人資料/個人資料,平常掛成網路硬碟。
      擁有者LouisZZZ完整讀寫,群組xd維讀,所有人預設禁止,ACL增加admin完整權限。

      private/backup
      私人資料/備份,平常不掛載。
      擁有者Razgriz完整讀寫,群組xd維讀,所有人預設禁止,ACL增加admin完整權限。

      算是很囉嗦的做法,用不同的帳號Razgriz是為了平時的主帳號LouisZZZ不要去意外修改到不必要的部份。


      storage
      儲存,分享的第一組ZFS檔案系統,平常掛成網路硬碟。

      storage/collection (普通資料夾)
      儲存/一般收藏,所以可以讓所有人看到。
      擁有者Razgriz完整讀寫,群組xd維讀,所有人預設唯讀,ACL增加admin完整權限。

      storage/stash (普通資料夾)
      儲存/爭議性收藏,有不想讓其他人看到的,就放這裡。
      擁有者Razgriz完整讀寫,群組xd維讀,所有人預設禁止,ACL增加admin完整權限。


    • iSCSI部份
    • 因為主要是實驗用,除了target名稱要簡單好記外(如iqn.2011-05.org.zfs:xd),就是iSCSI Logic Unit的廠牌和型號要設定成容易分辨的(如vid=zfs-nas,pid=64gb-test),並沒有特別預先規劃的部份,有需要再立刻建立就足夠了。


  3. 建立zpool和設定zfs檔案系統
    • 接硬碟的注意事項
    • 在把sata線接到主機板時,這裡故意把raidz的四顆硬碟,接到c1t1do~c1t4d0連續四個位置,加上硬碟和排線都寫上編號,這樣在出問題時比較好判斷是對應哪一個實際硬碟。

    • 建立zpool
    • 列出硬碟,利用format指令,列出後用ctrl+c取消。
      # format
      Searching for disks...done
      AVAILABLE DISK SELECTIONS:
                         0. c1t0d0 <DEFAULT cyl 30398 alt 2 hd 255 sec 63>
                            /pci@0,0/pci1043,81eb@1f,2/disk@0,0
                         1. c1t1d0 <ATA-ST32000542AS-CC34-1.82TB>
                            /pci@0,0/pci1043,81eb@1f,2/disk@1,0
                         2. c1t2d0 <ATA-ST32000542AS-CC34-1.82TB>
                            /pci@0,0/pci1043,81eb@1f,2/disk@2,0
                         3. c1t3d0 <ATA-ST32000542AS-CC34-1.82TB>
                            /pci@0,0/pci1043,81eb@1f,2/disk@3,0
                         4. c1t4d0 <ATA-ST32000542AS-CC34-1.82TB>
                            /pci@0,0/pci1043,81eb@1f,2/disk@4,0
                            

      建立raidz1的xd-raidz,使用raidz1來達成至少一顆硬碟的容錯,同時保有最大的有效容量。
      # zpool create -f xd-raidz raidz c1t1d0 c1t2d0 c1t3d0 c1t4d0

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

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

      檢查zfs檔案系統下的容量,就是顯示raidz1及檔案系統設定下的有效容量,所以是5.34T,相當夠我用了。
      # zfs list xd-raidz
      NAME         USED  AVAIL  REFER  MOUNTPOINT
      xd-raidz   122K  5.34T  43.4K  /xd-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 xd-raidz/storage
      # zfs create -o casesensitivity=mixed -o nbmand=on -o utf8only=on xd-raidz/private

      檢查建立起來的檔案系統。
      # zfs list
      NAME         USED  AVAIL  REFER  MOUNTPOINT
      xd-raidz         233K  5.34T  44.9K  /xd-raidz
      xd-raidz/private         43.4K  5.34T  43.4K  /xd-raidz/private
      xd-raidz/storage         43.4K  5.34T  43.4K  /xd-raidz/storage

      建立下層資料夾
      # mkdir /xd-raidz/storage/collection
      # mkdir /xd-raidz/storage/stash
      # mkdir /xd-raidz/private/personal
      # mkdir /xd-raidz/private/backup


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

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

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

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


  4. 建立帳號、CIFS分享和ACL權限設定

    • 建立帳號
    • 建立CIFS密碼,使用vi編輯/etc/pam.conf
      # vi /etc/pam.conf
      加入底下這一行
      other   password required         pam_smb_passwd.so.1 nowarn

      重新設定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分享
    • 確認CIFS是否有啟動,因為solaris核心內建CIFS,NexentaCore預設CIFS應該是啟動的。
      # svcs | grep smb
      online         16:49:56 svc:/network/smb/server:default
      online         16:49:56 svc:/network/shares/group:smb

      假如samba起動,關掉他,NexentaCore預設應該是沒有samba。
      # svcs | grep samba
      # svcadm disable svc:/network/samba
      svcadm: Pattern 'svc:/network/samba' doesn't match any instances

      加入工作群組。
      # 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

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

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


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

      特別注意chmod指令必須使用下列路徑/usr/sun/bin/中的chmod,才能正確變更ZFS檔案系統的ACL權限,因為好像OpenSource的Solaris套件,預設的程式會被換成GNU的版本,會沒辦法處理ZFS,只會得到錯誤訊息。

      /xd-raidz/private的ACL權限設定為
      擁有者讀寫,群組維讀,所有人預設禁止,admin完整權限
      # /usr/sun/bin/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 \
      /xd-raidz/private

      /xd-raidz/storage的ACL權限設定為
      擁有者讀寫,群組維讀,所有人預設唯讀,admin完整權限
      # /usr/sun/bin/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 \
      /xd-raidz/storage

      /xd-raidz/storage/stash的ACL權限設定為
      擁有者讀寫,群組維讀,所有人預設禁止,admin完整權限。
      # /usr/sun/bin/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 \
      /xd-raidz/storage/stash

    • 設定owner及group
    • 原則依我先寫下來的規則去進行,這部分其實等檔案轉移完再進行,就可以了。
      同樣注意chown指令必須使用下列路徑/usr/sun/bin/中的chown

      /xd-raidz/private設定為擁有者LouisZZZ,群組xd
      # /usr/sun/bin/chown -R LouisZZZ:xd /xd-raidz/private

      /xd-raidz/private/backup設定為擁有者Razgriz,群組xd
      # /usr/sun/bin/chown -R Razgriz:xd /xd-raidz/private/backup

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

    • owner和ACL設定,假如沒有要透過其他的電腦從CIFS轉移資料,這部分其實等檔案轉移完再進行。
    • 以上的權限和ACL設定,實際上對已經轉移完成的80萬個檔案共2.4tb資料,大約10~15分鐘跑完。


  5. 從舊NAS轉移資料
    • 直接在ZFS NAS用CIFS轉移資料
    • 因為要把舊機器的smb分享掛上來,要確定smb client已經啟動。NexentaCore預設啟動。
      # svcs network/smb/client
      STATE STIME FMRI
      online 19:24:36 svc:/network/smb/client:default

      smb client預設是啟動的,假如發現沒有啟動,用下列的指令啟動。
      # svcadm enable -r network/smb/client

      要褂載smb share之前,可以先用,smbutil指令列出分享的資料夾,例如我舊NAS的IP是192.168.0.168
      # smbutil view //192.168.0.168

      先建立要掛載的資料夾collection和storage
      # mkdir /tmp/mnt/collection
      # mkdir /tmp/mnt/storage

      確定一下可以讀到舊nas的資料。
      # ls /mnt/collection
      # ls /mnt/storage

      要掛載smb分享時,用下列的格式,設定帳號密碼和路徑。
      # mount -F smbfs //[domain;][使用者[:密碼]@]主機/分享路徑 掛載點
      在NexentaCore 系統裡把舊的nas分享掛上來。
      # mount -F smbfs //LouisZZZ:xxxxxxxx@192.168.0.168/XD-Collection /mnt/collection
      # mount -F smbfs //Razgriz:xxxxxxxx@192.168.0.168/XD-Storage /mnt/storage

    • 安裝rsync
    • 在NexentaCore安裝rsync,因為須要rsync的checksum比對,這是整個過程唯一需要連上外部網路的部份。

      首先更新套件資料
      # apt-get update

      接著安裝rsync
      # apt-get install rsync

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


    • 第一輪先做轉移資料
    • 先跑單純的複製,所以不使用-c的chcksum比較,也不使用--del的刪除功能,把舊資料複製到新的ZFS NAS。舊NAS速度不快大約花了30小時左右完成。
      # rsync -av /mnt/storage /xd-raidz/private
      # rsync -av /mnt/collection /xd-raidz/storage

      第一輪檔案複製完成後,就先建立暫時snapshot,為避免意外修改。
    • 約80萬個檔案共2.4tb資料,snapshot建立不需要1分鐘,幾乎是瞬間完成,加上透過CIFS在windows底下,可以直接在[內容] => [以前的版本] 看到過去snapshot的內容,ZFS這點真是棒的沒話說。

    • 利用-r參數讓xd-raidz底下所有的檔案系統都用相同的snapshot名稱
      # zfs snapshot -r xd-raidz@20110520


    • 第二輪作資料比對
    • 針對已經複製完成的資料,再做第二輪的checksum比對,所以加上-c 表示使用checksum比較。
      雖然檔案都一樣,不需要重新複製,但是舊NAS的全部資料還是會被rsync讀出來算checksum,所以同樣大約花了30小時左右完成。

      假如第一輪的複製已經中斷過,會留下一些暫存檔案。假如在rsync沒有加上--del的刪除功能,對於目的地多出來的檔案會保留,但是目的是1:1的傳送,那些ctrl-c終止rsync留下來的暫存檔,和其他操作錯誤留下來的檔案都應該刪除,所以我用的指令改成。
      # rsync -cav --del /mnt/storage /xd-raidz/private
      # rsync -cav --del /mnt/collection /xd-raidz/storage

    • 第二輪複製完成後,同樣建立snapshot避免意外。
    • 利用-r參數讓xd-raidz底下所有的檔案系統都用相同的snapshot名稱
      # zfs snapshot -r xd-raidz@20110522-DONE

      列出snapshot確認,確認snapshot有確實建立。
      # zfs list -t snapshot
      NAME         USED  AVAIL  REFER  MOUNTPOINT
      syspool/rootfs-nmu-000@initial         338M         -  1.24G  -
      temp2@20110521-2nd-ReadyNAS         0         -         36K  -
      temp2/collection@20110521-2nd-ReadyNAS  35.2M         -  1.35T  -
      temp2/storage@20110521-2nd-ReadyNAS         646K         -   133G  -
      xd-raidz@20110520-ReadyNAS         0         -  46.4K  -
      xd-raidz@20110521-temp         0         -  46.4K  -
      xd-raidz@20110522-DONE         0         -  46.4K  -
      xd-raidz/private@20110520-ReadyNAS         2.12G         -   134G  -
      xd-raidz/private@20110521-temp         23.8M         -   132G  -
      xd-raidz/private@20110521-temp2         25.4M         -   133G  -
      xd-raidz/private@20110522-DONE         0         -   133G  -
      xd-raidz/storage@20110520-ReadyNAS         11.1G         -  2.48T  -
      xd-raidz/storage@20110521-temp         185M         -  2.47T  -
      xd-raidz/storage@20110521-temp2         185M         -  2.47T  -
      xd-raidz/storage@20110522-DONE         0         -  2.47T  -


    • 建立額外備份
    • 主要資料複製完成後,我還有一顆2tb的備份碟,只針對要轉移的資料中,非常重要的部份,再備份一份。

      為縮短時間,第二備份不使用checksum指令,完成後同樣建立snapshot,其他細節則省略。
      # rsync -av /mnt/storage /temp2
      # rsync -av /mnt/collection /temp2


    • 用hold把重要的snapshot設定為keep狀態
    • 最終檢查完成後,確認所有檔案都正確,且更正權限後,除了建立snapshot,再額外用hold把snapshot設定為keep狀態,同樣是避免snapshot被意外修改。

      使用zfs hold指令
      # zfs hold keep xd-raidz/storage@20110522-DONE
      # zfs hold keep xd-raidz/private@20110522-DONE

      使用zfs holds 檢視snapshot 狀態。
      # zfs holds xd-raidz/storage@20110522-DONE
      NAME         TAG   TIMESTAMP
      xd-raidz/storage@20110522-DONE  keep  Sun May 22 12:21:37 2011
      # zfs holds xd-raidz/private@20110522-DONE
      NAME         TAG   TIMESTAMP
      xd-raidz/private@20110522-DONE  keep  Sun May 22 12:21:51 2011


    • 刪除不必要的snapshot
    • 刪除轉移資料過程中暫時性的snapshot,因為是用zfs destroy指令,小心誤刪其他檔案系統。
      # zfs destroy -r xd-raidz@20110521-temp

      檢查刪除後的snapshot狀態
      # zfs list -t snapshot
      NAME         USED  AVAIL  REFER  MOUNTPOINT
      syspool/rootfs-nmu-000@initial         338M         -  1.24G  -
      temp2@20110521-2nd-ReadyNAS         0         -         36K  -
      temp2/collection@20110521-2nd-ReadyNAS  35.2M         -  1.35T  -
      temp2/storage@20110521-2nd-ReadyNAS         646K         -   133G  -
      xd-raidz@20110520-ReadyNAS         0         -  46.4K  -
      xd-raidz@20110522-DONE         0         -  46.4K  -
      xd-raidz/private@20110520-ReadyNAS         2.12G         -   134G  -
      xd-raidz/private@20110521-temp2         67.6M         -   133G  -
      xd-raidz/private@20110522-DONE         0         -   133G  -
      xd-raidz/storage@20110520-ReadyNAS         11.1G         -  2.48T  -
      xd-raidz/storage@20110521-temp2         232M         -  2.47T  -
      xd-raidz/storage@20110522-DONE         0         -  2.47T  -

      重複刪除其他不必要的snapshot,並檢查
      # zfs destroy xd-raidz/private@20110521-temp2
      # zfs destroy xd-raidz/storage@20110521-temp2
      # zfs list -t snapshot
      NAME         USED  AVAIL  REFER  MOUNTPOINT
      syspool/rootfs-nmu-000@initial         338M         -  1.24G  -
      temp2@20110521-2nd-ReadyNAS         0         -         36K  -
      temp2/collection@20110521-2nd-ReadyNAS  35.2M         -  1.35T  -
      temp2/storage@20110521-2nd-ReadyNAS         646K         -   133G  -
      xd-raidz@20110520-ReadyNAS         0         -  46.4K  -
      xd-raidz@20110522-DONE         0         -  46.4K  -
      xd-raidz/private@20110520-ReadyNAS         2.17G         -   134G  -
      xd-raidz/private@20110522-DONE         0         -   133G  -
      xd-raidz/storage@20110520-ReadyNAS         11.1G         -  2.48T  -
      xd-raidz/storage@20110522-DONE         0         -  2.47T  -



  6. 修改ZFS檔案系統、資料夾和CIFS分享的名稱
    • 首先是ZFS檔案系統
    • 把現有的檔案系統名稱列出來,準備改名子
      # zfs list
      NAME         USED  AVAIL  REFER  MOUNTPOINT
      xd-raidz         2.61T  2.72T  46.4K  /xd-raidz
      xd-raidz/private         135G  2.72T  96.7G  /xd-raidz/private
      xd-raidz/storage         2.48T  2.72T  2.17T  /xd-raidz/storage

      改成比較容易分辨的名稱
      # zfs rename xd-raidz/private xd-raidz/XD-private
      # zfs rename xd-raidz/storage xd-raidz/XD-storage

      看一下改完之後的ZFS檔案系統名稱,mount point會自動一起修改
      # zfs list
      NAME         USED  AVAIL  REFER  MOUNTPOINT
      syspool         3.79G   225G         35K  none
      syspool/dump         1.38G   225G  1.38G  -
      syspool/rootfs-nmu-000  1.37G   225G  1.04G  legacy
      syspool/swap         1.03G   225G   182M  -
      xd-raidz         2.61T  2.72T  46.4K  /xd-raidz
      xd-raidz/XD-private         135G  2.72T  96.7G  /xd-raidz/XD-private
      xd-raidz/XD-storage         2.48T  2.72T  2.17T  /xd-raidz/XD-storage

    • 修改資料夾名稱
    • 不屬於ZFS的檔案系統,只是單純的資料夾,就直接用mv指令改。
      # mv collection XD-collection
      # mv stash XD-stash
      # ls XD-collection XD-stash
      # mv backup XD-backup
      # mv personal XD-personal
      # ls
      XD-backup  XD-personal

    • 關於windows下,[內容] => [以前的版本] 看到的內容
    • 因為用mv改名稱,所以改名的資料夾底下,所有的[以前的版本] 都不見了,但是上層的檔案系統snapshot還在,並沒有消失,要找舊版本還是可以從上層開snapshot。
      剛才改名的資料夾,假如改回原名稱,不管是用mv還是在windows底下改,在[以前的版本] 裡,過去的snapshot又會再出現,該說神奇嗎?


    • CIFS分享的名稱
    • cifs的分享名稱順便改一下,改完立即生效。
      # zfs set sharesmb=name=XD-private xd-raidz/XD-private
      # zfs get sharesmb xd-raidz/XD-private
      NAME         PROPERTY  VALUE         SOURCE
      xd-raidz/XD-private  sharesmb  name=XD-private  local

      # zfs set sharesmb=name=XD-storage xd-raidz/XD-storage
      # zfs get sharesmb xd-raidz/XD-storage
      NAME         PROPERTY  VALUE         SOURCE
      xd-raidz/XD-storage  sharesmb  name=XD-storage  local



  7. 設定COMSTAR iSCSI Target
    • 建立iSCSI Logic Unit
    • 要先啟動stmf,NexentaCore預設是啟動
      # svcadm enable stmf

      確認stmf有正確啟動
      # svcs stmf
      STATE STIME FMRI online 22:31:34 svc:/system/stmf:default
      建立zvol,使用-V大寫參數,加上指定容量64gb及檔案系統位置xd-raidz/test。
      # zfs create -V 64gb xd-raidz/test

      zvol建立後,檢查/dev底下有出現名稱為test的zvol
      # ls /dev/zvol/rdsk/xd-raidz
      XD-private  XD-storage  test

      zvol不會出現在檔案系統中
      # ls /xd-raidz
      XD-private  XD-storage

      用sbdadm把zvol建立成iSCSI Logic Unit
      # sbdadm create-lu /dev/zvol/rdsk/xd-raidz/test
      Created the following LU:
                             GUID         DATA SIZE         SOURCE
      --------------------------------  -------------------  ----------------
      600144f006b0070000004dde65a80001  68719476736         /dev/zvol/rdsk/xd-raidz/test

      檢視建立好的iSCSI Logic Unit,sbdadm。
      # sbdadm list-lu
      Found 1 LU(s)
                             GUID         DATA SIZE         SOURCE
      --------------------------------  -------------------  ----------------
      600144f006b0070000004dde65a80001  68719476736         /dev/zvol/rdsk/xd-raidz/test

      檢視建立好的iSCSI Logic Unit,用stmfadm。
      # stmfadm list-lu
      LU Name: 600144F006B0070000004DDE65A80001

      iSCSI Logic Unit還要加入view在initialator中才看的到。
      # stmfadm add-view 600144F006B0070000004DDE65A80001

      檢視剛剛iSCSI Logic Unit的view設定
      # stmfadm list-view -l 600144F006B0070000004DDE65A80001
      View Entry: 0
                    Host group   : All
                    Target group : All
                    LUN         : 0


    • 自訂iSCSI Logic Unit的廠牌和型號
    • 假如不喜歡預設的廠牌nexenta和硬碟型號comstar,可以用下列的指令來建立iSCSI Logic Unit ,把vid換成指定的廠牌,把pid換成指定的型號,我改成vid=XD-iSCSI,pid=64GB-test,其他依此類推。
      至於stmfadm和sbdadm建立的lu有什麼實際上的差異,還要待確認。
      # stmfadm create-lu -p vid=vid -p pid=pid -p serial=serial /dev/zvol/rdsk/xd-raidz/test2
      Logical unit created: 600144F006B0070000004DDE740B0005


    • 建立iSCSI Target
    • 啟動iscsi target的服務
      # svcadm enable -r svc:/network/iscsi/target:default
      svcadm: svc:/milestone/network depends on svc:/network/physical, which has multiple instances.

      檢查iSCSI Target相關服務的狀況
      # svcs -l iscsi/target
      fmri         svc:/network/iscsi/target:default
      name         iscsi target
      enabled         true
      state         online
      next_state   none
      state_time   Thu May 26 22:41:07 2011
      logfile         /var/svc/log/network-iscsi-target:default.log
      restarter         svc:/system/svc/restarter:default
      dependency   require_any/error svc:/milestone/network (online)
      dependency   require_all/none svc:/system/stmf:default (online)

      建立iSCSI Target,不指定target時,會自動幫你命名。
      # itadm create-target
      Target iqn.1986-03.com.sun:02:7c292a10-0dfd-40d7-c4f7-db4c7e448303 successfully created

      檢視所有建立的iSCSI Target
      # itadm list-target -v
      TARGET NAME         STATE         SESSIONS
      iqn.1986-03.com.sun:02:7c292a10-0dfd-40d7-c4f7-db4c7e448303  online   0
                       alias:         -
                       auth:         none (defaults)
                       targetchapuser:         -
                       targetchapsecret:         unset
                       tpg-tags:         default


    • 自訂較簡單的iSCSI Target名稱
    • 但是自動命名實在太長了,其實只要符合命名規則,也可以建出下列的iSCSI Target名稱。iqn似乎是固定的,.2011-05一定要年加月,原本是跟據公司的建立時間.1986-03似乎是sun的建立時間,.org原來是預設.com,.xd原來預設是.sun,:test這一段不一定要提供,參數-l是設定alias。
      # itadm create-target -n iqn.2011-05.org.virtual-on:test -l test1
      Target iqn.2011-05.org.virtual-on:test successfully created

      再列出已經建的iSCSI Target
      # itadm list-target -v
      TARGET NAME         STATE         SESSIONS
      iqn.2011-05.org.virtual-on:test         online   0
                       alias:         test1
                       auth:         none (defaults)
                       targetchapuser:         -
                       targetchapsecret:         unset
                       tpg-tags:         default
      iqn.1986-03.com.sun:02:7c292a10-0dfd-40d7-c4f7-db4c7e448303  online   0
                       alias:         -
                       auth:         none (defaults)
                       targetchapuser:         -
                       targetchapsecret:         unset
                       tpg-tags:         default


23 則留言:

thx 提到...

From OSSLab thx.
你ZFS資料不錯.方便收錄在我們網站嗎?
http://www.osslab.com.tw/

louiszzz 提到...

請用,幫我加個連結註明出處就可以了。

THI 提到...

之前設定iSCSI的方法很簡單zfs set shareiscsi=on就行了,但好像在v134以後的版本就變了,變成你上面的方法,不知道是為什麼?

我也是參考louiszzz兄的介紹才把iSCSI裝起來,不過還是不太了解到底為什麼要那樣做,能請louiszzz兄稍微講解一下嗎?

THI 提到...

另外,還有兩個問題想請教?

1.iSCSI架立後,Server --> Client,也就是iSCSI硬碟的讀取異常低落,只有26MB/s左右,不曉得您那邊的測試會嗎?

2.建立iSCSI Target後,除了Client端可以管理iSCSI硬碟外,Server端看不到這個檔案,也無法管理,那日後若出問題時,要怎麼處理呢?

louiszzz 提到...

1. 因為我沒有用過zfs set shareiscsi=on的方法,所以幫不上忙。
google一下,似乎是有Bug。

2. iSCSI之前隨手測的,用FastCopy在Win7 x64(RAID10)底下,對NAS(RAIDZ)連續讀取約65MB/sec,連續寫入57MB/sec。換用檔案總管,讀42MB/sec,寫40MN/sec。
沒有做額外的最佳化。

3. 你應該是指iSCSI硬碟的內容吧?就和實體硬碟一樣,需要任何一台機器存取時,就用該機器的iSCSI initiator,連接iSCSI target,就算在Server端也一樣,用initiator去連接在同一台Server的target。
至於zvol,這是ZFS的一部分,建立流程就差不多是管理流程。

THI 提到...

1.我的意思是,ZFS在分享這方面簡化了許多繁雜的設定,只要設定set sharesmb、set sharenfs就可以了,不用多做設定。而之前的版本也是有set shareiscsi(雖然我也沒用過),只是不曉得為什麼在後面的版本拿掉了?相較現在的設定,真的是繁複許多…

2.iSCSI硬碟這部份我的意思是,若Server在down或是maintain的狀態下,在Server端似乎無法對iSCSI硬碟做任何的處理,因為連看都不看不到。Win2008的iSCSI Target至少還知道是使用存放在哪的VHD檔。

3.我做了一些有關網路的傳輸測試,我把數據整理出來。其中,Solaris的傳輸效能遠比我想像中來的低落。若有機會,我想跟您討論這部份,謝謝!
http://blog.xuite.net/trad546/blog

louiszzz 提到...

1.
zfs set shareiscsi=on的方法,我是找到下列這一篇,但是我沒有試過
https://blogs.oracle.com/mhuff/entry/introduction_to_iscsi_in_solaris
,文章內除了一部分設定用預設值外,因為target和view等項目雖然設定成不同形式,但是還是必須進行設定。
我是認為該設定的還是必須設定,避不開的。

louiszzz 提到...

2.
以我的例子中,建立zvol做為iSCSI用的Block Device:

# zfs create -V 64gb xd-raidz/test

zvol建立後,檢查/dev底下有出現名稱為test的zvol

# ls /dev/zvol/rdsk/xd-raidz
XD-private XD-storage test


上述例子中名稱為test的zvol,可以用ls在/dev/zvol/rdsk/xd-raidz底下看到,這個zvol就應該是類似VHD檔的存在,部分zfs的管理指令如snapshot/clone/send之類,應該是可以正常作用的。
我不能理解為何看不到和無法管理。

louiszzz 提到...

3.
效能部分,我會提到沒有做額外的最佳化,是因為我根本不知道要如何最佳化,目前也沒有在用iSCSI。

真要比較效能差異,可能測試方法要明確和統一才行,我有稍微看一下你的數據,可能在測試方法上差異太大,我的數據看就好。
FastCopy似乎有些限制在,原因不明。

在NAS端可以試試
zpool iostat -v 1
看pool的讀寫狀況

iostat -xncvM 1
看cpu使用率和硬碟讀寫
看看瓶頸在哪了。

即時的網路流量監控也可以看一下。
有時候畫面上完成,但是因為非同步寫入的要求,網路還沒結束(印象中iSCSI好像比較明顯),zpool寫入也還沒完成。

THI 提到...

你說的沒錯啦,zvol底下是存在的,是我被傳統的觀念制約了。雖然是用zfs指命建立的,但不管是用zfs還是zpool都看不到相關訊息,只知道是空間被佔用了,不知道是什麼…

我想我也不會用iSCSI,太麻煩了,除了在小檔案的傳輸表現不錯外,其他似乎沒有太吸引人的地方。我也只是順便做測試而巳…

THI 提到...

其實最讓我困惑的是Solaris網路傳輸效能不如預期。讓我困惑的部份在於,通常網路傳輸瓶頸在於儲存媒體的存取速度不足以應付網路傳輸,因此我在測試前均做了本機磁碟的傳輸測試。測試數據表明本機磁碟的傳輸能力足以應付網路傳輸。

若瓶頸不在磁碟存取速度上,那麼問題就出在網路傳輸協定上了。不過似乎也不是,因為透過快取而非從磁碟讀取的傳輸,確實能達到網路傳輸的上限。而這就是一直困擾我的事,若不是磁碟存取速度,也非網路傳輸協定,那造成這種現象的問題到底是什麼?

這幾天安裝了Nexentastor來測試,我想這套專門設計作為NAS的系統或許可以幫我找到問題的答案。其中有兩個發現:

第一,Nexenta系統在「Win7->Solaris」小檔案的傳輸有增長,由原本的5MB->14MB左右,其他數據不變。

第二,問題確實是由ZFS引起的。雖然磁碟能提供更快的存取速度,但只要是透過網路讀取,大檔案就會被限制在60-70MB,小檔案會被限制在6-7MB左右,不管Pool是Single、Stripe、Mirror還是Raidz。透過Nexenta系統的監控畫面可以較容易發現這一點。

THI 提到...

所以這很可能是有關ZFS效能的問題。ZFS效能關鍵不外乎讀取的ARC及寫入的ZIL,之前還此研究了一下ZIL,只不過像網路傳輸這樣的synchronous I/O,比較有影響的應該是資料的寫入而非讀取。但實際上卻是讀取的效能低於寫入,這跟我們一般讀取大於寫入的傳統印象不同,這是我所不解的地方。很可惜的,我沒有SSD可以測試L2ARC的部份…

另外,Solaris系統一般多應用在server上,也就是說透過網路,通常資料的讀取會比寫入多得多。而這樣的表現讓我很難相信它的能力僅止於此,或許問題不在Solaris身上,而是Win7搞得鬼,改天再來測測看...

對於這個問題,不知louiszzz兄有什麼看法?

THI 提到...

不好意思,再請教一個問題。我把client端更改為solaris express 11,去mount server端的cifs share。可以正常mount,不過要cp檔案到client端時總是出現permission denied,即使設定為777也一樣。同樣的,cp檔案到server端也是一樣,這跟ZFS的ACL有關嗎?可是client端是Win7時就沒有這種問題,不解…

louiszzz 提到...

zvol是可以用zfs指令列出來的。

zfs list -t volume
和snapshot類似,要加上-t指定列出屬於volume的檔案系統。

試試看。

louiszzz 提到...

以CIFS為例子,XP是實做SMB,vista(SMB2.0)和win7(SMB2.1),效能上就有很大的差異。
我自己的機器,從ZFS NAS讀取資料,在XP底下就只能跑到讀取40MB/s,同樣硬體換成win7就能跑到100MB/s。
但是只要搭配win7能夠接近跑滿GBE上限,我會認定ZFS本身是ok的,效能瓶頸,未必能算在ZFS上。
因為軟硬體的組合實在太多,網路上也有用XP跑到讀取100MB/s的例子(雖然不是ZFS NAS),但我就是沒辦法在XP上試出來,有些組合就是不適合。

louiszzz 提到...

關於小檔案部分,同樣未必是ZFS的問題,因為可能已經跑到機械式硬碟的IOPS上限了,一般單顆SATA大約在100 IOPS上下,能到200 IOPS已經是SAS 15k才有的水準,機械式硬碟的IOPS就是這麼低。

利用下列的指令
zpool iostat -v 1
在進行小檔案的測試中觀察operations這一項,假如單顆硬碟已經到了100上下,已經很不錯了。

這部分先不考慮同步或非同步,甚至iSCSI target是否會做快取等情況。

louiszzz 提到...

我原本也以為網路傳輸會是synchronous I/O,結果卻不一定是。

之前的ZIL測試(沒有整理出來的)有發現

xp cifs搭配crystal disk mark是syn write。
win7 cifs搭配crystal disk mark是asy write。
windows內建和fastcopy是asy write。
xp iSCSI是asy write。
win7 iSCSI是asy write (win7用iscsi開機是syn write)。

完全不知道原因,聽說NFS會是syn write,但是我沒有測試過。

不過看看我之前的設數據就算是asy write會先寫入記憶體,再正式寫入zpool,隨機寫入還是很差。但是那時沒有觀察記錄zpool的operations,不確定IOPS是否是限制。

louiszzz 提到...

讀取的效能低於寫入,這我就不知道了,雖然我的測試結果中寫入似乎一直比讀取快,但是不確定原因。

用zpool iostat -v 1時
可以把時間由1秒加長到10秒,統計數據會比較平均一點,剛剛用照片測試raidz的讀取,SATA單顆硬碟IOPS好像接近130上下。

louiszzz 提到...

mount時的使用者帳號正確嗎?
因為讀寫cifs mount權限是看mount使用的帳號。

然後讀寫local檔案權限看你的登入帳號,因為偷懶的關係我是用root帳號寫入local的ZFS,完成之後再變更所有檔案的ACL權限。

我沒有單獨設定unix權限,所以不確定777有何影響,可能要看permission denied是來自哪邊。

THI 提到...

我發現了一個可能的因素,但是不太確定,也不太滿意,不過我也找不出其他原因了…

http://blog.xuite.net/trad546/blog/58200007

大概就這樣了,這個問題只好先丟到一旁,繼續我下面的測試。

louiszzz 提到...

稍微提醒一下

NexentaStor的Optimize I/O performance這個選項和ZIL沒有關係。
這是因為ZFS會用flushing的指令,來確保硬碟cache中的資料已經確實寫入。

選項的說明裡會強調要有UPS或NVRAM保護,因為關掉ZFS cache flushing的功能後,可能發生因為發生斷電或異常,但是因為ZFS不會用flushing指令去確認硬碟cache內的資料已經完成寫入,所以就失去了硬碟cache內的待寫入資料。

ZFS會希望直接控制硬碟,要確定flushing指令可以正確作用,大概也是其中一個主要理由。

個人使用沒有大容量需求時NexentaStor的免費版真的很方便,只可惜用在我的硬體上,會週期性的失去反應。

Unknown 提到...

关于 “加上透過CIFS在windows底下,可以直接在[內容] => [以前的版本] 看到過去snapshot的內容,ZFS這點真是棒的沒話說。” 这里,没看懂,没有实作成功。是要开启Windows7的系统保护吗?还是ZFS本身的功能?不太会用。可否赐教?

我用FreeBSD 9.0 实作 ZFS。

louiszzz 提到...

我可能沒有寫清楚,這個需要透過Solaris核心整合的CIFS,才能把ZFS的snapshot偽裝成Windows底下的還原點。
FreeBSD使用的SAMBA似乎沒有這個功能。
假如在Soalris底下使用SAMBA一樣會無法使用這個功能。