19.2. 快速入門指南
前一頁 | 章 19. Z 檔案系統 (ZFS) | 下一頁

## 19.2. 快速入門指南

這裡有一個啟動機制，可讓 FreeBSD 在系統初始化時掛載 ZFS 儲存池。要開啟這個功能，可加入此行到 `/etc/rc.conf`：

    zfs_enable="YES"

然後啟動服務：

    # service zfs start

本節的例子會假設有三個 SCSI 磁碟，名稱分別為 ``da0``, ``da1`` 及 ``da2``。SATA 硬體的使用者裝置名稱改為 ``ada`` 。

### 19.2.1. 單磁碟儲存池

要使用一個磁碟裝置建立一個簡單、無備援的儲存池可：

    # 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

### 19.2.2. RAID-Z

磁碟損壞時，要避免資料因磁碟故障造成遺失便是使用 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"

### 19.2.3. 復原 RAID-Z

每個軟體 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

在這個例子中，所有的磁碟均已正常運作。

### 19.2.4. 資料檢驗

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

查詢結果會顯示上次完成清潔的時間來協助追蹤是否要再做清潔。定期清潔可以協助保護資料不會默默損壞且確保儲存池的完整性。

請參考 zfs(8) 及 zpool(8) 來取得其他 ZFS 選項。

前一頁 | 上一層 | 下一頁
章 19. Z 檔案系統 (ZFS) | 起始頁 | 19.3. `zpool` 管理

本文及其他文件，可由此下載： ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/。

若有 FreeBSD 方面疑問，請先閱讀 FreeBSD 相關文件，如不能解決的話，再洽詢 <questions@FreeBSD.org>。
關於本文件的問題，請洽詢 <doc@FreeBSD.org>。