共计 11459 个字符,预计需要花费 29 分钟才能阅读完成。
导读 | ZFS 文件系统的英文名称为 ZettabyteFileSystem, 也叫动态文件系统(DynamicFileSystem), 是第一个 128 位文件系统。最初是由 Sun 公司为 Solaris10 操作系统开发的文件系统。作为 OpenSolaris 开源计划的一部分,ZFS 于 2005 年 11 月发布,被 Sun 称为是终极文件系统,经历了 10 年的活跃开发,而最新的开发将全面开放,并重新命名为 OpenZFS。 |
ZFS 是一种先进的、高度可扩展的文件系统,最初是由 Sun Microsystems 开发的, 现在 OpenZFS 是项目的一部分。有这么多文件系统可用在 Linux 上, 那自然要问 ZFS 有什么特别之处。不同于其它文件系统, 它不仅是一个文件系统逻辑卷管理器。ZFS 使其受欢迎的特性是:
1. 数据完整性——数据一致性和完整性通过即写即拷和校验技术保证。
2. 存储空间池——可用存储驱动器一起放入称为 zpool 的单个池。
3. 软件 RAID ——像发出一个命令一样,建立一个 raidz 数组。
4. 内置的卷管理器——ZFS 充当卷管理器。
5. Snapshots、克隆、压缩——这些都是一些 ZFS 提供的高级功能。
在本指南中, 我们将学习在 CentOS 7 服务器上如何安装、设置和使用一些重要的 ZFS 命令。
在我们继续之前, 让我们了解一些 ZFS 的常用的术语。
Pool:存储驱动器的逻辑分组,它是 ZFS 的基本构建块,从这里将存储空间分配给数据集。
Datasets:ZFS 文件系统的组件即文件系统、克隆、快照和卷被称为数据集。
Mirror:一个虚拟设备存储相同的两个或两个以上的磁盘上的数据副本,在一个磁盘失败的情况下, 相同的数据是可以用其他磁盘上的镜子。
Resilvering:在恢复设备时将数据从一个磁盘复制到另一个磁盘的过程。
Scrub:擦除用于一致性检验在 ZFS 像在其他文件系统如何使用 fsck。
为了对 CentOS 安装 ZFS,我们需要先安装支持包 EPEL 仓库,然后在 ZFS 存储库上安装所需的 ZFS 包。
yum localinstall --nogpgcheck http://epel.mirror.net.in/epel/7/x86_64/e/epel-release-7-5.noarch.rpm | |
yum localinstall --nogpgcheck http://archive.zfsonlinux.org/epel/zfs-release.el7.noarch.rpm |
现在安装内核开发和 zfs 包,内核开发的软件包是需要 ZFS 建立模块和插入到内核中。
yum install kernel-devel zfs
验证 zfs 模块插入到内核使用的 lsmod 命令,如果没有,使用‘modprobe 命令手动插入它。
[ | ]|
[ | ]|
[ | ]|
zfs 2790271 0 | |
zunicode 331170 1 zfs | |
zavl 15236 1 zfs | |
zcommon 55411 1 zfs | |
znvpair 89086 2 zfs,zcommon | |
spl 92029 3 zfs,zcommon,znvpair |
让我们检查是否我们可以使用 zfs 的命令:
[root@li1467-130 ~]# zfs list | |
no datasets available |
ZFS 主要有两个工具,zpool 和 ZFS。zpool 处理使用磁盘实用程序创建和维护 ZFS 池负责数据的创建和维护。
创建和销毁池
首先验证可用的磁盘创建一个存储池。
[root@li1467-130 ~]# ls -l /dev/sd* | |
brw-rw---- 1 root disk 8, 0 Mar 16 08:12 /dev/sda | |
brw-rw---- 1 root disk 8, 16 Mar 16 08:12 /dev/sdb | |
brw-rw---- 1 root disk 8, 32 Mar 16 08:12 /dev/sdc | |
brw-rw---- 1 root disk 8, 48 Mar 16 08:12 /dev/sdd | |
brw-rw---- 1 root disk 8, 64 Mar 16 08:12 /dev/sde | |
brw-rw---- 1 root disk 8, 80 Mar 16 08:12 /dev/sdf |
创建一个池的驱动器。
zpool create <pool name. .... | |
[root@li1467-130 ~]# zpool create -f zfspool sdc sdd sde sdf |
zpool 状态的命令显示可用池的状态。
[root@li1467-130 ~]# zpool status | |
pool: zfspool | |
state: ONLINE | |
scan: none requested | |
config: | |
NAME STATE READ WRITE CKSUM | |
zfspool ONLINE 0 0 0 | |
sdc ONLINE 0 0 0 | |
sdd ONLINE 0 0 0 | |
sde ONLINE 0 0 0 | |
sdf ONLINE 0 0 0 | |
errors: No known data errors |
验证如果池创建成功。
[root@li1467-130 ~]# df -h | |
Filesystem Size Used Avail Use% Mounted on | |
/dev/sda 19G 1.4G 17G 8% / | |
devtmpfs 488M 0 488M 0% /dev | |
tmpfs 497M 0 497M 0% /dev/shm | |
tmpfs 497M 50M 447M 11% /run | |
tmpfs 497M 0 497M 0% /sys/fs/cgroup | |
tmpfs 100M 0 100M 0% /run/user/0 | |
zfspool 3.7G 0 3.7G 0% /zfspoolv |
如你所见, 使用 zpool 创造了一个池的名字 zfspool 大小 3.7 GB 的空间, 同时挂载在 / zfspool。
用命令 ‘zpool destroy’ 销毁一个地址池:
zpool destroy | |
[root@li1467-130 ~]# zpool destroy zfspool | |
[root@li1467-130 ~]# zpool status | |
no pools available |
现在让我们尝试创建一个简单的镜像池。
zpool create mirror ...
通过重复关键字的驱动器我们可以创建多个镜像。
[root@li1467-130 ~]# zpool create -f mpool mirror sdc sdd mirror sde sdf | |
[root@li1467-130 ~]# zpool status | |
pool: mpool | |
state: ONLINE | |
scan: none requested | |
config: | |
NAME STATE READ WRITE CKSUM | |
mpool 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 | |
errors: No known data errors |
在上面的例子中, 我们创建了每两个磁盘镜像池。
同样的, 我们可以创建一个 raidz 池。
[root@li1467-130 ~]# zpool create -f rpool raidz sdc sdd sde sdf | |
[root@li1467-130 ~]# zpool status | |
pool: rpool | |
state: ONLINE | |
scan: none requested | |
config: | |
NAME STATE READ WRITE CKSUM | |
rpool ONLINE 0 0 0 | |
raidz1-0 ONLINE 0 0 0 | |
sdc ONLINE 0 0 0 | |
sdd ONLINE 0 0 0 | |
sde ONLINE 0 0 0 | |
sdf ONLINE 0 0 0 | |
errors: No known data errors |
一旦创建一个池, 从池中可以添加或删除热备件和缓存设备, 从镜像池和替换设备中连接或者分离。但是冗余和 raidz 设备不能从池中删除。我们将看到如何在这一节中执行这些操作。
我首先创建一个池称为“testpool”组成的两个设备,sdc 和 sdd。另一个设备 sde 将被添加到这里。
[root@li1467-130 ~]# zpool create -f testpool sdc sdd | |
[root@li1467-130 ~]# zpool add testpool sde | |
[root@li1467-130 ~]# zpool status | |
pool: testpool | |
state: ONLINE | |
scan: none requested | |
config: | |
NAME STATE READ WRITE CKSUM | |
testpool ONLINE 0 0 0 | |
sdc ONLINE 0 0 0 | |
sdd ONLINE 0 0 0 | |
sde ONLINE 0 0 0 | |
errors: No known data errors |
正如前面提到的,我不能删除这个新添加的设备, 因为它不是一个冗余或 raidz 池。
[root@li1467-130 ~]# zpool remove testpool sde | |
cannot remove sde: only inactive hot spares, cache, top-level, or log devices can be removed |
但我可以在这个池添加一个空闲磁盘和删除它。
[root@li1467-130 ~]# zpool add testpool spare sdf | |
[root@li1467-130 ~]# zpool status | |
pool: testpool | |
state: ONLINE | |
scan: none requested | |
config: | |
NAME STATE READ WRITE CKSUM | |
testpool ONLINE 0 0 0 | |
sdc ONLINE 0 0 0 | |
sdd ONLINE 0 0 0 | |
sde ONLINE 0 0 0 | |
spares | |
sdf AVAIL | |
errors: No known data errors | |
[root@li1467-130 ~]# zpool remove testpool sdf | |
[root@li1467-130 ~]# zpool status | |
pool: testpool | |
state: ONLINE | |
scan: none requested | |
config: | |
NAME STATE READ WRITE CKSUM | |
testpool ONLINE 0 0 0 | |
sdc ONLINE 0 0 0 | |
sdd ONLINE 0 0 0 | |
sde ONLINE 0 0 0 | |
errors: No known data errors |
同样的, 我们可以使用 attach 命令附加磁盘镜像或非镜像的池和 detach 命令从镜像磁盘池来分离。
zpool attach | |
zpool detach |
当设备发生故障或损坏, 我们可以使用 replace 命令替换它。
zpool replace
在镜像配置当中我们将爆力的测试一个设备。
[root@li1467-130 ~]# zpool create -f testpool mirror sdd sde
这将创建一个镜像磁盘池组成的 SDD 和 SDE。现在,让我们故意损坏 SDD 写零到磁盘中。
[ | ]|
dd: writing to‘/dev/sdd’: No space left on device | |
2048001+0 records in | |
2048000+0 records out | |
1048576000 bytes (1.0 GB) copied, 22.4804 s, 46.6 MB/s |
我们将使用“scrub”命令来检测这种损坏。
[root@li1467-130 ~]# zpool scrub testpool | |
[root@li1467-130 ~]# zpool status | |
pool: testpool | |
state: ONLINE | |
status: One or more devices could not be used because the label is missing or | |
invalid. Sufficient replicas exist for the pool to continue | |
functioning in a degraded state. | |
action: Replace the device using 'zpool replace'. | |
see: http://zfsonlinux.org/msg/ZFS-8000-4J | |
scan: scrub repaired 0 in 0h0m with 0 errors on Fri Mar 18 09:59:40 2016 | |
config: | |
NAME STATE READ WRITE CKSUM | |
testpool ONLINE 0 0 0 | |
mirror-0 ONLINE 0 0 0 | |
sdd UNAVAIL 0 0 0 corrupted data | |
sde ONLINE 0 0 0 | |
errors: No known data errors |
现在我们用 SDC 替换 SDD。
[root@li1467-130 ~]# zpool replace testpool sdd sdc; zpool status | |
pool: testpool | |
state: ONLINE | |
scan: resilvered 83.5K in 0h0m with 0 errors on Fri Mar 18 10:05:17 2016 | |
config: | |
NAME STATE READ WRITE CKSUM | |
testpool ONLINE 0 0 0 | |
mirror-0 ONLINE 0 0 0 | |
replacing-0 UNAVAIL 0 0 0 | |
sdd UNAVAIL 0 0 0 corrupted data | |
sdc ONLINE 0 0 0 | |
sde ONLINE 0 0 0 | |
errors: No known data errors | |
[root@li1467-130 ~]# zpool status | |
pool: testpool | |
state: ONLINE | |
scan: resilvered 74.5K in 0h0m with 0 errors on Fri Mar 18 10:00:36 2016 | |
config: | |
NAME STATE READ WRITE CKSUM | |
testpool ONLINE 0 0 0 | |
mirror-0 ONLINE 0 0 0 | |
sdc ONLINE 0 0 0 | |
sde ONLINE 0 0 0 | |
errors: No known data errors |
我们可以使用导出和导入命令在不同的主机之间迁移存储池。对于这个,在池中使用的磁盘应该从两个系统中可用。
[root@li1467-130 ~]# zpool export testpool | |
[root@li1467-130 ~]# zpool status | |
no pools available |
zpool import 命令列出所有可以利用的池。执行这个系统命令, 你想要导入的池。
[root@li1467-131 ~]# zpool import | |
pool: testpool | |
id: 3823664125009563520 | |
state: ONLINE | |
action: The pool can be imported using its name or numeric identifier. | |
config: | |
testpool ONLINE | |
sdc ONLINE | |
sdd ONLINE | |
sde ONLINE |
现在导入要求的池。
[root@li1467-131 ~]# zpool import testpool | |
[root@li1467-131 ~]# zpool status | |
pool: testpool | |
state: ONLINE | |
scan: none requested | |
config: | |
NAME STATE READ WRITE CKSUM | |
testpool ONLINE 0 0 0 | |
sdc ONLINE 0 0 0 | |
sdd ONLINE 0 0 0 | |
sde ONLINE 0 0 0 | |
errors: No known data errors |
Iostat 命令可以验证池设备 IO 统计。
[root@li1467-130 ~]# zpool iostat -v testpool | |
capacity operations bandwidth | |
pool alloc free read write read write | |
---------- ----- ----- ----- ----- ----- ----- | |
testpool 1.80M 2.86G 22 27 470K 417K | |
sdc 598K 975M 8 9 200K 139K | |
sdd 636K 975M 7 9 135K 139K | |
sde 610K 975M 6 9 135K 139K | |
---------- ----- ----- ----- ----- ----- ----- |
我们现在会移动到 ZFS utility。在这里,我们将看看如何创建、销毁数据集、文件系统压缩、配额和快照。
ZFS 文件系统可以使用 ZFS 创建命令创建
zfs create | |
[root@li1467-130 ~]# zfs create testpool/students | |
[root@li1467-130 ~]# zfs create testpool/professors | |
[root@li1467-130 ~]# df -h | |
Filesystem Size Used Avail Use% Mounted on | |
/dev/sda 19G 1.4G 17G 8% / | |
devtmpfs 488M 0 488M 0% /dev | |
tmpfs 497M 0 497M 0% /dev/shm | |
tmpfs 497M 50M 447M 11% /run | |
tmpfs 497M 0 497M 0% /sys/fs/cgroup | |
testpool 2.8G 0 2.8G 0% /testpool | |
tmpfs 100M 0 100M 0% /run/user/0 | |
testpool/students 2.8G 0 2.8G 0% /testpool/students | |
testpool/professors 2.8G 0 2.8G 0% /testpool/professors |
从上面的输出注意到,在文件系统创建时尽管没有挂载点, 挂载点创建时使用相同的路径关系池。
ZFS 创建允许使用 - o 选项可以指定使用像挂载点,压缩、定额、执行等。
你可以列出可用的文件系统使用 ZFS 的列表:
[ | ]|
NAME USED AVAIL REFER MOUNTPOINT | |
testpool 100M 2.67G 19K /testpool | |
testpool/professors 31K 1024M 20.5K /testpool/professors | |
testpool/students 1.57M 98.4M 1.57M /testpool/students |
我们用销毁选项销毁文件系统。
zfs destroy
现在我们将了解在 ZFS 怎样压缩,在我们开始使用压缩之前, 我们需要使它使用“设置压缩”。
zfs set
一旦这样做,压缩和解压缩将以透明模式发生在文件系统上面。
在我们的示例中, 我将使学生目录使用 lz4 压缩算法压缩。
[root@li1467-130 ~]# zfs set compression=lz4 testpool/students
我现在要复制一个文件到该文件系统大小 15m,并检查它的大小。
[root@li1467-130 /]# cd /var/log | |
[root@li1467-130 log]# du -h secure | |
15M secure | |
[root@li1467-130 ~]# cp /var/log/secure /testpool/students/ | |
[root@li1467-130 students]# df -h . | |
Filesystem Size Used Avail Use% Mounted on | |
testpool/students 100M 1.7M 99M 2% /testpool/students |
注意,使用文件系统的大小仅为 1.7m,文件大小为 15m,我们可以检查压缩比。
[root@li1467-130 ~]# zfs get compressratio testpool | |
NAME PROPERTY VALUE SOURCE | |
testpool compressratio 9.03x |
配额和预订
让我用一个真实的例子来解释配额。假设我们有一个要求,在一所大学,以限制磁盘空间使用的文件系统为教授和学生。让我们假设我们需要分配给教授和学生分为 1GB 和 100MB。我们可以利用“配额”在 ZFS 来满足这一要求。配额确保文件系统使用的磁盘空间的数量不超过规定的限度。保留有助于在实际分配和保证所需的磁盘空间的数量是可用的文件系统。
zfs set quota= | |
zfs set reservation= | |
[ | ]|
[ | ]|
[ | ]|
NAME USED AVAIL REFER MOUNTPOINT | |
testpool 100M 2.67G 19K /testpool | |
testpool/professors 19K 2.67G 19K /testpool/professors | |
testpool/students 1.57M 98.4M 1.57M /testpool/students | |
[ | ]|
[ | ]|
NAME USED AVAIL REFER MOUNTPOINT | |
testpool 100M 2.67G 19K /testpool | |
testpool/professors 19K 1024M 19K /testpool/professors | |
testpool/students 1.57M 98.4M 1.57M /testpool/students |
在上面的例子中,我们已经给教授和学生为 1GB 与 100MB。观察 ZFS 列表结果,最初,他们有 2.67gb 每个的大小和设置配额,价值也随之发生了相应的变化。
快照是在某个时间点的 ZFS 文件系统的只读副本。他们不在 ZFS 池消耗任何额外的空间。我们可以回滚到相同的状态,在稍后的阶段,按用户要求或仅提取一个单一的或一组文件。
我现在就从我们前面的例子,然后在在 testpool/professors 把这个文件系统快照创建一些目录和文件。
[root@li1467-130 ~]# cd /testpool/professors/ | |
[root@li1467-130 professors]# mkdir maths physics chemistry | |
[root@li1467-130 professors]# cat > qpaper.txt | |
Question paper for the year 2016-17 | |
[root@li1467-130 professors]# ls -la | |
total 4 | |
drwxr-xr-x 5 root root 6 Mar 19 10:34 . | |
drwxr-xr-x 4 root root 4 Mar 19 09:59 .. | |
drwxr-xr-x 2 root root 2 Mar 19 10:33 chemistry | |
drwxr-xr-x 2 root root 2 Mar 19 10:32 maths | |
drwxr-xr-x 2 root root 2 Mar 19 10:32 physics | |
-rw-r--r-- 1 root root 36 Mar 19 10:35 qpaper.txt |
快照, 可以使用下面的语法:
zfs snapshot <filesystem|volume@> | |
[root@li1467-130 professors]# zfs snapshot testpool/professors@03-2016 | |
[root@li1467-130 professors]# zfs list -t snapshot | |
NAME USED AVAIL REFER MOUNTPOINT | |
testpool/professors@03-2016 0 - 20.5K |
我现在将删除创建的文件和提取的快照。
[ | ]|
[ | ]|
chemistry maths physics | |
[ | ]|
[ | ]|
[ | ]|
chemistry maths physics qpaper.txt | |
[ | ]|
[ | ]|
[ | ]|
chemistry maths physics qpaper.txt |
已删除的文件返回其位置。
我们可以列出所有可用的快照使用 ZFS 的列表:
[root@li1467-130 ~]# zfs list -t snapshot | |
NAME USED AVAIL REFER MOUNTPOINT | |
testpool/professors@03-2016 10.5K - 20.5K - |
最后, 让我们使用 zfs 摧毁命令销毁快照:
zfs destroy <filesystem|volume@> | |
[root@li1467-130 ~]# zfs destroy testpool/professors@03-2016 | |
[root@li1467-130 ~]# zfs list -t snapshot | |
no datasets available |
在这篇文章中, 您学到了如何在 CentOS 7 安装 ZFS 和使用一些基本的和重要的从 zpool 命令和 ZFS 实用程序。这不是一个全面的列表。ZFS 有着更多的功能, 你可以进一步的探索官方页面。
