版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

ZFS 简介

 ZFS 是一种先进的文件系统,它将传统的文件系统和卷管理器的功能集合到一起。ZFS 最初由 Sun Microsystems 开发,现在在开源社区的驱动下持续发展,被广泛应用在各种环境中,从小型家用 NAS 到大型商用存储服务器。

ZFS 提供了许多强大的特性,包括保护数据完整性、存储池、快照、克隆、数据压缩和去重、以及 RAID-Z 等。其中,保护数据完整性是 ZFS 的核心特性,通过校验和修复机制,ZFS 可以防止数据在传输和存储过程中的任何损坏。而存储池和 RAID-Z 则为用户提供了强大而灵活的存储管理能力。

ZFS 基本概念和术语

 池(Pools)、虚拟设备(vdevs)、数据集(datasets)

  • 池:ZFS 池是为数据集提供空间的存储设备的集合。池允许您将多个物理存储设备组合成一个逻辑存储单元。
  • vdevs(虚拟设备):vdevs 是 ZFS 池的构建块。它们可以是单个磁盘、镜像、RAIDZ 组或其他类型的设备。ZFS 池由一个或多个 vdev 组成。
  • 数据集:数据集是在 ZFS 中存储和管理数据的主要方式。它们可以是文件系统、卷或快照。

 ZFS 文件系统

  •  ZFS 文件系统是一种分层存储系统,其行为类似于传统的 Unix 风格的文件系统。
  • 它支持所有标准文件和目录操作,如创建、删除和修改文件和目录。
  • ZFS 文件系统从其父数据集继承属性,例如压缩、重复数据删除和加密设置。
  • ZFS 文件系统可以进行快照、克隆和回滚,使其适用于管理版本化文件存储和备份。
  • 它们会自动安装在该 /pool_name/filesystem_name 目录下,并且可以像访问任何其他目录一样访问。

ZFS 卷

  • ZFS 卷是一种块设备,可以用任何文件系统格式化,例如 ext 4 或 XFS。
  • 它是一个固定大小的存储单元,充当虚拟磁盘,将原始存储呈现给其他系统或应用程序。
  • ZFS 卷不从其父数据集继承属性,也不支持快照和克隆等特定于 ZFS 的功能。
  • 在访问和使用它们之前,需要对其进行格式化和挂载。
  •  ZFS 卷可用于为需要块级访问的应用程序提供存储,例如虚拟机、数据库或 iSCSI 目标。

快照和克隆

  • 快照:ZFS 快照是数据集的时间点副本。快照是节省空间的,因为它们只存储当前状态和快照状态之间的差异。
  • 克隆:ZFS 克隆是快照的可写副本。它与快照共享其存储空间,仅将额外空间用于对克隆所做的更改。

RAID 级别和冗余

ZFS 支持多种 RAID 级别和冗余机制,如镜像、RAIDZ(类似 RAID 5)、RAIDZ 2(类似 RAID 6)、RAIDZ 3。这些配置可保护您的数据免受磁盘故障的影响并提高整体数据完整性。

RAID-Z 是 ZFS 文件系统中的一种数据保护和冗余方案,它是传统的 RAID(冗余独立磁盘阵列)的一种改进版,克服了 RAID 中的 "写入洞" 问题,同时在保证数据安全性的基础上,最大化地利用了磁盘的存储空间。

RAID-Z 有三种不同的类型,分别是 RAID-Z 1,RAID-Z 2 和 RAID-Z 3。

  • RAID-Z 1:RAID-Z 1 类似于传统的 RAID 5,它允许任何一个磁盘失败,而不会导致数据丢失。它使用了一种叫做分布式奇偶校验的技术来实现数据冗余。但是,如果在替换并重建失败的磁盘期间,另一个磁盘发生故障,那么数据将会丢失。
  • RAID-Z 2:RAID-Z 2 对应的是传统的 RAID 6,它允许同时有两个磁盘失败,而不会导致数据丢失。RAID-Z 2 提供了更高的数据安全性,但是,需要牺牲更多的磁盘空间用于冗余数据存储。
  • RAID-Z 3:RAID-Z 3 是 ZFS 特有的,它允许同时有三个磁盘失败,而不会导致数据丢失。RAID-Z 3 提供了极高的数据安全性,但是,需要牺牲更多的磁盘空间用于冗余数据存储。

总的来说,RAID-Z 的不同类型提供了不同级别的数据保护。选择哪种类型,取决于你对数据安全性和存储空间利用率的权衡。

存储池简介

 存储池,或简称为 "池",在 ZFS 中具有至关重要的地位。它们是一组存储设备的集合,这些设备被聚合并提供一块共享的、连续的存储空间,以供 ZFS 数据集使用。

ZFS 的池模型创新性地简化了存储管理,它摆脱了传统文件系统需要预定义分区和大小的限制,为用户提供了更高的灵活性和更强的容错能力。

 重点说明: 在创建存储池的时候,不建议使用 /dev/sdb 设备名称来创建存储池,因为重启服务器以后设备名称有可能发生变化,所以最好使用设备 ID 号,ZFS 是支持基于设备 ID 号创建存储池的。 

