- 创建者: 虚拟的现实,上次更新时间:1月 19, 2024 需要 9 分钟阅读时间
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 号创建存储池的。
[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
创建存储池
# 在前面有提到不要使用设备名,而应该使用设备 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 系统的稳健性和数据的可靠性。 尽管为了实现这些功能,我们牺牲了一部分磁盘空间,但这通常是值得的,因为我们换来的是更高的数据安全性和系统可用性。
# 查看对应磁盘信息 [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" 的新文件系统:
zfs create SSD/newfs
配置 LZ4 压缩
一旦你创建了新的文件系统,你可以使用 zfs set 命令来更改它的设置。例如,下面的命令在 "newfs" 文件系统上启用了 LZ4 压缩,并为该文件系统设置了 50GB 的存储配额:
zfs set compression=lz4 SSD/newfs # 后面会详述存储配额管理 zfs set quota=50G SSD/newfs
你可以使用 zfs get 命令来查看文件系统的各种设置。例如,下面的命令显示了 "newfs" 文件系统的配额和挂载点:
zfs get quota SSD/newfs zfs get mountpoint SSD/newfs
- compression=lz4:此命令在文件系统上启用 LZ4 压缩算法。这有助于通过压缩存储在文件系统中的数据来减少存储空间的使用。替代压缩算法包括 gzip(从 1 到 9 的不同级别)和 zle(零长度编码)。
- quota=50G:此命令为文件系统设置 50GB 的存储配额,限制其最大存储空间使用量。
存储配额
在 ZFS 中,你可以为每个文件系统设置配额,这可以防止文件系统使用超过你分配的空间。要设置文件系统配额,你可以使用 zfs set 命令,如下所示:
zfs set quota=50G SSD/newfs
这个命令将 SSD/newfs 文件系统的配额设置为 50GB,这意味着该文件系统不能使用超过 50GB 的空间。 你还可以使用 refquota 来设置一个引用配额,这将仅限制用户数据的使用,而不会计算任何快照或克隆的空间使用情况。例如:
zfs set refquota=50G SSD/newfs
你可以使用 zfs get 命令来检查配额的设置:
zfs get quota SSD/newfs zfs get refquota SSD/newfs
需要注意的是,上述的配额是一种硬限制,意味着一旦达到配额,文件系统将无法写入更多数据。另一方面,你也可以设置一个软限制,也就是 "reservation"。这将确保文件系统始终有一定量的空间可用,即使存储池的其他部分已满。例如,你可以这样设置:
zfs set reservation=30G SSD/newfs
这个命令将 SSD/newfs 文件系统的预留空间设置为 30GB,这意味着无论存储池的使用情况如何,都将保留 30GB 的空间给该文件系统使用。
配置去重功能
去重功能可以帮助你节省存储空间,因为它可以消除存储在文件系统中的重复数据。在 ZFS 中,你可以使用 zfs set 命令来启用去重功能,例如:
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 快照管理
# 查看文件系统,已经存在 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,命令如下:
zfs create -V 10G mypool/myvolume
上述命令中的 -V 选项指定了 ZVOL 的大小,上例中为 10 GB。
在创建 ZVOL 后,它将在/dev/zvol 路径下出现,您可以像使用其他块设备一样使用它。 通过 ZFS 提供的卷,我们能够更好地控制块存储,并利用 ZFS 的强大功能,如快照、压缩和重复数据删除等。而这些功能在传统的块设备中往往无法得到。这就是 ZFS 卷为什么如此强大且独特的原因。
ZFS 卷
# 创建卷 [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 安装与配置
# 安装 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,访问控制列表) 来管理权限。您可以为每个用户或组设置不同的访问权限,例如读、写、执行等。
# 安装 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 包
# 安装客户端 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:
zpool iostat -v
-v 选项可以显示每个存储池中的每个磁盘的详细信息。
zpool status
zpool status 命令显示 ZFS 存储池的健康状况和状态信息。您可以使用此命令来检查存储池是否有故障,并查看关于故障的详细信息。 您可以使用以下命令来运行 zpool status:
zpool status
zfs get all
zfs get all 命令显示 ZFS 文件系统的所有属性,包括当前使用的磁盘空间、可用磁盘空间、数据压缩比率等等。 您可以使用以下命令来运行 zfs get all:
zfs get all
zpool iostat 是一个内建的监视工具,可以实时显示池 I/O 统计信息。要实现持续监视,可以在上面命令后面跟一个数字(刷新间隔,以秒为单位),可以指定刷新间隔,按 Ctrl+C 停止,还可以再跟一个数字指定一共显示多少条记录。
[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 或其他可视化工具来查看这些数据。
- 无标签
添加评论