ZFS 的支持從 Ubuntu Wily 15.10 開始做爲技術預覽加入,到 Ubuntu Xenial 16.04 實現完整支持。注意 ZFS 只支持 64位架構。另外,ZFS 僅支持 data storage, 不支持 root filesystem(在18.04通過配置後能夠支持)。html
運行ZFS要求空餘內存多於 2GB,建議 ZFS 系統很多於 8GB 內存。linux
安裝 ZFS, 使用:緩存
sudo apt install zfsutils-linux
下面快速預覽 ZFS, 更多的關於 ZFS的信息請參考 excellent documentation ,由 Aaron Toponce 編寫。安全
爲了節約篇幅,本文檔中 devices 指 /dev/sda /dev/sdb 等等。 使用device路徑 /dev/disk/by-uuid 能夠惟一地表明一個設備從而避免在設備名稱映射改變時啓動失敗。網絡
一個 VDEV 是一個meta-device,表明着一個或多個設備。ZFS 支持 7 中不一樣類型的 VDEV:架構
VDEVS 動態地由 ZFS. 進行分帶。一個 device 能夠被加到 VDEV, 可是不能移除。dom
zpool 是存儲池,從一系列VDEVS中建立出來。更多的 ZFS 文件系統能夠從 ZFS pool 中建立出來。ssh
下面的例子中,名爲 "pool-test"的存儲池從3個物理磁盤驅動器中建立出來:ide
$ sudo zpool create pool-test /dev/sdb /dev/sdc /dev/sdd
Striping 被動態地執行,建立了一個零冗餘的RAID-0存儲池。佈局
注意:若是管理不少存儲驅動器,很容易引發混淆,可使用 /dev/disk/by-id/ 名稱機制,提供基於序列號的驅動器標識。上面的方法主要是爲了方便演示。
查看存儲池的狀態:
$ sudo zpool status pool-test
刪除存儲池:
$ sudo zpool destroy pool-test
下面建立 zpool,包含的 VDEV 有兩個 drives組成爲一個鏡像。
$ sudo zpool create mypool mirror /dev/sdc /dev/sdd
咱們再加兩個驅動器組成的鏡像到存儲池中:
$ sudo zpool add mypool mirror /dev/sde /dev/sdf -f $ sudo zpool status pool: mypool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM mypool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 sde ONLINE 0 0 0 sdf ONLINE 0 0 0
該例子中:
有不少種佈局 VDEVs 的方法來建立一個存儲池(zpool)。
在下面的例子中,咱們使用單個 2GB 文件做爲 VDEV,而後從該虛擬存儲設備建立 zpool :
$ dd if=/dev/zero of=example.img bs=1M count=2048 $ sudo zpool create pool-test /home/user/example.img $ sudo zpool status pool: pool-test state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM pool-test ONLINE 0 0 0 /home/user/example.img ONLINE 0 0 0
該例子中:
ZFS 提供幾個 RAID 選項:
等價於 RAID0。沒有校驗和鏡像用於數據重建恢復。該方法不建議使用,當驅動器失效時會形成數據丟失。下面建立一個條帶化的存儲池,使用了 4 個 VDEVs:
$ sudo zpool create example /dev/sdb /dev/sdc /dev/sdd /dev/sde
相似於 RAID1,使用 2 個以上的VDEVs。對於 N VDEVs,當小於 N-1 個磁盤失效時數據能夠恢復。下面的例子使用 2 個VDEVs建立存儲池。
相似於 RAID10,對於小的隨機讀 I/O 比較好。建立鏡像對,而後基於鏡像進行條帶化。 下面建立 2 x 2 條帶化的鏡像池:
sudo zpool create example mirror /dev/sdb /dev/sdc mirror /dev/sdd /dev/sde
或者:
sudo zpool create example mirror /dev/sdb /dev/sdc sudo zpool add example mirror /dev/sdd /dev/sde
相似於 RAID5, 使用可變寬度的條帶用於奇偶校驗。容許在奇偶校驗的狀況下獲得較大的容量,而又不犧牲太多的性能。容許單個盤失敗的狀況下不丟失信息。建立 4 個VDEV的RAIDZ:
$ sudo zpool create example raidz /dev/sdb /dev/sdc /dev/sdd /dev/sde
相似於 RAID6,與RAIDZ相似但具備雙重奇偶校驗。例如,建立 2 parity 5 VDEV 的 pool:
$ sudo zpool create example raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf
3 parity bits,容許三塊盤失敗而不丟失數據,性能與 RAIDZ2 和 RAIDZ差很少。例如,建立 3 parity 6 VDEV 的pool:
$ sudo zpool create example raidz3 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg
相似 RAID50, RAID60, striped RAIDZ volumes。比 RAIDZ更好的執行性能,可是會減小容量,從而增長了使用成本。例如 2 x RAIDZ:
$ sudo zpool create example raidz /dev/sdb /dev/sdc /dev/sdd /dev/sde $ sudo zpool add example raidz /dev/sdf /dev/sdg /dev/sdh /dev/sdi
ZIL (ZFS Intent Log) 驅動器能夠被添加到 ZFS pool 來加速寫入的能力,適用於任何級別的ZFS RAID。最好使用快速的 SSD來存儲ZIL。從概念上說,ZIL 是一種對於 data 和 metadata 的日誌機制,先寫入而後再刷新爲寫事務。實際上, ZIL 更爲複雜,參考 described in detail here。一個或多個驅動器能夠被用於 ZIL。
例如,加入SSDs 到存儲池 'mypool', 使用:
$ sudo zpool add mypool log /dev/sdg -f
Cache devices 提供在 memory 和 disk的緩衝層。用於改善靜態數據的隨機讀寫性能。
例如,添加緩衝磁盤 /dev/sdh 到存儲池 'mypool', 使用:
$ sudo zpool add mypool cache /dev/sdh -f
ZFS 容許每一個存儲池最多建立 2^64 文件系統。咱們在存儲池 'mypool'建立文件系統,以下:
sudo zfs create mypool/tmp sudo zfs create mypool/projects
刪除文件系統,使用:
sudo zfs destroy mypool/tmp
每個 ZFS 文件系統均可以有屬性設置,例如設置最多 10 gigabytes的使用限額:
sudo zfs set quota=10G mypool/projects
添加壓縮支持:
sudo zfs set compression=on mypool/projects
ZFS snapshot(快照)是 ZFS 文件系統或卷的只讀拷貝。能夠用於保存 ZFS 文件系統的特定時點的狀態,在之後能夠用於恢復該快照,並回滾到備份時的狀態。
下面的例子中,咱們建立 mypool/projects 文件系統的快照:
$ sudo zfs snapshot -r mypool/projects@snap1
能夠查看全部的snapshots列表,使用:
$ sudo zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT mypool/projects@snap1 8.80G - 8.80G -
如今, 'accidentally' 破壞文件而後回滾:
$ rm -rf /mypool/projects $ sudo zfs rollback mypool/projects@snap1
移除snapshot,使用:
$ sudo zfs destroy mypool/projects@snap1
一個ZFS clon是文件系統的可寫的拷貝。一個 ZFS clone 只能從 ZFS snapshot中建立,該 snapshot 不能被銷燬,直到該 clones 也被銷燬爲止。
例如,克隆 mypool/projects,首先建立一個 snapshot 而後 clone:
$ sudo zfs snapshot -r mypool/projects@snap1 $ sudo zfs clone mypool/projects@snap1 mypool/projects-clone
ZFS send 發送文件系統的快照,而後流式傳送到文件或其餘機器。ZFS receive 接收該 stream 而後寫到 snapshot 拷貝,做爲 ZFS 文件系統。 這對於備份和經過網絡發送拷貝 (e.g. using ssh) 來拷貝文件系統。
例如,建立 snapshot 而後 save 到文件:
sudo zfs snapshot -r mypool/projects@snap2 sudo zfs send mypool/projects@snap2 > ~/projects-snap.zfs
..而後接收回來:
sudo zfs receive -F mypool/projects-copy < ~/projects-snap.zfs
Ditto blocks 建立更多的冗餘拷貝。對於只有一個設備的 storage pool ,ditto blocks are spread across the device, trying to place the blocks at least 1/8 of the disk apart。對於多設備的 pool,ZFS 試圖分佈 ditto blocks 到多個 獨立的 VDEVs. 1 到 3 份拷貝能夠被設置。設置三份拷貝到 mypool/projects:
$ sudo zfs set copies=3 mypool/projects
ZFS dedup 將丟棄重複數據塊,並以到現有數據塊的引用來替代。這將節約磁盤空間,大須要大量的內存。內存中的去重記錄表須要消耗大約 ~320 bytes/block。表格尺寸越大,寫入時就會越慢。
啓用去重功能在 mypool/projects, 使用:
$ sudo zfs set dedup=on mypool/projects
爲了更多的去重 pros/cons ,參考 http://constantin.glez.de/blog/2011/07/zfs-dedupe-or-not-dedupe 。
初始化數據完整性檢測,經過 zfs scrub 命令執行。如:
$ sudo zpool scrub mypool
經過zpool status 使用 scrub,例如:
$ sudo zpool status -v mypool
假設有一個 2 x 2 鏡像的zpool:
$ sudo zpool create mypool mirror /dev/sdc /dev/sdd mirror /dev/sde /dev/sdf -f $ sudo zpool status pool: mypool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM mypool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 sde ONLINE 0 0 0 sdf ONLINE 0 0 0
填充數據,而後檢查:
$ dd if=/dev/urandom of=/mypool/random.dat bs=1M count=4096 $ md5sum /mypool/random.dat f0ca5a6e2718b8c98c2e0fdabd83d943 /mypool/random.dat
模擬 catastrophic data loss,覆蓋 VDEV devices:
$ sudo dd if=/dev/zero of=/dev/sde bs=1M count=8192
初始化 scrub:
$ sudo zpool scrub mypool
而後檢測狀態:
$ sudo zpool status pool: mypool state: ONLINE status: One or more devices has experienced an unrecoverable error. An attempt was made to correct the error. Applications are unaffected. action: Determine if the device needs to be replaced, and clear the errors using 'zpool clear' or replace the device with 'zpool replace'. see: http://zfsonlinux.org/msg/ZFS-8000-9P scan: scrub in progress since Tue May 12 17:34:53 2015 244M scanned out of 1.91G at 61.0M/s, 0h0m to go 115M repaired, 12.46% done config: NAME STATE READ WRITE CKSUM mypool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 sde ONLINE 0 0 948 (repairing) sdf ONLINE 0 0 0
...從 pool移除驅動器:
$ sudo zpool detach mypool /dev/sde
..熱切換,而後添加一個新的:
$ sudo zpool attach mypool /dev/sdf /dev/sde -f
..而後初始化scrub,修復 2 x 2 mirror:
$ sudo zpool scrub mypool
如以前提到,ZFS支持數據的壓縮。經過現代的 CPUs,壓縮減小了數據尺寸,從而讀寫的數據量減小而得到更好的 I/O。ZFS提供了一系列的壓縮方法。缺省的是 lz4 (a high performance replacement of lzjb) ,提供了較快的壓縮和解壓縮效率和較高的壓縮比。能夠設置壓縮的級別。
sudo zfs set compression=gzip-9 mypool
以及設置壓縮的類型:
sudo zfs set compression=lz4 mypool
檢查壓縮比:
sudo zfs get compressratio
lz4 比其它的要快,lz4 是最安全的選項。