代码块
languagebash
[root@qmini-nas ~]# ls -l /dev/disk/by-id | grep scsi-0ATA_SanDisk_SDSSDH31_180546800457
lrwxrwxrwx 1 root root  9 Jun 26 22:23 scsi-0ATA_SanDisk_SDSSDH31_180546800457 -> ../../sdb
 
[root@qmini-nas ~]# zpool status
  pool: SSD
 state: ONLINE
config:
 
        NAME                                       STATE     READ WRITE CKSUM
        SSD                                        ONLINE       0     0     0
          scsi-0ATA_SanDisk_SDSSDH31_180546800457  ONLINE       0     0     0
          scsi-0ATA_SanDisk_SDSSDH31_181290801368  ONLINE       0     0     0
          scsi-0ATA_SanDisk_SDSSDH31_180546801146  ONLINE       0     0     0
          scsi-0ATA_SanDisk_SDSSDH31_181325802022  ONLINE       0     0     0
          scsi-0ATA_SanDisk_SDSSDH31_180546801835  ONLINE       0     0     0
 
errors: No known data errors

创建存储池 

代码块
languagebash
# 在前面有提到不要使用设备名,而应该使用设备 ID 号来创建zpool。
zpool create SSD raidz /dev/disk/by-id/scsi-0ATA_SanDisk_SDSSDH31_180546800457 /dev/disk/by-id/scsi-0ATA_SanDisk_SDSSDH31_181290801368 /dev/disk/by-id/scsi-0ATA_SanDisk_SDSSDH31_180546801146 /dev/disk/by-id/scsi-0ATA_SanDisk_SDSSDH31_181325802022 /dev/disk/by-id/scsi-0ATA_SanDisk_SDSSDH31_180546801835
 
# 查看对应存储池
[root@qmini-nas ~]# zpool status
  pool: SSD
 state: ONLINE
config:
 
        NAME                                       STATE     READ WRITE CKSUM
        SSD                                        ONLINE       0     0     0
          scsi-0ATA_SanDisk_SDSSDH31_180546800457  ONLINE       0     0     0
          scsi-0ATA_SanDisk_SDSSDH31_181290801368  ONLINE       0     0     0
          scsi-0ATA_SanDisk_SDSSDH31_180546801146  ONLINE       0     0     0
          scsi-0ATA_SanDisk_SDSSDH31_181325802022  ONLINE       0     0     0
          scsi-0ATA_SanDisk_SDSSDH31_180546801835  ONLINE       0     0     0
 
errors: No known data errors

在创建 ZFS 存储池之后,我们注意到每个磁盘都有一个 8 M 的分区被单独划分出来。这是因为在构建 ZFS 存储池的过程中,ZFS 会在每个磁盘上预保留一块空间,这部分空间一般不直接用于存储用户数据,而是被用于储存 ZFS 元数据,包括 RAID 相关的信息。

每个 ZFS vdev(即每个单独的硬盘)都会携带这样的 ZFS 元数据,例如校验和、RAID 重建信息等。这些元数据帮助实现了 ZFS 的核心特性,包括数据完整性校验、自我修复和 RAID 冗余等。在一个由多个磁盘构成的 ZFS 存储池中,每个磁盘都将储存该存储池的元数据,包括其他磁盘的状态信息。

这意味着即使有磁盘出现故障,ZFS 仍然可以借助其他磁盘上的元数据来恢复数据,保持系统的正常运行。这一设计是 ZFS 的核心部分,它保证了 ZFS 系统的稳健性和数据的可靠性。 尽管为了实现这些功能,我们牺牲了一部分磁盘空间,但这通常是值得的,因为我们换来的是更高的数据安全性和系统可用性。 

代码块
languagebash
# 查看对应磁盘信息
[root@localhost ~]# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0 931.5G  0 disk 
├─sda1        8:1    0 931.5G  0 part 
└─sda9        8:9    0     8M  0 part 
sdb           8:16   0 223.6G  0 disk 
├─sdb1        8:17   0   600M  0 part /boot/efi
├─sdb2        8:18   0     1G  0 part /boot
└─sdb3        8:19   0   222G  0 part 
  ├─rl-root 253:0    0    70G  0 lvm  /
  ├─rl-swap 253:1    0   7.8G  0 lvm  [SWAP]
  └─rl-home 253:2    0 144.2G  0 lvm  /home
sdc           8:32   0 931.5G  0 disk 
├─sdc1        8:33   0 931.5G  0 part 
└─sdc9        8:41   0     8M  0 part 
sdd           8:48   0 931.5G  0 disk 
├─sdd1        8:49   0 931.5G  0 part 
└─sdd9        8:57   0     8M  0 part 
sde           8:64   0 931.5G  0 disk 
├─sde1        8:65   0 931.5G  0 part 
└─sde9        8:73   0     8M  0 part 
sdf           8:80   0 931.5G  0 disk 
├─sdf1        8:81   0 931.5G  0 part 
└─sdf9        8:89   0     8M  0 part 
 
