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 是最安全的选项。