diff options
Diffstat (limited to 'documentation/content/zh-tw/books/handbook/zfs/_index.adoc')
-rw-r--r-- | documentation/content/zh-tw/books/handbook/zfs/_index.adoc | 226 |
1 files changed, 113 insertions, 113 deletions
diff --git a/documentation/content/zh-tw/books/handbook/zfs/_index.adoc b/documentation/content/zh-tw/books/handbook/zfs/_index.adoc index 09d411e3a2..03771200a6 100644 --- a/documentation/content/zh-tw/books/handbook/zfs/_index.adoc +++ b/documentation/content/zh-tw/books/handbook/zfs/_index.adoc @@ -74,7 +74,7 @@ zfs_enable="YES" 然後啟動服務: -[source,bash] +[source,shell] .... # service zfs start .... @@ -86,14 +86,14 @@ zfs_enable="YES" 要使用一個磁碟裝置建立一個簡單、無備援的儲存池可: -[source,bash] +[source,shell] .... # zpool create example /dev/da0 .... 要檢視這個新的儲存池,可查看 `df` 的輸出結果: -[source,bash] +[source,shell] .... # df Filesystem 1K-blocks Used Avail Capacity Mounted on @@ -105,7 +105,7 @@ example 17547136 0 17547136 0% /example 這個輸出結果說明 `example` 儲存池已建立且被掛載,現在已經可以作為檔案系統存取,可以在上面建立檔案且使用者可以瀏覽: -[source,bash] +[source,shell] .... # cd /example # ls @@ -119,7 +119,7 @@ drwxr-xr-x 21 root wheel 512 Aug 29 23:12 .. 但是,這個儲存池並未運用到任何 ZFS 功能,若要在這個儲存池上建立一個有開啟壓縮功能的資料集: -[source,bash] +[source,shell] .... # zfs create example/compressed # zfs set compression=gzip example/compressed @@ -129,14 +129,14 @@ drwxr-xr-x 21 root wheel 512 Aug 29 23:12 .. 壓縮功能也可以使用以下指令關閉: -[source,bash] +[source,shell] .... # zfs set compression=off example/compressed .... 要卸載檔案系統,使用 `zfs umount` 然後再使用 `df` 確認: -[source,bash] +[source,shell] .... # zfs umount example/compressed # df @@ -149,7 +149,7 @@ example 17547008 0 17547008 0% /example 要重新掛載檔案系統以便再次使用,使用 `zfs mount` 然後以 `df` 檢查: -[source,bash] +[source,shell] .... # zfs mount example/compressed # df @@ -163,7 +163,7 @@ example/compressed 17547008 0 17547008 0% /example/compressed 儲存池與檔案系統也可以從 `mount` 的結果查詢到: -[source,bash] +[source,shell] .... # mount /dev/ad0s1a on / (ufs, local) @@ -175,7 +175,7 @@ example/compressed on /example/compressed (zfs, local) 在建立之後,ZFS 的資料集可如同其他檔案系統一般使用,且有許多額外功能可在每個資料集上設定。例如,建立一個預計存放重要的資料的新檔案系統 `data`,要設定每個資料區塊 (Data block) 要保留兩份備份: -[source,bash] +[source,shell] .... # zfs create example/data # zfs set copies=2 example/data @@ -183,7 +183,7 @@ example/compressed on /example/compressed (zfs, local) 現在,可以使用 `df` 指令來查看資料與空間的使用率: -[source,bash] +[source,shell] .... # df Filesystem 1K-blocks Used Avail Capacity Mounted on @@ -199,7 +199,7 @@ example/data 17547008 0 17547008 0% /example/data 不需要使用時可摧毀檔案系統後再摧毀儲存池: -[source,bash] +[source,shell] .... # zfs destroy example/compressed # zfs destroy example/data @@ -213,7 +213,7 @@ example/data 17547008 0 17547008 0% /example/data 這個例子會建立一個 RAID-Z 儲存池,並指定要加入這個儲存池的磁碟: -[source,bash] +[source,shell] .... # zpool create storage raidz da0 da1 da2 .... @@ -225,14 +225,14 @@ Sun(TM) 建議用在 RAID-Z 設定的裝置數在三到九個之間。若需要 先前的例子已經建立了 `storage` 儲存池 (zpool),現在這個例子會在該儲存池中建立一個新的檔案系統,名稱為 `home`: -[source,bash] +[source,shell] .... # zfs create storage/home .... 可以設定開啟壓縮及保留目錄及檔案額外備份的功能: -[source,bash] +[source,shell] .... # zfs set copies=2 storage/home # zfs set compression=gzip storage/home @@ -240,7 +240,7 @@ Sun(TM) 建議用在 RAID-Z 設定的裝置數在三到九個之間。若需要 要讓這個空間作為使用者的新家目錄位置,需複製使用者資料到這個目錄並建立適合的符號連結 (Symbolic link): -[source,bash] +[source,shell] .... # cp -rp /home/* /storage/home # rm -rf /home /usr/home @@ -252,7 +252,7 @@ Sun(TM) 建議用在 RAID-Z 設定的裝置數在三到九個之間。若需要 試著建立檔案系統快照 (Snapshot),稍後可用來還原 (Rollback): -[source,bash] +[source,shell] .... # zfs snapshot storage/home@08-30-08 .... @@ -261,35 +261,35 @@ Sun(TM) 建議用在 RAID-Z 設定的裝置數在三到九個之間。若需要 `@` 字元用來區隔檔案系統名稱 (File system) 或磁碟區 (Volume) 名稱,若有重要的目錄意外被刪除,檔案系統可以備份然後還原到先前目錄還存在時的快照 (Snapshot): -[source,bash] +[source,shell] .... # zfs rollback storage/home@08-30-08 .... 要列出所有可用的快照,可在檔案系統的 [.filename]#.zfs/snapshot# 目錄執行 `ls`,舉例來說,要查看先前已做的快照: -[source,bash] +[source,shell] .... # ls /storage/home/.zfs/snapshot .... 也可以寫一個 Script 來對使用者資料做例行性的快照,但隨著時間快照可能消耗大量的磁碟空間。先前的快照可以使用指令移除: -[source,bash] +[source,shell] .... # zfs destroy storage/home@08-30-08 .... 在測試之後,便可讓 [.filename]#/storage/home# 成為真正的 [.filename]#/home# 使用此指令: -[source,bash] +[source,shell] .... # zfs set mountpoint=/home storage/home .... 執行 `df` 興 `mount` 來確認系統現在是否以把檔案系統做為真正的 [.filename]#/home#: -[source,bash] +[source,shell] .... # mount /dev/ad0s1a on / (ufs, local) @@ -318,21 +318,21 @@ daily_status_zfs_enable="YES" 每個軟體 RAID 都有監控其狀態 (`state`) 的方式,而 RAID-Z 裝置的狀態可以使用這個指令來查看: -[source,bash] +[source,shell] .... # zpool status -x .... 如果所有儲存池為上線 (<<zfs-term-online,Online>>) 且正常,則訊息會顯示: -[source,bash] +[source,shell] .... all pools are healthy .... 如果有發生問題,可能磁碟會呈現離線 (<<zfs-term-offline,Offline>>) 的狀態,此時儲存池的狀態會是: -[source,bash] +[source,shell] .... pool: storage state: DEGRADED @@ -356,21 +356,21 @@ errors: No known data errors 這代表著裝置在之前被管理者使用此指令拿下線: -[source,bash] +[source,shell] .... # zpool offline storage da1 .... 現在系統可以關機然後更換 [.filename]#da1#,當系統恢復上線,則可以替換掉儲存池中故障的磁碟: -[source,bash] +[source,shell] .... # zpool replace storage da1 .... 到這裡,可以再檢查狀態一次,這時不需使用 `-x` 參數來顯示所有的儲存池: -[source,bash] +[source,shell] .... # zpool status storage pool: storage @@ -403,14 +403,14 @@ ZFS 使用校驗碼 (Checksum) 來檢驗資料的完整性 (Integrity),會在 檢驗校驗碼這個動作即所謂的__清潔 (Scrub)__,可以使用以下指令來檢驗 `storage` 儲存池的資料完整性: -[source,bash] +[source,shell] .... # zpool scrub storage .... 清潔所需要的時間依儲存的資料量而定,較大的資料量相對會需要花費較長的時間來檢驗。清潔會對 I/O 有非常密集的操作且一次只能進行一個清潔動作。在清潔完成之後,可以使用 `status` 來查看狀態: -[source,bash] +[source,shell] .... # zpool status storage pool: storage @@ -444,7 +444,7 @@ ZFS 管理分成兩個主要的工具。`zpool` 工具用來控制儲存池的 建立一個簡單的鏡像儲存池: -[source,bash] +[source,shell] .... # zpool create mypool mirror /dev/ada1 /dev/ada2 # zpool status @@ -464,7 +464,7 @@ errors: No known data errors 可以一次建立數個 vdev,磁碟群組間使用 vdev 型態關鍵字來區隔,在這個例子使用 `mirror`: -[source,bash] +[source,shell] .... # zpool create mypool mirror /dev/ada1 /dev/ada2 mirror /dev/ada3 /dev/ada4 pool: mypool @@ -488,7 +488,7 @@ errors: No known data errors 使用分割區建立一個 <<zfs-term-vdev-raidz,RAID-Z2>> 儲存池: -[source,bash] +[source,shell] .... # zpool create mypool raidz2 /dev/ada0p3 /dev/ada1p3 /dev/ada2p3 /dev/ada3p3 /dev/ada4p3 /dev/ada5p3 # zpool status @@ -521,7 +521,7 @@ errors: No known data errors 加入 _ada1p3_ 來升級單一磁碟串連 (stripe) vdev _ada0p3_ 採用鏡像型態 (mirror): -[source,bash] +[source,shell] .... # zpool status pool: mypool @@ -587,7 +587,7 @@ errors: No known data errors 連接第二個 mirror 群組 ([.filename]#ada2p3# 及 [.filename]#ada3p3#) 到既有的 mirror: -[source,bash] +[source,shell] .... # zpool status pool: mypool @@ -629,7 +629,7 @@ errors: No known data errors 從一個三方 mirror 群組移除一個磁碟: -[source,bash] +[source,shell] .... # zpool status pool: mypool @@ -666,7 +666,7 @@ errors: No known data errors 儲存池的狀態很重要,若有磁碟機離線或偵測到讀取、寫入或校驗碼 (Checksum) 錯誤,對應的錯誤計數便會增加。`status` 會顯示儲存池中每一個磁碟機的設定與狀態及整個儲存池的狀態。需要處置的方式與有關最近清潔 (<<zfs-zpool-scrub,`Scrub`>>) 的詳細資訊也會一併顯示。 -[source,bash] +[source,shell] .... # zpool status pool: mypool @@ -699,7 +699,7 @@ errors: No known data errors 更換儲存池中正在運作的狀置: -[source,bash] +[source,shell] .... # zpool status pool: mypool @@ -771,7 +771,7 @@ errors: No known data errors 使用 `zpool replace` 更換故障的磁碟: -[source,bash] +[source,shell] .... # zpool status pool: mypool @@ -831,7 +831,7 @@ errors: No known data errors 建議儲存池要定期清潔 (<<zfs-term-scrub,Scrub>>),最好是每一個月清潔一次。 `scrub` 作業對磁碟操作非常的密集,在執行時會降低磁碟的效能。在排程 `scrub` 時避免在使用高峰的時期,或使用 <<zfs-advanced-tuning-scrub_delay,`vfs.zfs.scrub_delay`>> 來調整 `scrub` 的相對優先權來避免影響其他的工作。 -[source,bash] +[source,shell] .... # zpool scrub mypool # zpool status @@ -864,7 +864,7 @@ errors: No known data errors 接下來的例子會示範自我修復會如何運作。建立一個使用磁碟 [.filename]#/dev/ada0# 及 [.filename]#/dev/ada1# 做鏡像的儲存池。 -[source,bash] +[source,shell] .... # zpool create healer mirror /dev/ada0 /dev/ada1 # zpool status healer @@ -887,7 +887,7 @@ healer 960M 92.5K 960M - - 0% 0% 1.00x ONLINE - 將部份需要使用自我修復功能來保護的重要資料複製到該儲存池,建立一個儲存池的校驗碼供稍後做比較時使用。 -[source,bash] +[source,shell] .... # cp /some/important/data /healer # zfs list @@ -906,7 +906,7 @@ SHA1 (/healer) = 2753eff56d77d9a536ece6694bf0a82740344d1f 這是一個危險的操作,會破壞重要的資料。在這裡使用僅為了示範用,不應在儲存池正常運作時嘗試使用,也不應將這個故意損壞資料的例子用在任何其他的檔案系統上,所以請勿使用任何不屬於該儲存池的其他磁碟裝置名稱並確定在執行指令前已對儲存池做正確的備份! ==== -[source,bash] +[source,shell] .... # zpool export healer # dd if=/dev/random of=/dev/ada1 bs=1m count=200 @@ -918,7 +918,7 @@ SHA1 (/healer) = 2753eff56d77d9a536ece6694bf0a82740344d1f 儲存池的狀態顯示有一個裝置發生了錯誤。注意,應用程式從儲存池讀取的資料中並沒有任何的錯誤資料,ZFS 會自 [.filename]#ada0# 裝置提供有正確校驗碼的資料。結果裡面 `CKSUM` 欄位含有非零值便是有錯誤校驗碼的裝置。 -[source,bash] +[source,shell] .... # zpool status healer pool: healer @@ -942,7 +942,7 @@ errors: No known data errors 錯誤已經被偵測到並且由未被影響的 [.filename]#ada0# 鏡像磁碟上的備援提供資料。可與原來的校驗碼做比較來看儲存池是否已修復為一致。 -[source,bash] +[source,shell] .... # sha1 /healer >> checksum.txt # cat checksum.txt @@ -952,7 +952,7 @@ SHA1 (/healer) = 2753eff56d77d9a536ece6694bf0a82740344d1f 儲存池在故意竄改資料前與後的兩個校驗碼仍相符顯示了 ZFS 在校驗碼不同時偵測與自動修正錯誤的能力。注意,這只在當儲存池中有足夠的備援時才可做到,由單一裝置組成的儲存池並沒有自我修復的能力。這也是為什麼在 ZFS 中校驗碼如此重要,任何原因都不該關閉。不需要 man:fsck[8] 或類似的檔案系統一致性檢查程式便能夠偵測與修正問題,且儲存儲存池在發生問題時仍可正常運作。接著需要做清潔作業來覆蓋在 [.filename]#ada1# 上的錯誤資料。 -[source,bash] +[source,shell] .... # zpool scrub healer # zpool status healer @@ -979,7 +979,7 @@ errors: No known data errors 清潔作業會從 [.filename]#ada0# 讀取資料並重新寫入任何在 [.filename]#ada1# 上有錯誤校驗碼的資料。這個操作可以由 `zpool status` 的輸出中呈現修復中 `(repairing)` 的項目來辨識。這個作業完成後,儲存池的狀態會更改為: -[source,bash] +[source,shell] .... # zpool status healer pool: healer @@ -1003,7 +1003,7 @@ errors: No known data errors 清潔操作完成便同步了 [.filename]#ada0# 到 [.filename]#ada1# 間的所有資料。執行 `zpool clear` 可以清除 (<<zfs-zpool-clear,Clear>>) 儲存池狀態的錯誤訊息。 -[source,bash] +[source,shell] .... # zpool clear healer # zpool status healer @@ -1037,7 +1037,7 @@ errors: No known data errors 匯出未使用的儲存池: -[source,bash] +[source,shell] .... # zpool export mypool .... @@ -1046,7 +1046,7 @@ errors: No known data errors 列出所有可以匯入的儲存池: -[source,bash] +[source,shell] .... # zpool import pool: mypool @@ -1061,7 +1061,7 @@ errors: No known data errors 使用替代的根目錄匯入儲存池: -[source,bash] +[source,shell] .... # zpool import -o altroot=/mnt mypool # zfs list @@ -1077,7 +1077,7 @@ mypool 110K 47.0G 31K /mnt/mypool 升級一個 v28 的儲存以支援功能旗標 (`Feature Flags`): -[source,bash] +[source,shell] .... # zpool status pool: mypool @@ -1126,7 +1126,7 @@ ZFS 的新功能在 `zpool upgrade` 尚未完成之前無法使用。可以用 ` 升級儲存池支援新版的功能旗標 (Feature flags): -[source,bash] +[source,shell] .... # zpool status pool: mypool @@ -1184,14 +1184,14 @@ Enabled the following features on 'mypool': 針對傳統使用 GPT 開機的系統,可以使用以下指令: -[source,bash] +[source,shell] .... # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1 .... 針對使用 EFI 開機的系統可以執行以下指令: -[source,bash] +[source,shell] .... # gpart bootcode -p /boot/boot1.efifat -i 1 ada1 .... @@ -1204,7 +1204,7 @@ Enabled the following features on 'mypool': 修改儲存池的指令會被記錄下來,會記錄的動作包含資料集的建立,屬性更改或更換磁碟。這個歷史記錄用來查看儲存池是如何建立、由誰執行、什麼動作及何時。歷史記錄並非儲存在日誌檔 (Log file),而是儲存在儲存池。查看這個歷史記錄的指令名稱為 `zpool history`: -[source,bash] +[source,shell] .... # zpool history History for 'tank': @@ -1218,7 +1218,7 @@ History for 'tank': 在提供選項 `-i` 或 `-l` 時 `zpool history` 可以顯更多詳細資訊。`-i` 會顯示使用者觸發的事件外,也會顯示內部記錄的 ZFS 事件。 -[source,bash] +[source,shell] .... # zpool history -i History for 'tank': @@ -1233,7 +1233,7 @@ History for 'tank': 更多詳細的資訊可加上 `-l` 來取得,歷史記錄會以較長的格式顯示,包含的資訊有執行指令的使用者名稱、主機名稱以及更改的項目。 -[source,bash] +[source,shell] .... # zpool history -l History for 'tank': @@ -1252,7 +1252,7 @@ History for 'tank': 內建的監視系統可以即時顯示儲存池的 I/O 統計資訊。它會顯示儲存池剩餘的空間與使用的空間,每秒執行了多少讀取與寫入的操作,有多少 I/O 頻寬被使用。預設會監視所有在系統中的儲存池都並顯示出來,可以提供儲存池名稱來只顯示該儲存池的監視資訊。舉一個簡單的例子: -[source,bash] +[source,shell] .... # zpool iostat capacity operations bandwidth @@ -1265,7 +1265,7 @@ data 288G 1.53T 2 11 11.3K 57.1K 使用 `-v` 可以顯示更詳細的 I/O 統計資訊。每個在儲存池中的裝置會以一行統計資訊顯示。這可以幫助了解每一個裝置做了多少讀取與寫入的操作,並可協助確認是否有各別裝置拖慢了整個儲存池的速度。以下範例會顯示有兩個裝置的鏡像儲存池: -[source,bash] +[source,shell] .... # zpool iostat -v capacity operations bandwidth @@ -1295,7 +1295,7 @@ data 288G 1.53T 2 12 9.23K 61.5K 建立一個新資料集並開啟 <<zfs-term-compression-lz4,LZ4 壓縮>>: -[source,bash] +[source,shell] .... # zfs list NAME USED AVAIL REFER MOUNTPOINT @@ -1335,7 +1335,7 @@ mypool/var/tmp 152K 93.2G 152K /var/tmp 摧毀先前建立的資料集: -[source,bash] +[source,shell] .... # zfs list NAME USED AVAIL REFER MOUNTPOINT @@ -1380,7 +1380,7 @@ mypool/var/tmp 152K 93.2G 152K /var/tmp 磁碟區可以被格式化成任何檔案系統,或不使用檔案系統來儲存原始資料。對一般使用者,磁碟區就像是一般的磁碟,可以放置一般的檔案系統在這些 _zvols_ 上,並提供一般磁碟或檔案系統一般所沒有的功能。例如,使用壓縮屬性在一個 250 MB 的磁碟區可建立一個壓縮的 FAT 檔案系統。 -[source,bash] +[source,shell] .... # zfs create -V 250m -o compression=on tank/fat32 # zfs list tank @@ -1404,7 +1404,7 @@ Filesystem Size Used Avail Capacity Mounted on 重新命名一個資料集並移動該資料集到另一個父資料集: -[source,bash] +[source,shell] .... # zfs list NAME USED AVAIL REFER MOUNTPOINT @@ -1443,7 +1443,7 @@ mypool/var/tmp 152K 93.2G 152K /var/tmp 快照也可以像這樣重新命名,由於快照的本質使其無法被重新命名到另一個父資料集。要遞迴重新命名快照可指定 `-r`,然後在子資料集中所有同名的快照也會一併被重新命名。 -[source,bash] +[source,shell] .... # zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT @@ -1461,7 +1461,7 @@ mypool/var/newname@new_snapshot_name 0 - 87.5K - 也可設定使用者自訂的屬性。這些屬性也會成為資料集設定的一部份,且可以被用來提供資料集或其內容的額外資訊。要別分自訂屬性與 ZFS 提供的屬性,會使用冒號 (`:`) 建立一個自訂命名空間供自訂屬性使用。 -[source,bash] +[source,shell] .... # zfs set custom:costcenter=1234 tank # zfs get custom:costcenter tank @@ -1471,7 +1471,7 @@ tank custom:costcenter 1234 local 要移除自訂屬性,可用 `zfs inherit` 加上 `-r`。若父資料集未定義任何自訂屬性,將會將該屬性完全移除 (更改動作仍會記錄於儲存池的歷史記錄)。 -[source,bash] +[source,shell] .... # zfs inherit -r custom:costcenter tank # zfs get custom:costcenter tank @@ -1486,7 +1486,7 @@ tank custom:costcenter - - Two commonly used and useful dataset properties are the NFS and SMB share options. Setting these define if and how ZFS datasets may be shared on the network. At present, only setting sharing via NFS is supported on FreeBSD. To get the current status of a share, enter: -[source,bash] +[source,shell] .... # zfs get sharenfs mypool/usr/home NAME PROPERTY VALUE SOURCE @@ -1498,14 +1498,14 @@ mypool/usr/home sharesmb off local To enable sharing of a dataset, enter: -[source,bash] +[source,shell] .... # zfs set sharenfs=on mypool/usr/home .... It is also possible to set additional options for sharing datasets through NFS, such as `-alldirs`, `-maproot` and `-network`. To set additional options to a dataset shared through NFS, enter: -[source,bash] +[source,shell] .... # zfs set sharenfs="-alldirs,-maproot=root,-network=192.168.1.0/24" mypool/usr/home .... @@ -1524,7 +1524,7 @@ ZFS 中的快照提供了多種功能,即使是在其他缺乏快照功能的 建立一個整個儲存池的遞迴快照: -[source,bash] +[source,shell] .... # zfs list -t all NAME USED AVAIL REFER MOUNTPOINT @@ -1567,7 +1567,7 @@ mypool/var/tmp@my_recursive_snapshot 0 - 152K - 快照並不會直接掛載,因此 `MOUNTPOINT` 欄位的路徑如此顯示。在 `AVAIL` 欄位不會有可用的磁碟空間,因為快照建立之後便無法再寫入。比較快照與其原來建立時的資料集: -[source,bash] +[source,shell] .... # zfs list -rt all mypool/usr/home NAME USED AVAIL REFER MOUNTPOINT @@ -1577,7 +1577,7 @@ mypool/usr/home@my_recursive_snapshot 0 - 184K - 同時顯示資料集與快照可以了解快照如何使用 <<zfs-term-cow,COW>> 技術來運作。快照只會保存有更動 (_差異_) 的資料,並非整個檔案系統的內容,這個意思是說,快照只會在有做更動時使用一小部份的空間,複製一個檔案到該資料集,可以讓空間使用量變的更明顯,然後再做第二個快照: -[source,bash] +[source,shell] .... # cp /etc/passwd /var/tmp # zfs snapshot mypool/var/tmp@after_cp @@ -1595,7 +1595,7 @@ mypool/var/tmp@after_cp 0 - 118K - ZFS 提供了內建指令可以用來比對兩個快照 (Snapshot) 之間的差異,在使用者想要查看一段時間之間檔案系統所的變更時非常有用。例如 `zfs diff` 可以讓使用者在最後一次快照中找到意外刪除的檔案。對前面一節所做的兩個快照使用這個指令會產生以下結果: -[source,bash] +[source,shell] .... # zfs list -rt all mypool/var/tmp NAME USED AVAIL REFER MOUNTPOINT @@ -1632,7 +1632,7 @@ M /var/tmp/ 比對兩個快照需要提供兩個資料集的完整資料集名稱與快照名稱: -[source,bash] +[source,shell] .... # cp /var/tmp/passwd /var/tmp/passwd.copy # zfs snapshot mypool/var/tmp@diff_snapshot @@ -1654,7 +1654,7 @@ M /var/tmp/ 在第一個範例中,因為 `rm` 操作不小心移除了預期外的資料,要還原到快照。 -[source,bash] +[source,shell] .... # zfs list -rt all mypool/var/tmp NAME USED AVAIL REFER MOUNTPOINT @@ -1671,7 +1671,7 @@ vi.recover 在此時,使用者發現到刪除了太多檔案並希望能夠還原。ZFS 提供了簡單的方可以取回檔案,便是使用還原 (Rollback),但這只在有定期對重要的資料使用快照時可用。要拿回檔案並從最後一次快照重新開始,可執行以下指令: -[source,bash] +[source,shell] .... # zfs rollback mypool/var/tmp@diff_snapshot # ls /var/tmp @@ -1680,7 +1680,7 @@ passwd passwd.copy vi.recover 還原操作會將資料集還原為最後一次快照的狀態。這也可以還原到更早之前,有其他在其之後建立的快照。要這麼做時,ZFS 會發出這個警告: -[source,bash] +[source,shell] .... # zfs list -rt snapshot mypool/var/tmp AME USED AVAIL REFER MOUNTPOINT @@ -1696,7 +1696,7 @@ mypool/var/tmp@diff_snapshot 這個警告是因在該快照與資料集的目前狀態之間有其他快照存在,然而使用者想要還原到該快照。要完成這樣的還原動作,必須刪除在這之間的快照,因為 ZFS 無法追蹤不同資料集狀態間的變更。在使用者未指定 `-r` 來確認這個動作前,ZFS 不會刪除受影響的快照。若確定要這麼做,那麼必須要知道會遺失所有在這之間的快照,然後可執行以下指令: -[source,bash] +[source,shell] .... # zfs rollback -r mypool/var/tmp@my_recursive_snapshot # zfs list -rt snapshot mypool/var/tmp @@ -1713,7 +1713,7 @@ vi.recover 快照會掛載在父資料集下的隱藏目錄:[.filename]#.zfs/snapshots/snapshotname#。預設不會顯示這些目錄,即使是用 `ls -a` 指令。雖然該目錄不會顯示,但該目錄實際存在,而且可以像一般的目錄一樣存取。一個名稱為 `snapdir` 的屬性可以控制是否在目錄清單中顯示這些隱藏目錄,設定該屬性為可見 (`visible`) 可以讓這些目錄出現在 `ls` 以及其他處理目錄內容的指令中。 -[source,bash] +[source,shell] .... # zfs get snapdir mypool/var/tmp NAME PROPERTY VALUE SOURCE @@ -1727,7 +1727,7 @@ mypool/var/tmp snapdir hidden default 要還原個別檔案到先前的狀態非常簡單,只要從快照中複製檔案到父資料集。在 [.filename]#.zfs/snapshot# 目錄結構下有一個與先前所做的快照名稱相同的目錄,可以很容易的找到。在下個範例中,我們會示範從隱藏的 [.filename]#.zfs# 目錄還原一個檔案,透過從含有該檔案的最新版快照複製: -[source,bash] +[source,shell] .... # rm /var/tmp/passwd # ls -a /var/tmp @@ -1741,7 +1741,7 @@ passwd vi.recover 執行 `ls .zfs/snapshot` 時,雖然 `snapdir` 可能已經設為隱藏,但仍可能可以顯示該目錄中的內容,這取決於管理者是否要顯示這些目錄,可以只顯示特定的資料集,而其他的則不顯示。從這個隱藏的 [.filename]#.zfs/snapshot# 複製檔案或目錄非常簡單,除此之外,嘗試其他的動作則會出現以下錯誤: -[source,bash] +[source,shell] .... # cp /etc/rc.conf /var/tmp/.zfs/snapshot/after_cp/ cp: /var/tmp/.zfs/snapshot/after_cp/rc.conf: Read-only file system @@ -1760,7 +1760,7 @@ cp: /var/tmp/.zfs/snapshot/after_cp/rc.conf: Read-only file system 要示範複本功能會用到這個範例資料集: -[source,bash] +[source,shell] .... # zfs list -rt all camino/home/joe NAME USED AVAIL REFER MOUNTPOINT @@ -1771,7 +1771,7 @@ camino/home/joe@backup 0K - 87K - 會使用到複本一般是要在可以保留快照以便出錯時可還原的情況下使用指定的資料集做實驗,由於快照並無法做更改,所以會建立一個可以讀/寫的快照複本。當在複本中做完想要執行的動作後,便可以提升複本成資料集,然後移除舊的檔案系統。嚴格來說這並非必要,因為複本與資料集可同時存在,不會有任何問題。 -[source,bash] +[source,shell] .... # zfs clone camino/home/joe@backup camino/home/joenew # ls /usr/home/joe* @@ -1788,7 +1788,7 @@ usr/home/joenew 1.3G 31k 1.3G 0% /usr/home/joenew 建立完的複本便有與建立快照時狀態相同的資料集,現在複本可以獨立於原來的資料集來做更改。剩下唯一與資料集之間的關係便是快照,ZFS 會在屬性 `origin` 記錄這個關係,一旦在快照與複本之間的相依關係因為使用 `zfs promote` 提升而移除時,複本的 `origin` 也會因為成為一個完全獨立的資料集而移除。以下範例會示範這個動作: -[source,bash] +[source,shell] .... # zfs get origin camino/home/joenew NAME PROPERTY VALUE SOURCE @@ -1801,7 +1801,7 @@ camino/home/joenew origin - - 做為部份更改之後,例如複製 [.filename]#loader.conf# 到提升後的複本,這個例子中的舊目錄便無須保留,取而代之的是提升後的複本,這個動作可以用兩個連續的指令來完成:在舊資料集上執行 `zfs destroy` 並在與舊資料相似名稱 (也可能用完全不同的名稱) 的複本上執行 `zfs rename`。 -[source,bash] +[source,shell] .... # cp /boot/defaults/loader.conf /usr/home/joenew # zfs destroy -f camino/home/joe @@ -1822,7 +1822,7 @@ usr/home/joe 1.3G 128k 1.3G 0% /usr/home/joe 以下例子將示範使用兩個儲存池來做 ZFS 備份: -[source,bash] +[source,shell] .... # zpool list NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT @@ -1832,7 +1832,7 @@ mypool 984M 43.7M 940M - - 0% 4% 1.00x ONLINE - 名為 _mypool_ 的儲存池為主要的儲存池,資料會定期寫入與讀取的位置。第二個儲存池 _backup_ 用來待命 (Standby),萬一主要儲存池無法使用時可替換。注意,ZFS 並不會自動做容錯移轉 (Fail-over),必須要由系統管理者在需要的時候手動完成。快照會用來提供一個與檔系統一致的版本來做備份,_mypool_ 的快照建立之後,便可以複製到 _backup_ 儲存池,只有快照可以做備份,最近一次快照之後所做的變更不會含在內容裡面。 -[source,bash] +[source,shell] .... # zfs snapshot mypool@backup1 # zfs list -t snapshot @@ -1842,7 +1842,7 @@ mypool@backup1 0 - 43.6M - 快照存在以後,便可以使用 `zfs send` 來建立一個代表快照內容的串流,這個串流可以儲存成檔案或由其他儲存池接收。串流會寫入到標準輸出,但是必須要重新導向到一個檔案或轉接到其他地方,否則會錯誤: -[source,bash] +[source,shell] .... # zfs send mypool@backup1 Error: Stream can not be written to a terminal. @@ -1851,7 +1851,7 @@ You must redirect standard output. 要使用 `zfs send` 備份一個資料集,可重新導向到一個位於在已掛載到備份儲存池上的檔案。確定該儲存池有足夠的空間容納要傳送的快照,這裡指的是該快照中內含的所有資料,並非只有上次快照到該快照間的變更。 -[source,bash] +[source,shell] .... # zfs send mypool@backup1 > /backup/backup1 # zpool list @@ -1864,7 +1864,7 @@ mypool 984M 43.7M 940M - - 0% 4% 1.00x ONLINE - 若不想將備份以封存檔案儲存,ZFS 可用實際的檔案系統來接收資料,讓備份的資料可以直接被存取。要取得實際包含在串流中的資料可以用 `zfs receive` 將串流轉換回檔案與目錄。以下例子會以管線符號連接 `zfs send` 及 `zfs receive`,將資料從一個儲存池複製到另一個,傳輸完成後可以直接使用接收儲存池上的資料。一個資料集只可以被複製到另一個空的資料集。 -[source,bash] +[source,shell] .... # zfs snapshot mypool@replica1 # zfs send -v mypool@replica1 | zfs receive backup/mypool @@ -1883,7 +1883,7 @@ mypool 984M 43.7M 940M - - 0% 4% 1.00x ONLINE - `zfs send` 也可以比較兩個快照之間的差異,並且只傳送兩者之間的差異,這麼做可以節省磁碟空間及傳輸時間。例如: -[source,bash] +[source,shell] .... # zfs snapshot mypool@replica2 # zfs list -t snapshot @@ -1898,7 +1898,7 @@ mypool 960M 50.2M 910M - - 0% 5% 1.00x ONLINE - 會建立一個名為 _replica2_ 的第二個快照,這個快照只中只會含有目前與前次快照 _replica1_ 之間檔案系統所做的變更。使用 `zfs send -i` 並指定要用來產生漸進備份串流的快照,串流中只會含有做過更改的資料。這個動作只在接收端已經有初始快照時才可用。 -[source,bash] +[source,shell] .... # zfs send -v -i mypool@replica1 mypool@replica2 | zfs receive /backup/mypool send from @replica1 to mypool@replica2 estimated size is 5.02M @@ -1941,14 +1941,14 @@ mypool@replica2 0 - 55.0M - * 正常會需要 `root` 的權限來傳送與接收串流,這需要可以 `root` 登入到接收端系統。但是,預設因安全性考慮會關閉以 `root` 登入。ZFS 委託 (<<zfs-zfs-allow,ZFS Delegation>>) 系統可以用來允許一個非 `root` 使用者在每個系統上執行各自的發送與接收操作。 * 在傳送端系統上: + -[source,bash] +[source,shell] .... # zfs allow -u someuser send,snapshot mypool .... * 要掛載儲存池,無權限的使用者必須擁有該目錄且必須允許一般的使用者掛載檔案系統。在接收端系統上: + -[source,bash] +[source,shell] .... # sysctl vfs.usermount=1 vfs.usermount: 0 -> 1 @@ -1960,7 +1960,7 @@ vfs.usermount: 0 -> 1 無權限的使用者現在有能力可以接收並掛載資料集,且 _home_ 資料集可以被複製到遠端系統: -[source,bash] +[source,shell] .... % zfs snapshot -r mypool/home@monday % zfs send -R mypool/home@monday | ssh someuser@backuphost zfs recv -dvu recvpool/backup @@ -1975,21 +1975,21 @@ vfs.usermount: 0 -> 1 要設定 [.filename]#storage/home/bob# 的資料集配額為 10 GB: -[source,bash] +[source,shell] .... # zfs set quota=10G storage/home/bob .... 要設定 [.filename]#storage/home/bob# 的參考配額為 10 GB: -[source,bash] +[source,shell] .... # zfs set refquota=10G storage/home/bob .... 要移除 [.filename]#storage/home/bob# 的 10 GB 配額: -[source,bash] +[source,shell] .... # zfs set quota=none storage/home/bob .... @@ -2003,14 +2003,14 @@ vfs.usermount: 0 -> 1 例如,要設定使用者名為 _joe_ 的使用者配額為 50 GB: -[source,bash] +[source,shell] .... # zfs set userquota@joe=50G .... 要移除所有配額: -[source,bash] +[source,shell] .... # zfs set userquota@joe=none .... @@ -2024,14 +2024,14 @@ vfs.usermount: 0 -> 1 要設定群組 _firstgroup_ 的配額為 50 GB 可使用: -[source,bash] +[source,shell] .... # zfs set groupquota@firstgroup=50G .... 要移除群組 _firstgroup_ 的配額,或確保該群組未設定配額可使用: -[source,bash] +[source,shell] .... # zfs set groupquota@firstgroup=none .... @@ -2042,7 +2042,7 @@ vfs.usermount: 0 -> 1 有足夠權限的使用者及 `root` 可以使用以下指令列出 [.filename]#storage/home/bob# 的配額: -[source,bash] +[source,shell] .... # zfs get quota storage/home/bob .... @@ -2054,14 +2054,14 @@ vfs.usermount: 0 -> 1 `reservation` 屬性的一般格式為 `reservation=_size_`,所以要在 [.filename]#storage/home/bob# 設定保留 10 GB 的空間可以用: -[source,bash] +[source,shell] .... # zfs set reservation=10G storage/home/bob .... 要清除任何保留空間: -[source,bash] +[source,shell] .... # zfs set reservation=none storage/home/bob .... @@ -2070,7 +2070,7 @@ vfs.usermount: 0 -> 1 這個指令會顯示任何已設定於 [.filename]#storage/home/bob# 的 reservation 或 refreservation: -[source,bash] +[source,shell] .... # zfs get reservation storage/home/bob # zfs get refreservation storage/home/bob @@ -2085,7 +2085,7 @@ ZFS 提了多種不同的壓縮演算法,每一種都有不同的優缺點, 管理者可以使用資料集的屬性來監視壓縮的效果。 -[source,bash] +[source,shell] .... # zfs get used,compressratio,compression,logicalused mypool/compressed_dataset NAME PROPERTY VALUE SOURCE @@ -2108,14 +2108,14 @@ mypool/compressed_dataset logicalused 496G - 要開啟去重複功能,需在目標儲存池設定 `dedup` 屬性: -[source,bash] +[source,shell] .... # zfs set dedup=on pool .... 只有要被寫入到儲存池的新資料才會做去重複的動作,先前已被寫入到儲存池的資料不會因此啟動了這個選項而做去重複。查看已開啟去重複屬性的儲存池會如下: -[source,bash] +[source,shell] .... # zpool list NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT @@ -2124,7 +2124,7 @@ pool 2.84G 2.19M 2.83G - - 0% 0% 1.00x ONLINE - `DEDUP` 欄位會顯示儲存池的實際去重複率,數值為 `1.00x` 代表資料尚未被去重複。在下一個例子會在前面所建立的去重複儲存池中複製三份 Port 樹到不同的目錄中。 -[source,bash] +[source,shell] .... # for d in dir1 dir2 dir3; do > mkdir $d && cp -R /usr/ports $d & @@ -2133,7 +2133,7 @@ pool 2.84G 2.19M 2.83G - - 0% 0% 1.00x ONLINE - 已經偵測到重複的資料並做去重複: -[source,bash] +[source,shell] .... # zpool list NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT @@ -2144,7 +2144,7 @@ pool 2.84G 20.9M 2.82G - - 0% 0% 3.00x ONLINE - 去重複並非總是有效益的,特別是當儲存池中的資料本身並沒有重複時。ZFS 可以透過在現有儲存池上模擬開啟去重複功能來顯示可能節省的空間: -[source,bash] +[source,shell] .... # zdb -S pool Simulated DDT histogram: |