# 在创建存储池的时候,会自动创建一个与存储池名称相同的文件系统
[root@localhost ~]# df -lh
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             4.0M     0  4.0M   0% /dev
tmpfs                7.7G     0  7.7G   0% /dev/shm
tmpfs                3.1G  8.7M  3.1G   1% /run
/dev/mapper/rl-root   70G  3.7G   67G   6% /
/dev/sdb2           1014M  303M  712M  30% /boot
/dev/sdb1            599M  7.0M  592M   2% /boot/efi
/dev/mapper/rl-home  145G  1.1G  144G   1% /home
tmpfs                1.6G  4.0K  1.6G   1% /run/user/0
SSD                  3.6T  128K  3.6T   1% /SSD
 
# 查看文件系统信息
[root@localhost ~]# zfs list SSD
NAME   USED  AVAIL     REFER  MOUNTPOINT
SSD    153K  3.52T     35.1K  /SSD
 
# 删除存储池
[root@localhost ~]# zpool destroy SSD
 
# 没有可用的存储池
[root@localhost ~]# zpool status
no pools available
 
# 检查文件系统属性
[root@localhost SSD]# zfs get all SSD
NAME  PROPERTY              VALUE                  SOURCE
SSD   type                  filesystem             -
SSD   creation              Thu Jun 15 20:30 2023  -
SSD   used                  232K                   -
SSD   available             3.52T                  -
SSD   referenced            35.9K                  -
SSD   compressratio         1.00x                  -
SSD   mounted               yes                    -
SSD   quota                 none                   default
SSD   reservation           none                   default
SSD   recordsize            128K                   default
SSD   mountpoint            /SSD                   default
SSD   sharenfs              off                    default # 是否启动共享nfs
......略

ZFS  文件系统管理

ZFS (Zettabyte File System) 不仅是一个文件系统,它也是一种卷管理器,允许你管理存储池并为其创建文件系统。创建额外的文件系统的主要原因是可以针对不同的工作负载或数据类型进行独立的管理和优化。

为何需要创建更多的文件系统?

当你创建一个 ZFS 存储池时,系统会自动创建一个顶级文件系统,它与存储池的名称相同。这对许多用例来说已经足够了,但是 ZFS 还允许你在一个存储池内部创建更多的文件系统。

每个 ZFS 文件系统都可以有自己的设置,包括压缩、重复数据删除(deduplication)、快照和备份策略。这提供了极大的灵活性,你可以根据需要定制每个文件系统的行为。

例如,你可能有一个文件系统用于存储文档,它可以启用压缩和重复数据删除,以节省存储空间。同时,你可能有另一个文件系统用于存储数据库文件,这个文件系统可能会禁用压缩和重复数据删除,以获得更好的性能。

创建与配置文件系统

在创建新的文件系统时,你可以使用 zfs create 命令。例如,下面的命令在名为 "SSD" 的存储池中创建了一个名为 "newfs" 的新文件系统:

代码块
languagebash
zfs create SSD/newfs

配置 LZ4 压缩

一旦你创建了新的文件系统,你可以使用 zfs set 命令来更改它的设置。例如,下面的命令在 "newfs" 文件系统上启用了 LZ4 压缩,并为该文件系统设置了 50GB 的存储配额:


代码块
languagebash
zfs set compression=lz4 SSD/newfs
# 后面会详述存储配额管理 
zfs set quota=50G SSD/newfs


你可以使用 zfs get 命令来查看文件系统的各种设置。例如,下面的命令显示了 "newfs" 文件系统的配额和挂载点:


代码块
languagebash
zfs get quota SSD/newfs
zfs get mountpoint SSD/newfs


  • compression=lz4:此命令在文件系统上启用 LZ4 压缩算法。这有助于通过压缩存储在文件系统中的数据来减少存储空间的使用。替代压缩算法包括 gzip(从 1 到 9 的不同级别)和 zle(零长度编码)。
  • quota=50G:此命令为文件系统设置 50GB 的存储配额,限制其最大存储空间使用量。

存储配额

在 ZFS 中,你可以为每个文件系统设置配额,这可以防止文件系统使用超过你分配的空间。要设置文件系统配额,你可以使用 zfs set 命令,如下所示:

代码块
languagebash
zfs set quota=50G SSD/newfs

 这个命令将 SSD/newfs 文件系统的配额设置为 50GB,这意味着该文件系统不能使用超过 50GB 的空间。 你还可以使用 refquota 来设置一个引用配额,这将仅限制用户数据的使用,而不会计算任何快照或克隆的空间使用情况。例如:

代码块
languagebash
zfs set refquota=50G SSD/newfs

 你可以使用 zfs get 命令来检查配额的设置:


