這裡有一個啟動機制,可讓 FreeBSD 在系統初始化時掛載 ZFS 儲存池。要開啟這個功能,可加入此行到 /etc/rc.conf
:
zfs_enable="YES"
然後啟動服務:
#
service zfs start
本節的例子會假設有三個 SCSI 磁碟,名稱分別為
, da0
及 da1
。SATA 硬體的使用者裝置名稱改為 da2
。ada
要使用一個磁碟裝置建立一個簡單、無備援的儲存池可:
#
zpool create example
/dev/da0
要檢視這個新的儲存池,可查看 df
的輸出結果:
#
df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235230 1628718 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032846 48737598 2% /usr
example 17547136 0 17547136 0% /example
這個輸出結果說明 example
儲存池已建立且被掛載,現在已經可以作為檔案系統存取,可以在上面建立檔案且使用者可以瀏覽:
#
cd /example
#
ls
#
touch testfile
#
ls -al
total 4
drwxr-xr-x 2 root wheel 3 Aug 29 23:15 .
drwxr-xr-x 21 root wheel 512 Aug 29 23:12 ..
-rw-r--r-- 1 root wheel 0 Aug 29 23:15 testfile
但是,這個儲存池並未運用到任何 ZFS 功能,若要在這個儲存池上建立一個有開啟壓縮功能的資料集:
#
zfs create example/compressed
#
zfs set compression=gzip example/compressed
example/compressed
資料集現在是一個 ZFS 壓縮的檔案系統,可以試著複製較大的檔案到 /example/compressed
。
壓縮功能也可以使用以下指令關閉:
#
zfs set compression=off example/compressed
要卸載檔案系統,使用 zfs umount
然後再使用 df
確認:
#
zfs umount example/compressed
#
df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235232 1628716 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032864 48737580 2% /usr
example 17547008 0 17547008 0% /example
要重新掛載檔案系統以便再次使用,使用 zfs mount
然後以 df
檢查:
#
zfs mount example/compressed
#
df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235234 1628714 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032864 48737580 2% /usr
example 17547008 0 17547008 0% /example
example/compressed 17547008 0 17547008 0% /example/compressed
儲存池與檔案系統也可以從 mount
的結果查詢到:
#
mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1d on /usr (ufs, local, soft-updates)
example on /example (zfs, local)
example/compressed on /example/compressed (zfs, local)
在建立之後,ZFS 的資料集可如同其他檔案系統一般使用,且有許多額外功能可在每個資料集上設定。例如,建立一個預計存放重要的資料的新檔案系統 data
,要設定每個資料區塊 (Data block) 要保留兩份備份:
#
zfs create example/data
#
zfs set copies=2 example/data
現在,可以使用 df
指令來查看資料與空間的使用率:
#
df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235234 1628714 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032864 48737580 2% /usr
example 17547008 0 17547008 0% /example
example/compressed 17547008 0 17547008 0% /example/compressed
example/data 17547008 0 17547008 0% /example/data
注意,從這個可以發現每個在儲存池上的檔案系統都擁有相同的可用空間,這是為什麼要在這些範例使用 df
的原因,為了要顯示檔案系統只會用它們所需要使用到的空間,且均取自同一個儲存池。ZFS 淘汰了磁碟區 (Volume) 與分割區 (Partition) 的概念,且允許多個檔案系統共用相同的儲存池。
不需要使用時可摧毀檔案系統後再摧毀儲存池:
#
zfs destroy example/compressed
#
zfs destroy example/data
#
zpool destroy example
磁碟損壞時,要避免資料因磁碟故障造成遺失便是使用 RAID。ZFS 在它的儲存池設計中支援了這項功能。RAID-Z 儲存池需要使用三個或更多的磁碟,但可以提供比鏡像 (Mirror) 儲存池更多的可用空間。
這個例子會建立一個 RAID-Z 儲存池,並指定要加入這個儲存池的磁碟:
#
zpool create storage raidz da0 da1 da2
Sun™ 建議用在 RAID-Z 設定的裝置數在三到九個之間。若需要由 10 個或更多磁碟組成單一儲存池的環境,可考慮分成較小的 RAID-Z 群組。若只有兩個可用的磁碟且需要做備援 (Redundancy),可考慮使用 ZFS 鏡像 (Mirror)。請參考 zpool(8) 取得更多詳細資訊。
先前的例子已經建立了 storage
儲存池 (zpool),現在這個例子會在該儲存池中建立一個新的檔案系統,名稱為 home
:
#
zfs create storage/home
可以設定開啟壓縮及保留目錄及檔案額外備份的功能:
#
zfs set copies=2 storage/home
#
zfs set compression=gzip storage/home
要讓這個空間作為使用者的新家目錄位置,需複製使用者資料到這個目錄並建立適合的符號連結 (Symbolic link):
#
cp -rp /home/* /storage/home
#
rm -rf /home /usr/home
#
ln -s /storage/home /home
#
ln -s /storage/home /usr/home
現在使用者的資料會儲存在新建立的 /storage/home
,可以加入新使用者並登入該使用者來測試。
試著建立檔案系統快照 (Snapshot),稍後可用來還原 (Rollback):
#
zfs snapshot storage/home@08-30-08
快照只可以使用整個檔案系統製作,無法使用各別目錄或檔案。
@
字元用來區隔檔案系統名稱 (File system) 或磁碟區 (Volume) 名稱,若有重要的目錄意外被刪除,檔案系統可以備份然後還原到先前目錄還存在時的快照 (Snapshot):
#
zfs rollback storage/home@08-30-08
要列出所有可用的快照,可在檔案系統的 .zfs/snapshot
目錄執行 ls
,舉例來說,要查看先前已做的快照:
#
ls /storage/home/.zfs/snapshot
也可以寫一個 Script 來對使用者資料做例行性的快照,但隨著時間快照可能消耗大量的磁碟空間。先前的快照可以使用指令移除:
#
zfs destroy storage/home@08-30-08
在測試之後,便可讓 /storage/home
成為真正的 /home
使用此指令:
#
zfs set mountpoint=/home storage/home
執行 df
興 mount
來確認系統現在是否以把檔案系統做為真正的 /home
:
#
mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1d on /usr (ufs, local, soft-updates)
storage on /storage (zfs, local)
storage/home on /home (zfs, local)
#
df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 2026030 235240 1628708 13% /
devfs 1 1 0 100% /dev
/dev/ad0s1d 54098308 1032826 48737618 2% /usr
storage 26320512 0 26320512 0% /storage
storage/home 26320512 0 26320512 0% /home
這個動作完成 RAID-Z 最後的設定,有關已建立的檔案系統每日狀態更新可以做為 periodic(8) 的一部份在每天晚上執行。加入此行到 /etc/periodic.conf
:
daily_status_zfs_enable="YES"
每個軟體 RAID 都有監控其狀態 (state
) 的方式,而 RAID-Z 裝置的狀態可以使用這個指令來查看:
#
zpool status -x
如果所有儲存池為上線 (Online) 且正常,則訊息會顯示:
all pools are healthy
如果有發生問題,可能磁碟會呈現離線 (Offline) 的狀態,此時儲存池的狀態會是:
pool: storage
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
storage DEGRADED 0 0 0
raidz1 DEGRADED 0 0 0
da0 ONLINE 0 0 0
da1 OFFLINE 0 0 0
da2 ONLINE 0 0 0
errors: No known data errors
這代表著裝置在之前被管理者使用此指令拿下線:
#
zpool offline storage da1
現在系統可以關機然後更換 da1
,當系統恢復上線,則可以替換掉儲存池中故障的磁碟:
#
zpool replace storage da1
到這裡,可以再檢查狀態一次,這時不需使用 -x
參數來顯示所有的儲存池:
#
zpool status storage
pool: storage
state: ONLINE
scrub: resilver completed with 0 errors on Sat Aug 30 19:44:11 2008
config:
NAME STATE READ WRITE CKSUM
storage ONLINE 0 0 0
raidz1 ONLINE 0 0 0
da0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
errors: No known data errors
在這個例子中,所有的磁碟均已正常運作。
ZFS 使用校驗碼 (Checksum) 來檢驗資料的完整性 (Integrity),會在建立檔案系統時便自動開啟。
校驗碼 (Checksum) 可以關閉,但並不建議!校驗碼只會使用非常少的儲存空間來確保資料的完整性。若關閉校驗碼會使許多 ZFS 功能無法正常運作,且關閉校驗碼對並不會明顯的改善效能。
檢驗校驗碼這個動作即所謂的清潔 (Scrub),可以使用以下指令來檢驗 storage
儲存池的資料完整性:
#
zpool scrub storage
清潔所需要的時間依儲存的資料量而定,較大的資料量相對會需要花費較長的時間來檢驗。清潔會對 I/O 有非常密集的操作且一次只能進行一個清潔動作。在清潔完成之後,可以使用 status
來查看狀態:
#
zpool status storage
pool: storage
state: ONLINE
scrub: scrub completed with 0 errors on Sat Jan 26 19:57:37 2013
config:
NAME STATE READ WRITE CKSUM
storage ONLINE 0 0 0
raidz1 ONLINE 0 0 0
da0 ONLINE 0 0 0
da1 ONLINE 0 0 0
da2 ONLINE 0 0 0
errors: No known data errors
查詢結果會顯示上次完成清潔的時間來協助追蹤是否要再做清潔。定期清潔可以協助保護資料不會默默損壞且確保儲存池的完整性。
本文及其他文件,可由此下載: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/。
若有 FreeBSD 方面疑問,請先閱讀
FreeBSD 相關文件,如不能解決的話,再洽詢
<questions@FreeBSD.org>。
關於本文件的問題,請洽詢
<doc@FreeBSD.org>。