ZFS(Zettabyte File System)一个打破过去思维的文件系统,是 Sun Microsystems这家公司所开发出来的全新型态文件系统,因为License的问题所以目前只有在Solaris、Mac、BSD上看得到,ZFS是128bit的文件系统,而它到底有多强呢?别再等待了马上用了你就知道,只能说ZFS真是一个上帝赐给IT人员的好礼物。
为什么选择 ZFS
ZFS 非常的优秀。这是一个真正现代的文件系统,内置的功能对于处理大量的数据很有意义。
ZFS 消除了建立传统 RAID 阵列(独立磁盘冗余阵列)的需要。 相反,您可以创建 ZFS 池,甚至可以随时将驱动器添加到这些池中。 ZFS 池的行为操作与 RAID 几乎完全相同,但功能内置于文件系统中。
ZFS 也可以替代 LVM (逻辑盘卷管理),使您能够动态地进行分区和管理分区,而无需处理底层的细节,也不必担心相关的风险。
这也是一个 CoW (写时复制)文件系统。 这里不会提及太多的技术性,这意味着 ZFS 可以保护您的数据免受逐渐损坏的影响。 ZFS 会创建文件的校验和,并允许您将这些文件回滚到以前的工作版本。
安装 ZFS
在 Ubuntu 上安装 ZFS 非常简单,但对于 最新版本来说,这个 稍有不同。
# Ubuntu 16.04 LTS
sudo apt install zfs
# Ubuntu 17.04 及以后
sudo apt install zfsutils
zfs 中的 池,集,卷术语
ZFS有三个概念:
-
Z池 - zpool
-
Z集 - dataset
-
Z卷 - volume
Z池 zpool create local /dev/sdb /dev/sdc /dev/sdd /dev/sde
这就创建了一个名叫local的Z池,Z池有如下类型:raid1,raid0, raid5,raid6 等。
Z集 当一个Z池创建出来,附带有一个同名的Z集也创建出来了,这里就是 叫 local 这个。注意这个Z集挂载在/local, 这个目录可以做一个正常的目录来用,可以在Z集上创建新的Z集:zfs create local/data
Z卷 创建Z卷:zfs create -V 10G local/vda
Z卷是一个块设备,可以按需要分区,格式化:mkfs.xfs /dev/zvol/local/vda
创建池
在 ZFS 中,池大致相当于 RAID 。 它们很灵活且易于操作。
RAID0
#RAID0 只是把你的硬盘集中到一个池子里面,就像一个巨大的驱动器一样。 它可以提高你的驱动器速度,但是如果你的驱动器有损坏,你可能会失丢失数据。
sudo zpool create your-pool /dev/sdc /dev/sdd
RAID1(镜像)
您可以在 ZFS 中使用 mirror 关键字来实现 RAID1 功能。 RAID1 会创建一个一对一的驱动器副本。 这意味着您的数据一直在备份。 它也提高了性能。 当然,你将一半的存储空间用于了复制。
sudo zpool create your-pool mirror /dev/sdc /dev/sdd
RAID5/RAIDZ1
ZFS 将 RAID5 功能实现为 RAIDZ1。 RAID5 要求驱动器至少是 3 个。
并允许您通过将备份奇偶校验数据写入驱动器空间的 1/n(n 是驱动器数),留下的是可用的存储空间。
如果一个驱动器发生故障,阵列仍将保持联机状态,但应尽快更换发生故障的驱动器。
sudo zpool create your-pool raidz1 /dev/sdc /dev/sdd /dev/sde
RAID6/RAIDZ2
RAID6 与 RAID5 几乎完全相同,但它至少需要四个驱动器。 它将奇偶校验数据加倍,最多允许两个驱动器损坏,而不会导致阵列关闭。
sudo zpool create your-pool raidz2 /dev/sdc /dev/sdd /dev/sde /dev/sdf
RAIDZ3
3奇偶校验位,允许在丢失数据之前发生3个磁盘故障,性能与RAIDZ2和RAIDZ类似。例如,创建3奇偶校验6 VDEV池:
sudo zpool create example raidz3 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg
RAID10(条带化镜像)
RAID10 旨在通过数据条带化提高存取速度和数据冗余来成为一个两全其美的解决方案。 你至少需要四个驱动器,但只能使用一半的空间。 您可以通过在同一个池中创建两个镜像来创建 RAID10 中的池。
sudo zpool create your-pool mirror /dev/sdc /dev/sdd mirror /dev/sde /dev/sdf
或者
sudo zpool create example mirror /dev/sdb /dev/sdc
sudo zpool add example mirror /dev/sdd /dev/sde
嵌套RAIDZ (RAID50, RAID60)
$ 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
还有一些管理工具,一旦你创建了你的池,你就必须使用它们来操作。 首先,检查你的池的状态。
sudo zpool status
当你更新 ZFS 时,你也需要更新你的池。 当您检查它们的状态时,您的池会通知您任何更新。 要更新池,请运行以下命令。
sudo zpool upgrade your-pool
你也可以更新全部池。
sudo zpool upgrade -a
您也可以随时将驱动器添加到池中。 告诉 zpool 池的名称和驱动器的位置,它会处理好一切。
sudo zpool add your-pool /dev/sdx
如果您想破坏池,则可以使用以下命令
sudo zpool destroy pool-name
创建数据集
当我们创建池的时候,默认就会有个同名的集了。
例如这样创建一个池,bash sudo zpool create work /dev/sd{b,c,d,e,f,g}1
成功之后就会有个 叫 work 的数据集了。
~$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
work 102K 10.5T 24K /work
默认的还有挂载点 也会是/work
, 当然可以修改,创建的时候就指定 加上-m
参数。后续更改使用命令:zfs set mountpoint=/fourth work
我们创建其他的数据集
~$ sudo zfs create work/buildfarm
~$ ll /work/
total 5
drwxr-xr-x 3 root root 3 Mar 15 06:37 ./
drwxr-xr-x 21 root root 4096 Mar 15 06:16 ../
drwxr-xr-x 2 root root 2 Mar 15 06:37 buildfarm/
~$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
work 136K 10.5T 24K /work
work/buildfarm 24K 10.5T 24K /work/buildfarm
创建命令就是类似这样的:zfs create name_of_pool/name_of_dataset
,这和创建子目录很像。还可以继续创建个子集
zfs create work/buildfarm/code
和创建多级目录类似,如果父目录不存在加上-p选项。
sudo zfs create work/