代码块
languagebash
zfs get quota SSD/newfs
zfs get refquota SSD/newfs


需要注意的是,上述的配额是一种硬限制,意味着一旦达到配额,文件系统将无法写入更多数据。另一方面,你也可以设置一个软限制,也就是 "reservation"。这将确保文件系统始终有一定量的空间可用,即使存储池的其他部分已满。例如,你可以这样设置:

代码块
languagebash
zfs set reservation=30G SSD/newfs

 这个命令将 SSD/newfs 文件系统的预留空间设置为 30GB,这意味着无论存储池的使用情况如何,都将保留 30GB 的空间给该文件系统使用。

配置去重功能

去重功能可以帮助你节省存储空间,因为它可以消除存储在文件系统中的重复数据。在 ZFS 中,你可以使用 zfs set 命令来启用去重功能,例如:

代码块
languagebash
zfs set dedup=on SSD/newfs

这个命令在 "newfs" 文件系统上启用了去重功能。需要注意的是,ZFS 去重功能的效率会受到内存限制的影响,如果内存不足,可能会导致性能下降。

因此,在启用此功能之前,你需要评估你的系统是否有足够的内存来支持去重功能。此外,去重功能也会增加存储系统的复杂性。在某些情况下,压缩可能是一种更好的选择,因为它同样可以减少存储空间的使用,但不需要消耗那么多的内存。 

ZFS 快照管理

ZFS 快照简介

ZFS 快照是存储池某个时间点的只读副本。与其他文件系统的快照方法不同,ZFS 快照不需要复制或移动数据,因此创建和删除快照非常快,且不会对系统性能产生大的影响。

此外,因为 ZFS 快照只存储自快照创建后数据的改变,所以它们使用的空间非常小。 ZFS 快照工作原理基于 ZFS 的 copy-on-write 机制。在 ZFS 中,当数据被修改时,ZFS 不是直接覆盖原有的数据,而是在不同的位置写入新的数据。只有在新的数据成功写入后,ZFS 才会更新指向这些数据的指针。

这种机制保证了 ZFS 操作的原子性,防止了数据的部分写入,从而保证了数据的一致性。 当创建 ZFS 快照时,ZFS 会保留一个指向当前数据状态的指针。这意味着即使数据被修改,原有的数据仍然可以通过快照访问。因此,ZFS 快照只需要存储自快照创建后数据的改变,而原有的数据则由存储池和所有的快照共享。

ZFS 快照有许多用途。例如,您可以使用快照来保护数据,防止误删除或误修改。您也可以使用快照来创建数据的历史版本,以便于恢复旧的数据或分析数据的变化。此外,ZFS 还允许您将快照发送到远程的 ZFS 系统,这可以用于数据备份或复制。

ZFS 快照管理 

代码块
languagebash
# 查看文件系统,已经存在 SSD 文件系统
[root@localhost ~]# df -lh
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             4.0M     0  4.0M   0% /dev
tmpfs                7.7G     0  7.7G   0% /dev/shm
tmpfs                3.1G  8.8M  3.1G   1% /run
/dev/mapper/rl-root   70G  3.7G   67G   6% /
/dev/sdb2           1014M  303M  712M  30% /boot
/dev/sdb1            599M  7.0M  592M   2% /boot/efi
/dev/mapper/rl-home  145G  1.1G  144G   1% /home
tmpfs                1.6G  4.0K  1.6G   1% /run/user/0
SSD                  3.6T  128K  3.6T   1% /SSD
 
# 添加一个文件
[root@localhost SSD]# echo "123" > 1.txt
 
# 查看文件是存在的
[root@localhost SSD]# ls -l
total 2
-rw-r--r-- 1 root root 4 Jun 15 20:36 1.txt
 
# 创建快照,这里是基于 SSD 这个文件系统创建快照,并非 SSD 存储池创建快照。
[root@localhost SSD]# zfs snap SSD@snap20230615
 
# 查看快照信息
[root@localhost SSD]# zfs list -t snapshot
NAME               USED  AVAIL     REFER  MOUNTPOINT
SSD@snap20230615     0B      -     35.9K  -
 
# 删除对应文件
[root@localhost SSD]# rm -rf 1.txt
 
# 文件已经没有了
[root@localhost SSD]# ll
total 0
 
# 回滚快照
[root@localhost SSD]# zfs rollback SSD@snap20230615
 
# 文件恢复
[root@localhost SSD]# ll
total 2
-rw-r--r-- 1 root root 4 Jun 15 20:36 1.txt
 
# 删除快照
[root@localhost SSD]# zfs destroy SSD@snap20230615
 
# 克隆快照与快照不同,克隆快照可以编辑管理文件,快照是只读的。
# 克隆快照,需要先创建一个快照,再进行克隆
[root@localhost SSD]# zfs snap SSD@snap20230615
[root@localhost SSD]# zfs clone SSD@snap20230615 SSD/my_clone
 
