ZFS-Solaris 10的新檔案系統 (一)
Sun Solaris 10作業系統 (Solaris OS) 裡新的ZFS檔案系統於2006年6月正式推出。
* 管理簡單 | ZFS 自動化並整合複雜的儲存管理概念,降低 80% 管理上的經常性耗用時間。 |
* 確實的資料完整性 | ZFS 用 64 位元的總和檢查保護所有資料, |
* 無限延伸性 | ZFS 是世界第一個 128 位元檔案系統,其儲存容量為 32 或 64 位元系統的 1600 萬兆倍。 |
* 極速效能 | 作業事件模型消除了傳統式發送 I/O 的順序限制,大幅提升效能。 |
看了這麼多,還是快開始進入我們的重點吧!
在一切都準備就緒後就可以開始了。
# cat /etc/release
Solaris 10 6/06 s10x_u2wos_09a X86
Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 09 June 2006
是2006年6月的版本,
# echo | format
Searching for disks...done
AVAILABLE DISK SELECTIONS:
0. c0d0
/pci@0,0/pci-ide@7,1/ide@0/cmdk@0,0
1. c2t0d0
/pci@0,0/pci1000,30@10/sd@0,0
2. c2t1d0
/pci@0,0/pci1000,30@10/sd@1,0
3. c2t2d0
/pci@0,0/pci1000,30@10/sd@2,0
4. c2t3d0
/pci@0,0/pci1000,30@10/sd@3,0
5. c2t4d0
/pci@0,0/pci1000,30@10/sd@4,0
6. c2t5d0
/pci@0,0/pci1000,30@10/sd@5,0
Specify disk (enter its number): Specify disk (enter its number):
zfs標榜管理簡單所以指令也相對的少,只有二個指令。
# zpool create mypool c2t0d0
# ls -ld /mypool
drwxr-xr-x 2 root sys 2 Jul 21 16:40 /mypool
這個新建的mypool大小為1GB,
# mkfile 100m testfile
# df -k /mypool
Filesystem kbytes used avail capacity Mounted on
mypool 999424 81455 917906 9% /mypool
mypool這是一個storage pool,同時它也是一個可用的檔案系統,你可以在上面建目錄、
-bash-3.00# zfs create mypool/data
-bash-3.00# df -k
Filesystem kbytes used avail capacity Mounted on
/dev/dsk/c0d0s0 7730925 2908589 4745027 39% /
/devices 0 0 0 0% /devices
ctfs 0 0 0 0% /system/contract
proc 0 0 0 0% /proc
mnttab 0 0 0 0% /etc/mnttab
swap 561064 644 560420 1% /etc/svc/volatile
objfs 0 0 0 0% /system/object
/usr/lib/libc/libc_hwcap1.so.1
7730925 2908589 4745027 39% /lib/libc.so.1
fd 0 0 0 0% /dev/fd
swap 560452 32 560420 1% /tmp
swap 560448 28 560420 1% /var/run
mypool 999424 102449 896878 11% /mypool
mypool/data 999424 24 896878 1% /mypool/data
看到上面的輸出了嗎?
目前已經大致介紹了storage pool和ZFS檔案系統的建立。接下來會再對storage pool的使用做更進一步的說明。
上面的範例我們建了一個叫mypool的storage pool,並且指定c2t0d0給它。
-bash-3.00# zpool create mypool c2t0d0
其中c2t0d0是一個未經solaris 格式化過的硬碟(未使用format這個指令去做過任何的處理)
c2t0d0 |
/dev/dsk/c2t0d0 |
c2t0d0s0 |
/dev/dsk/c2t0d0s0 |
/dev/md/dsk/d10 |
/dev/vx/dsk/datadg/vol01 |
除了最基本的storage pool外,其實zfs還提供了mirror和RAID-
以mirror(RAID 1)的方式建立storage pool時,
zpool create datapool mirror c0t0d0 c0t1d0
zpool create datapool mirror c0t0d0 c0t1d0 mirror c1t0d0 c1t1d0
zpool create datapool raidz c0t0d0 c0t1d0
zpool create datapool raidz c0t0d0 c0t1d0 mirror c1t0d0 c1t1d0
當在建立storage pool時可能會出現錯誤訊息,此時可用-f的參數來強制執行。
#zpool create data c1t0d0
invalid vdev specification
use '-f' to override the following errors:
/dev/dsk/c1t0d0s0 contains a ufs filesystem
#zpool create -f data c1t0d0
因為建立storage pool對磁碟資料有無法復原的破壞性。所以在做這些動作之前,
-bash-3.00# zpool create -n mypool c2t0d0
invalid vdev specification
use '-f' to override the following errors:
/dev/dsk/c2t0d0s0 is part of active ZFS pool mypool. Please see zpool(1M).
前面提到在建立storage pool時會在根目錄(/)建立一個同名的目錄以供掛載之用。
-bash-3.00# zpool create -m /oradata/db1 db1 c2t1d0
-bash-3.00# df -k /oradata/db1
Filesystem kbytes used avail capacity Mounted on
db1 999424 24 999342 1% /oradata/db1
學會建立storage pool當然也得要知道如何把不要的storage pool殺掉。當你不再需要某個storage pool的時候便需要將該pool殺掉, 好把空間釋放出來供未來使用。在建storage pool時使用了關鍵字create,
-bash-3.00# zpool destroy db1
-bash-3.00# zpool destroy -f db1
當pool的空間已經不夠使用的時候該怎麼辦呢?
-bash-3.00# df -k /mypool
Filesystem kbytes used avail capacity Mounted on
mypool 999424 102450 794442 12% /mypool
-bash-3.00# zpool add mypool c2t1d0
-bash-3.00# df -k /mypool
Filesystem kbytes used avail capacity Mounted on
mypool 2031616 102450 1826634 6% /mypool
從上面的範例可以看出來zpool add和zpool create的指令格式一樣,而且也都可以使用-f和-n。
-bash-3.00# zpool create -f testpool mirror c2t2d0 c2t3d0
-bash-3.00# df -k /testpool
Filesystem kbytes used avail capacity Mounted on
testpool 999424 24 999349 1% /testpool
-bash-3.00# zpool add testpool mirror c2t4d0 c2t5d0
-bash-3.00# df -k /testpool
Filesystem kbytes used avail capacity Mounted on
testpool 2031616 24 2031445 1% /testpool
現在有一個情況,假設我有二個Oracle的資料庫要執行,
zfs create poolname/fsname
下面的範例建立了一個oradata的pool並在其下建了二個
# zpool create oradata c2t0d0
# zfs create oradata/db1
# zfs create oradata/db2
# df -k
Filesystem kbytes used avail capacity Mounted on
oradata 999424 27 999288 1% /oradata
oradata/db1 999424 24 999288 1% /oradata/db1
oradata/db2 999424 24 999288 1% /oradata/db2
這個時候問題又來了,DBA決定把DB1改叫prod;
ZFS的設計理念之一是簡化管理,
下面的範例解決了問題一。
# zfs rename oradata/db1 oradata/prod
# zfs rename oradata/db2 oradata/test
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
oradata 136K 976M 27.5K /oradata
oradata/prod 24.5K 976M 24.5K /oradata/prod
oradata/test 24.5K 976M 24.5K /oradata/test
第二個問題要怎麼解決呢?這個時候就得要介紹一下ZFS的屬性(
# zfs get
missing property argument
usage:
get [-rHp] [-o field[,field]...] [-s source[,source]...]
...
The following properties are supported:
PROPERTY EDIT INHERIT VALUES
type NO NO filesystem | volume | snapshot
creation NO NO
used NO NO
available NO NO
referenced NO NO
compressratio NO NO <1.00x>
mounted NO NO yes | no | -
origin NO NO
quota YES NO | none
reservation YES NO | none
volsize YES NO
volblocksize NO NO 512 to 128k, power of 2
recordsize YES YES 512 to 128k, power of 2
mountpoint YES YES | legacy | none
sharenfs YES YES on | off | share(1M) options
checksum YES YES on | off | fletcher2 | fletcher4 | sha256
compression YES YES on | off | lzjb
atime YES YES on | off
devices YES YES on | off
exec YES YES on | off
setuid YES YES on | off
readonly YES YES on | off
zoned YES YES on | off
snapdir YES YES hidden | visible
aclmode YES YES discard | groupmask | passthrough
aclinherit YES YES discard | noallow | secure | passthrough
Sizes are specified in bytes with standard units such as K, M, G, etc.
zfs get不加其他參數時會列出所有可用的屬性,
quota YES NO | none
為例,quota這個屬性是可設定的、不能繼承、值可為大小(
再以quota為例,我們要如何得知quota的值呢?zfs get quota oradata其中quota為屬性名,
# zfs get quota oradata
NAME PROPERTY VALUE SOURCE
oradata quota none default
# zfs get all oradata
NAME PROPERTY VALUE SOURCE
oradata type filesystem -
oradata creation Fri Aug 4 14:44 2006 -
oradata used 136K -
oradata available 976M -
oradata referenced 27.5K -
oradata compressratio 1.00x -
oradata mounted yes -
oradata quota none default
oradata reservation none default
oradata recordsize 128K default
oradata mountpoint /oradata default
oradata sharenfs off default
oradata checksum on default
oradata compression off default
oradata atime on default
oradata devices on default
oradata exec on default
oradata setuid on default
oradata readonly off default
oradata zoned off default
oradata snapdir hidden default
oradata aclmode groupmask default
oradata aclinherit secure
在瞭解ZFS的屬性後,要解決第二個問題就很簡單了。
# zfs set quota=600M oradata/prod
# zfs get quota oradata/prod
NAME PROPERTY VALUE SOURCE
oradata/prod quota 600M local
另外還有一個屬性reservation(保留空間)。
# zfs set reservation=600 oradata/prod
# zfs get quota,reservation oradata/prod oradata/test
NAME PROPERTY VALUE SOURCE
oradata/prod quota 600M local
oradata/prod reservation 600M local
oradata/test quota 600M local
oradata/test reservation none default
# zfs list -r
NAME USED AVAIL REFER MOUNTPOINT
oradata 600M 376M 27.5K /oradata
oradata/prod 24.5K 900M 24.5K /oradata/prod
oradata/test 24.5K 376M 24.5K /oradata/test
觀察上面zfs list的輸出,/oradata已經使用了600M,
下面的範例可以看出設定reservation對oradata
# zfs set reservation=100m oradata/test
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
oradata 700M 276M 27.5K /oradata
oradata/prod 24.5K 876M 24.5K /oradata/prod
oradata/test 24.5K 376M 24.5K /oradata/test
# zfs set reservation=none oradata/test
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
oradata 600M 376M 27.5K /oradata
oradata/prod 24.5K 900M 24.5K /oradata/prod
oradata/test 24.5K 376M 24.5K /oradata/test
我們來做個實驗,試著在/oradata/
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
oradata 600M 376M 27.5K /oradata
oradata/prod 24.5K 900M 24.5K /oradata/prod
oradata/test 24.5K 376M 24.5K /oradata/test
# cd /oradata/test
# mkfile 400m file1
file1: initialized 393748480 of 419430400 bytes: No space left on device
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
oradata 976M 0 27.5K /oradata
oradata/prod 24.5K 600M 24.5K /oradata/prod
oradata/test 376M 0 376M /oradata/test
一般Oracle的資料庫都會需要存放Archive log,所以我們要再建立一個目錄專來門用來放置Archive log。 因為資料特性的關係所以我們新建一個pool來給它使用。
pool : archlog
zfs1 : parch
mountpoint1 : /oradata/prod/arch
zfs2 : tarch
mountpoint2 : /oradata/test/arch
有了以上的資訊後,我們就可以開始動手了。
# zpool create archlog c2t1d0
# zfs create archlog/parch
# zfs create archlog/tarch
# zfs set mountpoint=/oradata/prod/arch archlog/parch
# zfs set mountpoint=/oradata/test/arch archlog/tarch
# zfs set mountpoint=none archlog
上面的範例的解說如下;
1. 在c2t1do上建立一個叫archlog的pool
2. 建立二個zfs,parch和tarch分別給prod和test使用
3. 修改二個zfs的掛載點,使其分別掛在/oradata/prod和/oradata/test下
4. 修改archlog這個pool的掛載點,將之改為none。這有什麼影響呢?看看df的輸出你就知道了。
# df -k
oradata 999424 28 999285 1% /oradata
oradata/prod 999424 25 999285 1% /oradata/prod
oradata/test 999424 25 999285 1% /oradata/test
archlog/parch 999424 24 999267 1% /oradata/prod/arch
archlog/tarch 999424 24 999267 1% /oradata/test/arch
沒錯,將mountpoint設為none就表示這個pool(
傳統上我們使用mount和umount來做檔案系統的掛載和卸
# zfs umount /oradata/test/arch
# zfs mount archlog/tarch
如果基於某些理由,你想要使用傳統的方式來掛載那也是可以的。
如果你要修改vfstab的話,
下面的範例是將帶你完成上述的需求。
# zpool create oraexp c2t2d0
# zfs get mountpoint oraexp
NAME PROPERTY VALUE SOURCE
oraexp mountpoint /oraexp default
# zfs set mountpoint=legacy oraexp
# vi /etc/vfstab
#device device mount FS fsck mount mount
#to mount to fsck point type pass at boot options
oraexp - /oraexp zfs - yes -
# mkdir /oraexp
# mount /oraexp
# df -h /oraexp
Filesystem size used avail capacity Mounted on
oraexp 976M 24K 976M 1% /oraexp
過了二個小時,
# zfs set sharenfs=on oraexp
# share
怎麼沒有東西呢?
# zfs set sharenfs=off oraexp
# umount /oraexp
# zfs set mountpoint=/oraexp
# zfs set sharenfs=on oraexp
# share
- /oraexp rw ""
這會兒有了吧!我們再來看一個例子,在己分享的/
# zfs create oraexp/son
# share
- /oraexp rw ""
- /oraexp/son rw ""
我們新建了一個叫son的zfs,
當我們設定sharenfs=on時,
# zfs set sharenfs=ro=user1,rw=user2 oraexp
# share
- /oraexp ro=user1,rw=user2 ""
要停止分享時,可以使用如下的方式。
# zfs unshare oraexp/son
# zfs unshare -a
在Windows下,NTFS提供了檔案系統的壓縮功能,
ZFS的屬性有一欄是compression,預設值是off,
# zpool create mypool c2t3d0
# zfs set compression=on mypool
# cd /mypool
# mkfile 200m 200file
# mkfile 500m 500file
# df -h /mypool
Filesystem size used avail capacity Mounted on
mypool 976M 24K 976M 1% /mypool
# ls -al
total 7
drwxr-xr-x 2 root sys 4 Sep 7 09:42 .
drwxr-xr-x 39 root root 1024 Sep 7 08:53 ..
-rw------T 1 root root 209715200 Sep 7 08:55 200file
-rw------T 1 root root 524288000 Sep 7 08:56 500file
# tar -cvf etc.tar /etc/*
# ls -al
total 45650
drwxr-xr-x 2 root sys 5 Sep 7 09:45 .
drwxr-xr-x 39 root root 1024 Sep 7 08:53 ..
-rw------T 1 root root 209715200 Sep 7 08:55 200file
-rw------T 1 root root 524288000 Sep 7 08:56 500file
-rw-r--r-- 1 root root 51942912 Sep 7 09:46 etc.tar
# df -h /mypool
Filesystem size used avail capacity Mounted on
mypool 976M 22M 954M 3% /mypool
上面的例子,新建了一個pool,並且開啟壓縮功能。
zfs get compressratio mypool
來觀察壓縮率的變化。最後要提醒的是
到這裡講的也都差不多了,基本的使用應該都不成問題。
在安裝Solaris時不曉得你有沒有注意到,
留言