# 查看克隆
[root@localhost /]# zfs list
NAME           USED  AVAIL     REFER  MOUNTPOINT
SSD            360K  3.52T     35.9K  /SSD
SSD/my_clone     0B  3.52T     35.9K  /SSD/my_clone
 
# 克隆以后就会自动创建对应文件系统
[root@localhost SSD]# df -lh
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             4.0M     0  4.0M   0% /dev
tmpfs                7.7G     0  7.7G   0% /dev/shm
tmpfs                3.1G  8.8M  3.1G   1% /run
/dev/mapper/rl-root   70G  3.7G   67G   6% /
/dev/sdb2           1014M  303M  712M  30% /boot
/dev/sdb1            599M  7.0M  592M   2% /boot/efi
/dev/mapper/rl-home  145G  1.1G  144G   1% /home
tmpfs                1.6G  4.0K  1.6G   1% /run/user/0
SSD                  3.6T  128K  3.6T   1% /SSD
SSD/my_clone         3.6T  128K  3.6T   1% /SSD/my_clone
 
# 进入对应目录
[root@localhost SSD]# cd /SSD/my_clone
 
# 向 1.txt 文件中添加数据
[root@localhost my_clone]# echo "789" >> 1.txt
 
# 查看文件已经更改
[root@localhost my_clone]# cat 1.txt 
123
456
789
 
# 但我们查看原有/SSD/1.txt没有变化
[root@localhost my_clone]# cat /SSD/1.txt 
123
456
 
# 删除快照克隆
[root@localhost /]# zfs destroy SSD/my_clone

ZFS 卷管理

ZFS 卷简介

ZFS 一个强大的文件系统,除了提供文件级别的存储服务,还能作为块设备提供存储服务,这就是我们所称的 ZFS 卷(ZFS Volume)。

ZFS 卷,也被称作 ZVOL,是一种模拟块设备的数据集。ZVOL 可以被操作系统识别并视为一种物理磁盘,这使得您可以在 ZVOL 上创建文件系统,甚至可以在其上安装操作系统。

和普通的文件系统数据集一样,ZVOL 继承了父数据集的所有属性,包括压缩,预读取,以及重复数据删除等。除此之外,ZVOL 还有一些额外的特性。例如,您可以为 ZVOL 设置一个可选的块大小,这对于某些需要特定块大小的应用(如数据库)非常有用。

而对于一些需要磁盘镜像或虚拟磁盘的应用,如虚拟机或 Docker 容器,ZVOL 更是一个理想的选择。 ZVOL 的创建非常简单,仅需执行一行命令。比如,我们要在存储池 mypool 中创建一个名为 myvolume 的 ZVOL,命令如下:

代码块
languagebash
zfs create -V 10G mypool/myvolume

上述命令中的 -V 选项指定了 ZVOL 的大小,上例中为 10 GB。

在创建 ZVOL 后,它将在/dev/zvol 路径下出现,您可以像使用其他块设备一样使用它。 通过 ZFS 提供的卷,我们能够更好地控制块存储,并利用 ZFS 的强大功能,如快照、压缩和重复数据删除等。而这些功能在传统的块设备中往往无法得到。这就是 ZFS 卷为什么如此强大且独特的原因。 

ZFS 卷

代码块
languagebash
# 创建卷
[root@localhost SSD]# zfs create -V 1G SSD/myvolume
 
# 查看卷信息,这里可以看到SSD/myvolume占用了1.03G空间。
[root@localhost SSD]# zfs list 
NAME           USED  AVAIL     REFER  MOUNTPOINT
SSD           1.03G  3.52T     35.9K  /SSD
SSD/myvolume  1.03G  3.52T     19.2K  -
[root@localhost SSD]# zfs list SSD/myvolume
NAME           USED  AVAIL     REFER  MOUNTPOINT
SSD/myvolume  1.03G  3.52T     19.2K  -
 
# 删除卷
[root@localhost SSD]# zfs destroy SSD/myvolume
[root@localhost SSD]# zfs list 
NAME   USED  AVAIL     REFER  MOUNTPOINT
SSD    237K  3.52T     35.9K  /SSD
 
# 使用 ZFS 卷
# ZFS 卷是块设备,使用前需要用文件系统对其进行格式化。例如,您可以使用 ext4 文件系统格式化 ZFS 卷并将其挂载以使用此存储。
[root@localhost /]# mkfs.ext4 /dev/zvol/SSD/myvolume 
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done                            
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: b7f5c9fd-a702-422d-ae79-35f366191a39
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376
 
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
 
# 创建挂载点
[root@localhost /]# mkdir /mnt/myvolume
 
# 挂载,这样就可以正常使用了
[root@localhost /]# mount /dev/zvol/SSD/myvolume /mnt/myvolume/
[root@localhost /]# df -lh
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             4.0M     0  4.0M   0% /dev
tmpfs                7.7G     0  7.7G   0% /dev/shm
tmpfs                3.1G  8.8M  3.1G   1% /run
/dev/mapper/rl-root   70G  3.7G   67G   6% /
/dev/sdb2           1014M  303M  712M  30% /boot
/dev/sdb1            599M  7.0M  592M   2% /boot/efi
/dev/mapper/rl-home  145G  1.1G  144G   1% /home
tmpfs                1.6G  4.0K  1.6G   1% /run/user/0
SSD                  3.6T  128K  3.6T   1% /SSD
SSD/my_clone         3.6T  128K  3.6T   1% /SSD/my_clone
/dev/zd0             974M   24K  907M   1% /mnt/myvolume
 
[root@localhost /]# echo "1234" > /mnt/myvolume/1.txt
[root@localhost /]# ls -l /mnt/myvolume/
total 20
-rw-r--r-- 1 root root     5 Jun 15 21:22 1.txt
drwx------ 2 root root 16384 Jun 15 21:19 lost+found

ZFS 配置 NFS 共享

NFS 与 ZFS 权限控制

NFS 和 ZFS 权限系统有两个不同层次的控制,它们都需要得到满足才能进行文件操作。

  • NFS 访问控制sharenfs=rw=@172.16.0.0/16 此选项指定对 172.16.0.0/16 网段主机共享有读写访问。这个选项控制了哪些主机可以访问 NFS 共享,以及它们可以进行什么操作。如果一个主机不在允许的网段内,或者 sharenfs 选项只给予了读取(ro)权限,那么该主机将无法对共享进行写入。
  • 文件系统权限:即使 NFS 允许某个主机写入共享,访问登录账号也需要在文件系统级别拥有写入权限。这个权限由文件或目录的所有者、组和其他用户的读/写/执行权限决定,通常通过 chmod 和 chown 命令管理。例如,如果一个目录的权限被设置为 755,那么只有所有者才能写入这个目录,而组用户和其他用户只能读取和执行。为了让所有用户都能写入目录,您需要将其权限设置为777。

这两个层次的权限控制提供了灵活性,但也增加了复杂性。例如,我们可以允许所有主机访问 NFS 共享,但只允许某些用户写入,或者可以只允许某些主机访问共享,但允许所有用户写入。可以根据自身的安全需求和使用场景来配置这两个层次的权限。

此外,ZFS 还提供了一些其他的权限管理特性,例如 ACLs(Access Control Lists,访问控制列表)。ACLs 提供了比基本的文件系统权限更细粒度的权限控制,允许对单个用户或组设置特定的权限。然而,使用 ACLs 可能会增加配置的复杂性,需要根据具体需求来决定是否使用。

ZFS NFS 安装与配置

代码块
languagebash
# 安装 NFS 服务
[root@localhost /]# dnf install nfs-utils -y
 
# 启动并设置开机自启动
[root@localhost /]# systemctl enable --now nfs-server.service
 
# 允许所有用户增、删、改
[root@localhost /]# zfs set sharenfs=on SSD
[root@localhost /]# zfs get sharenfs
NAME              PROPERTY  VALUE     SOURCE
SSD               sharenfs  on        local
SSD@snap20230615  sharenfs  -         -
 
# 允许172.16.0.0/16用户能够读写SSD NFS
[root@localhost /]# zfs set sharenfs=rw=@172.16.0.0/16 SSD
 
# 查看 NFS 共享
[root@localhost /]# zfs get sharenfs
NAME              PROPERTY  VALUE              SOURCE
SSD               sharenfs  rw=@172.16.0.0/16  local
SSD@snap20230615  sharenfs  -                  -
 
# 修改配置后,需要重启服务
[root@localhost /]# systemctl restart nfs-server
 
# 查看挂载点信息
[root@localhost /]# showmount -e
Export list for localhost.localdomain:
/SSD 172.16.0.0/16
 
# 查看是否支持NFSv3 和 NFSv4,这是可以看到同时支持v3和v4
[root@localhost /]# rpcinfo -p localhost | grep nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
 
# 创建挂载点
[root@localhost /]# mkdir /NFS
 
# 挂载对应文件系统,系统默认使用NFSv4协议
[root@localhost /]# mount -t nfs 172.16.0.1:/SSD /NFS
[root@localhost /]# mount -l | grep NFS
172.16.0.1:/SSD on /NFS type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.16.0.1,local_lock=none,addr=172.16.0.1)
 
# 创建目录失败,这是因为没有文件系统权限
[root@localhost /]# mkdir /NFS/789
mkdir: cannot create directory ‘/NFS/789’: Permission denied
 
# 设置权限
[root@localhost /]# chmod -R 777 /SSD
 
# 再创建目录
[root@localhost /]# mkdir /NFS/789
[root@localhost /]# ls -l /NFS
total 2
-rw-r--r-- 1 nobody nobody 0 Jun 16 10:06 1.txt
drwxrwxrwx 2 root   root   2 Jun 15 21:46 123
drwxr-xr-x 2 nobody nobody 2 Jun 16 10:40 789
 
# 指定使用 NFSv3
[root@localhost /]# mount -t nfs -o vers=3 172.16.0.1:/SSD /NFS
[root@localhost /]# mount -l | grep NFS
172.16.0.1:/SSD on /NFS type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=172.16.0.1,mountvers=3,mountport=20048,mountproto=udp,local_lock=none,addr=172.16.0.1)
 
# NFS 客户端配置
dnf install nfs-utils -y
systemctl enable --now nfs-client.target
mount -t nfs -o vers=4 172.16.0.1:/SSD /NFS

ZFS 配置 SMB 共享

配置 ZFS SMB 共享相对简单。您可以使用 zfs set sharesmb=on 命令来启用 SMB 共享,然后使用 zfs sharesmb 命令来查看共享的状态。

也可以使用 zfs set sharesmb=off 命令来关闭 SMB 共享。 权限控制方面,ZFS SMB 共享使用 Windows 的 ACLs (Access Control Lists,访问控制列表) 来管理权限。您可以为每个用户或组设置不同的访问权限,例如读、写、执行等。

代码块
languagebash
# 安装 samba 服务
dnf install samba -y
 
# 启动并设置开机自启动
systemctl enable --now smb
 
# 在启用共享的时候,会发现以下错误,但实际共享已开启。
[root@localhost /]# zfs set sharesmb=on SSD
cannot share 'SSD: system error': SMB share creation failed
 
# 检测共享已开启
[root@localhost /]# zfs get sharesmb
NAME              PROPERTY  VALUE     SOURCE
SSD               sharesmb  on        local
SSD@snap20230615  sharesmb  -         -
 
# 重启服务
[root@localhost /]# systemctl restart smb
 
# 关闭共享
[root@localhost /]# zfs set sharesmb=off SSD
 
# 添加已有用户为samba用户,这是需要注意虽然用户名是已有用户,但samba密码与操作系统登录密码是不一样的。
[root@localhost /]# smbpasswd -a root
New SMB password:
Retype new SMB password:
Added user root.
 
# 添加新用户
useradd -g samba -M -s /sbin/nologin admin
# 设置系统账号密码
passwd admin
# 设置共享账号密码
smbpasswd -a admin
 
# 设置共享目录
cat >> /etc/samba/smb.conf << EOF
[SSD]
        path = /SSD
        browseable = yes
        read only = no
EOF
 
# 重启服务,生效配置
systemctl restart smb

客户端配置

Windows 客户端直接通过资源管理器输入 \\172.16.0.1 访问即可。

Linux 客户端可以通过 mount 或 smbclient 命令行工具访问。Rocky Linux 推荐使用 cifs-utils 包 

代码块
languagebash
# 安装客户端
dnf install cifs-utils
dnf install samba-client
 
smbclient -L //172.16.0.1 -U username
 
mount -t cifs //172.16.0.1/SSD /mnt/SSD -o username=username,password=password

ZFS  性能监控与管理

ZFS 内置监控工具

zpool iostat

zpool iostat 是一个用于实时监控 ZFS 存储池 I/O 活动的工具。它可以显示每个存储池的读取、写入和操作的带宽,以及待处理的读取和写入操作的数量。 您可以使用以下命令来运行 zpool iostat

代码块
languagebash
zpool iostat -v

 -v 选项可以显示每个存储池中的每个磁盘的详细信息。

zpool status

zpool status 命令显示 ZFS 存储池的健康状况和状态信息。您可以使用此命令来检查存储池是否有故障,并查看关于故障的详细信息。 您可以使用以下命令来运行 zpool status

代码块
languagebash
zpool status

 zfs get all

zfs get all 命令显示 ZFS 文件系统的所有属性,包括当前使用的磁盘空间、可用磁盘空间、数据压缩比率等等。 您可以使用以下命令来运行 zfs get all:

代码块
languagebash
zfs get all

 zpool iostat 是一个内建的监视工具,可以实时显示池 I/O 统计信息。要实现持续监视,可以在上面命令后面跟一个数字(刷新间隔,以秒为单位),可以指定刷新间隔,按 Ctrl+C 停止,还可以再跟一个数字指定一共显示多少条记录。 

代码块
languagebash
[root@localhost /]# zpool iostat
              capacity     operations     bandwidth 
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
SSD         74.7G  4.46T      0     29  57.6K   195K
 
# 每隔两秒显示一条,共显示5条
[root@localhost /]# zpool iostat 2 5
              capacity     operations     bandwidth 
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
SSD         74.7G  4.46T      0     29  57.6K   195K
SSD         74.7G  4.46T      0      0      0      0
SSD         74.7G  4.46T      0      0      0      0
SSD         74.7G  4.46T      0    100      0   478K
SSD         74.7G  4.46T      0      0      0      0
 
# 使用-v参数可以显示详细信息,池里的每个设备占一行
[root@localhost /]# zpool iostat -v
                                             capacity     operations     bandwidth 
pool                                       alloc   free   read  write   read  write
-----------------------------------------  -----  -----  -----  -----  -----  -----
SSD                                        74.7G  4.46T      0     29  57.6K   195K
  scsi-0ATA_SanDisk_SDSSDH31_180546800457  14.9G   913G      0      5  11.5K  39.0K
  scsi-0ATA_SanDisk_SDSSDH31_181290801368  15.0G   913G      0      5  11.6K  38.9K
  scsi-0ATA_SanDisk_SDSSDH31_180546801146  15.0G   913G      0      6  11.6K  39.1K
  scsi-0ATA_SanDisk_SDSSDH31_181325802022  14.9G   913G      0      5  11.5K  39.0K
  scsi-0ATA_SanDisk_SDSSDH31_180546801835  14.9G   913G      0      5  11.5K  39.0K
-----------------------------------------  -----  -----  -----  -----  -----  -----
 
# 持续监控
[root@localhost /]# zpool iostat -v 2 3
                                             capacity     operations     bandwidth 
pool                                       alloc   free   read  write   read  write
-----------------------------------------  -----  -----  -----  -----  -----  -----
SSD                                        74.7G  4.46T      0     29  57.6K   195K
  scsi-0ATA_SanDisk_SDSSDH31_180546800457  14.9G   913G      0      5  11.5K  39.0K
  scsi-0ATA_SanDisk_SDSSDH31_181290801368  15.0G   913G      0      5  11.6K  38.9K
  scsi-0ATA_SanDisk_SDSSDH31_180546801146  15.0G   913G      0      6  11.6K  39.1K
  scsi-0ATA_SanDisk_SDSSDH31_181325802022  14.9G   913G      0      5  11.5K  39.0K
  scsi-0ATA_SanDisk_SDSSDH31_180546801835  14.9G   913G      0      5  11.5K  39.0K
-----------------------------------------  -----  -----  -----  -----  -----  -----
                                             capacity     operations     bandwidth 
pool                                       alloc   free   read  write   read  write
-----------------------------------------  -----  -----  -----  -----  -----  -----
SSD                                        74.7G  4.46T      0      0      0      0
  scsi-0ATA_SanDisk_SDSSDH31_180546800457  14.9G   913G      0      0      0      0
  scsi-0ATA_SanDisk_SDSSDH31_181290801368  15.0G   913G      0      0      0      0
  scsi-0ATA_SanDisk_SDSSDH31_180546801146  15.0G   913G      0      0      0      0
  scsi-0ATA_SanDisk_SDSSDH31_181325802022  14.9G   913G      0      0      0      0
  scsi-0ATA_SanDisk_SDSSDH31_180546801835  14.9G   913G      0      0      0      0
-----------------------------------------  -----  -----  -----  -----  -----  -----
                                             capacity     operations     bandwidth 
pool                                       alloc   free   read  write   read  write
-----------------------------------------  -----  -----  -----  -----  -----  -----
SSD                                        74.7G  4.46T      0     83      0   319K
  scsi-0ATA_SanDisk_SDSSDH31_180546800457  14.9G   913G      0      7      0  78.4K
  scsi-0ATA_SanDisk_SDSSDH31_181290801368  15.0G   913G      0     22      0  77.2K
  scsi-0ATA_SanDisk_SDSSDH31_180546801146  15.0G   913G      0      9      0  35.7K
  scsi-0ATA_SanDisk_SDSSDH31_181325802022  14.9G   913G      0     20      0  43.2K
  scsi-0ATA_SanDisk_SDSSDH31_180546801835  14.9G   913G      0     23      0  84.9K
-----------------------------------------  -----  -----  -----  -----  -----  -----

ZFS 第三方监控工具

ZFS 除了其内置的性能监控工具外,还有许多第三方工具可以帮助您更好地监控和理解 ZFS 的性能。下面是一些常见的第三方 ZFS 监控工具:

ZFS on Linux Metrics (ZoL Stats):ZoL Stats 是一个 Grafana 仪表盘,用于显示通过 ZFS on Linux 暴露的度量值。它可以显示存储池和数据集的 IO,以及 ARC(适应性替换缓存)的使用情况等。 

ZFS System Monitor (ZSysMon):ZSysMon 是一个用于监视 ZFS 系统性能的 Shell 脚本。它可以显示存储池的状态,包括读写操作,带宽,等待 I/O,存储池使用等信息。

Collectd-zfs:这是一个 collectd 插件,可以获取和记录 ZFS 的性能统计信息。Collectd 是一个守护程序,可以收集系统和应用程序的性能指标。使用 collectd-zfs 插件,您可以将 ZFS 的性能数据集成到您的现有的监控系统中。

Telegraf & InfluxDB:Telegraf 是一个插件驱动的服务器代理,用于收集和报告指标。InfluxDB 是一个用于存储和查询指标和事件的时间序列数据库。Telegraf 有一个 ZFS 插件,可以收集 ZFS 的性能数据,并将其存储在 InfluxDB 中。然后,您可以使用 Grafana 或其他可视化工具来查看这些数据。 

目录