当前位置: 首页 > article >正文

Linux|操作系统|zfs文件系统的使用详解

一、前言概述书接上回https://zskjohn.blog.csdn.net/article/details/160741859Linux|操作系统|最新版openzfs编译记录上文将zfs文件系统编译安装完毕了也做了一些总结但总结的不够全面本文在做一些补充其次是zfs文件系统安装完毕后并没有开始实际使用计划在安装过zfs文件系统的服务器上安装pg数据库测试下zfs文件系统的闪回功能是否能够如愿也就是深入研究下zfs文件系统和数据库系统之间的深度融合即落地实践上文的zfs源码和适用于centos7的zfs文件系统 二进制rpm安装包见下面链接有需要的同学自取通过网盘分享的文件zfs文件系统通过网盘分享的文件zfs文件系统链接: https://pan.baidu.com/s/1hBs5xTSkaxhRVORu9AiP-g 提取码: msw7--来自百度网盘超级会员v7的分享注gz文件是zfs文件系统的源码xz文件是内核源码bz文件是在centos7虚拟机上编译出来的产出物里面包括了所有的zfs文件系统的rpm文件https://blog.csdn.net/alwaysbefine/article/details/161169607Linux|操作系统|最新版zfs编译后的适用于centos7的rpm安装包完全离线安装介绍这个是详细的离线centos7使用rpm安装zfs文件系统zfs-2.4.1-newrpm.tar.gz是最新的rpm包包括zfs文件系统部署所需的所有依赖具体如何安装请看这个文章二、zfs文件系统编译成功后的一些总结1、zfs文件系统的编译和gcc版本并没有严重依赖因此编译器使用系统自带的gcc-4.8即可这个是和一些软件的编译的显著区别也就是对编译工具没有太多的依赖问题2、zfs文件系统的编译对于交叉编译是比较全面的因为在编译zfs文件系统的过程中发现了很多关于交叉编译的帮助介绍因此后续可以练习交叉编译3、zfs文件系统编译的make阶段需要修改一些makefile的编译配置根本原因是zfs源码对于系统的cpu性能有一定的检测在虚拟机环境由于虚拟机的局限性问题需要屏蔽对于系统cpu的检测具体的修改配置见上文4、zfs文件系统的正常运行需要更多的内存和cpu据推测是因为该文件系统需要不停的校验数据说通俗点就是该文件系统对于硬件资源需要更多相比于普通文件系统5、zfs文件系统的稳定性并不太确定需要留待以后测试后确定6、zfs文件系统由于是编译的内核模块因此需要写配置文件命令为 echo zfs | sudo tee /etc/modules-load.d/zfs.conf这样即使重启后仍能正确加载zfs模块7、上文make rpm命令生成的zfs-dkms-2.4.1-1.el7.noarch.rpm安装前会校验内核版本如果有低于4.18的内核版本即使该内核并没有使用也会拒绝安装因此解决方案为将不相关的内核全部删除即可删除方法为yum remove 内核版本例如yum remove kernel-3.10.0-1062.el7 kernel-devel-3.10.0-1062.el78、zfs文件系统编译需要无删减的正常的版本号大于4.18的内核长期稳定支持版也就是lt内核版本经反复测试不可以使用ml内核版本也不可用主要原因是一些内核模块在长期稳定版本内已精简去除因此推荐从内核源码编译一个新的全面的内核使用9、rpm安装包其实也是临时编译各位同学安装部署的时候应该就明白了总结完毕以后有新的情况在补充到这里下面开始zfs文件系统的正式使用测试三、关键概念计划先介绍概念下一章节仔细介绍实操问题zfs存储池概念这是ZFS的基石。您将一块或多块物理磁盘或文件聚合为一个统一的存储资源池称为“zpool”。池管理所有底层细节如冗余、设备故障和存储空间分配。操作您首先需要创建池。池的冗余和数据分布策略通过vdev来定义。一个池由一个或多个vdev组成。虚拟设备概念vdev是池中物理设备的基本组织单元。它决定了数据的冗余和性能特性。一旦vdev中的某块磁盘损坏整个vdev将失效进而可能危及整个池。​ 因此vdev的配置至关重要。常见vdev类型类型最少磁盘数冗余能力可用容量典型场景条带​1无。任一磁盘损坏即丢失数据。N * 磁盘容量追求最大性能与容量数据可丢弃。镜像​2可损失N-1块盘。单块磁盘容量高可用性、关键数据如操作系统盘。RAIDZ1​2可损失1块盘。(N-1) * 磁盘容量平衡容量与冗余类似RAID 5。RAIDZ2​3可损失2块盘。(N-2) * 磁盘容量更高安全性类似RAID 6。RAIDZ3​4可损失3块盘。(N-3) * 磁盘容量用于超大阵列提供极高容错。本例中使用RAID-Z2# 使用单个磁盘创建简单池 zpool create mypool /dev/sdb # 创建镜像池类似 RAID1 zpool create mymirror mirror /dev/sdb /dev/sdc # 创建 RAID-Z1 池类似 RAID5允许一块磁盘故障 zpool create myraidz raidz /dev/sdb /dev/sdc /dev/sdd # 创建 RAID-Z2 池允许两块磁盘故障 zpool create myraidz2 raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde本例中VMware虚拟机已添加三块硬盘硬盘情况如下[rootcentos1 opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdd 8:48 0 20G 0 disk sdb 8:16 0 20G 0 disk sr0 11:0 1 4.4G 0 rom /mnt sdc 8:32 0 20G 0 disk sda 8:0 0 200G 0 disk ├─sda2 8:2 0 195G 0 part │ └─centos-root 253:0 0 195G 0 lvm / └─sda1 8:1 0 800M 0 part /boot使用RAID-Z2 池[rootcentos1 opt]# zpool create mypool raidz /dev/sdb /dev/sdc /dev/sdd [rootcentos1 opt]# zpool list NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT mypool 59.5G 217K 59.5G - - 0% 0% 1.00x ONLINE -可以看到创建的时候没有回显这个是正常的情况查看池状态# 查看所有池 zpool list zpool status # 查看详细状态 zpool status -v # 查看池的 I/O 统计 zpool iostat -v[rootcentos1 opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdd 8:48 0 20G 0 disk ├─sdd9 8:57 0 8M 0 part └─sdd1 8:49 0 20G 0 part sdb 8:16 0 20G 0 disk ├─sdb9 8:25 0 8M 0 part └─sdb1 8:17 0 20G 0 part sr0 11:0 1 4.4G 0 rom /mnt sdc 8:32 0 20G 0 disk ├─sdc9 8:41 0 8M 0 part └─sdc1 8:33 0 20G 0 part sda 8:0 0 200G 0 disk ├─sda2 8:2 0 195G 0 part │ └─centos-root 253:0 0 195G 0 lvm / └─sda1 8:1 0 800M 0 part /boot [rootcentos1 opt]# blkid /dev/sda1: UUID277dd10e-fe61-4163-b2cf-45f68cc4903b TYPExfs /dev/sda2: UUIDNbO3jS-79TU-KjIw-SdP9-jRWL-NDfy-AfVC30 TYPELVM2_member /dev/sr0: UUID2019-09-11-18-50-31-00 LABELCentOS 7 x86_64 TYPEiso9660 PTTYPEdos /dev/mapper/centos-root: UUIDf7d7a8b8-998c-4441-b315-8c534a98e663 TYPExfs /dev/sdd1: LABELmypool UUID6972120639383134127 UUID_SUB8401739302345159012 TYPEzfs_member PARTLABELzfs-3f67081b8ea52865 PARTUUID9cf041f5-7aeb-3c49-9d1f-0b159f562d32 /dev/sdd9: PARTUUIDf20d21c8-2840-264a-8101-efef6aaef780 /dev/sdc1: LABELmypool UUID6972120639383134127 UUID_SUB5242556028257818377 TYPEzfs_member PARTLABELzfs-2f3350307d4a9762 PARTUUIDfd4869b6-f082-3245-ba70-4dc5b28a061f /dev/sdc9: PARTUUID9bb803a8-cc83-4248-9a22-0dbc91311de2 /dev/sdb1: LABELmypool UUID6972120639383134127 UUID_SUB13051836529633263918 TYPEzfs_member PARTLABELzfs-a409b2d7f9bd65fa PARTUUID477ad45c-d65a-a746-9097-da6543b32359 /dev/sdb9: PARTUUID1fcb6269-b9ef-b845-b49b-7e0d9f0870f1可以观察到分区已经自动生成现在磁盘是池化状态了还没有开始正式使用因为没有挂载点那么快速使用这个数据池呢非常简单的一个命令zfs set mountpoint/data1 mypool此时可以看到有一个根文件夹/data1已经自动建立属性如下[rootcentos1 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 3.9G 0 3.9G 0% /dev tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs tmpfs 3.9G 8.9M 3.9G 1% /run tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/mapper/centos-root xfs 195G 17G 179G 9% / /dev/sr0 iso9660 4.4G 4.4G 0 100% /mnt /dev/sda1 xfs 797M 209M 588M 27% /boot tmpfs tmpfs 794M 0 794M 0% /run/user/0 mypool zfs 20G 128K 20G 1% /data1可以看到该挂载点的文件系统格式是zfs了但这里需要注意一下大小是20G池子大小创建的时候是三个20G的磁盘现在是只有20G了这里的意思是sdbsdcsdd这三个磁盘任意两个损坏了文件系统仍然是正常的如果是RAID-Z1三个20G的硬盘将会被最终格式化为40G这三个硬盘即使任意一个磁盘损坏文件系统仍然是正常的ZFS 通过“隐藏”底层的磁盘分区复杂性让存储部署变得极其简单。这种“简单粗暴”是 ZFS 设计哲学的一部分——让管理员专注于数据逻辑数据集、快照、属性而非硬件细节分区、扇区、RAID 条带。这里的操作等同于普通的整盘挂载不需要分区和格式化了非常简单快速就挂载好了。那么该方式是非常简单粗暴的并不能对磁盘管理做一个精细化个性化的设置当然也可以分区后在创建池这些是很灵活的例如像这样# 1. 使用 fdisk/gdisk 对磁盘进行分区例如创建 /dev/sdb1 # 2. 使用分区 ID 或磁盘 ID 创建池更稳定可混合使用 sudo zpool create mypool raidz /dev/disk/by-id/scsi-0QEMU_disk1-part1 /dev/disk/by-id/scsi-0QEMU_disk2-part1 # 或者使用分区路径 sudo zpool create mypool raidz /dev/sdb1 /dev/sdc1在生产环境中为了避免 I/O 竞争和简化故障排查强烈建议使用整块磁盘/dev/sdb或通过磁盘 ID/dev/disk/by-id/来创建 ZFS 池。除非你有非常特殊的混合存储需求否则不要轻易使用分区。不使用硬件 RAID 卡HBA 模式直通是目前公认的最佳实践。原因如下端到端数据完整性ZFS 对所有数据块计算校验和Checksum。当它检测到数据损坏比如磁盘静默错误时它能利用 RAID-Z 的冗余数据自动修复坏块。硬件 RAID 通常只保证“写入不丢”但不做读取校验。避免写洞Write Hole传统 RAID 在断电时可能发生“写洞”导致数据不一致。ZFS 采用写时复制Copy-on-Write和事务性模型从根本上杜绝了写洞。运维透明ZFS 的zpool status命令能直接显示哪块物理磁盘响应慢或报错。如果使用硬件 RAID你需要依赖 RAID 卡的管理工具如 MegaCLI才能看到底层磁盘状态运维非常麻烦。删除pool和dataset数据集[rootcentos1 ~]# zfs destroy mypool cannot destroy mypool: operation does not apply to pools use zfs destroy -r mypool to destroy all datasets in the pool use zpool destroy mypool to destroy the pool itself这里要多说一句这些删除仅仅是从zfs的层面删除还是可以随时import和export回来的因为通过fdisk 底层命令可以看到分区仍然存在可以看到是gpt分区属性是Solaris[rootcentos1 ~]# fdisk /dev/sdb WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion. Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): p Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors Units sectors of 1 * 512 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: gpt Disk identifier: 0A78AA6D-AEE1-FB4A-BA23-BE05D1241361 # Start End Size Type Name 1 2048 41924607 20G Solaris /usr zfs-a409b2d7f9bd65fa 9 41924608 41940991 8M Solaris reserve因此如果想要彻底删除zfs所有相关的分区需要fdisk或者parted等命令进底层挨个删除不建议这么做直接重新格式化会比较好由于显示的是gpt分区表因此有很多不常见的属性Command (m for help): l 1 EFI System C12A7328-F81F-11D2-BA4B-00A0C93EC93B 2 MBR partition scheme 024DEE41-33E7-11D3-9D69-0008C781F39F 3 Intel Fast Flash D3BFE2DE-3DAF-11DF-BA40-E3A556D89593 4 BIOS boot 21686148-6449-6E6F-744E-656564454649 5 Sony boot partition F4019732-066E-4E12-8273-346C5641494F 6 Lenovo boot partition BFBFAFE7-A34F-448A-9A5B-6213EB736C22 7 PowerPC PReP boot 9E1A2D38-C612-4316-AA26-8B49521E5A8B 8 ONIE boot 7412F7D5-A156-4B13-81DC-867174929325 9 ONIE config D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149 10 Microsoft reserved E3C9E316-0B5C-4DB8-817D-F92DF00215AE 11 Microsoft basic data EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 12 Microsoft LDM metadata 5808C8AA-7E8F-42E0-85D2-E1E90434CFB3 13 Microsoft LDM data AF9B60A0-1431-4F62-BC68-3311714A69AD 14 Windows recovery environment DE94BBA4-06D1-4D40-A16A-BFD50179D6AC 15 IBM General Parallel Fs 37AFFC90-EF7D-4E96-91C3-2D7AE055B174 16 Microsoft Storage Spaces E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D 17 HP-UX data 75894C1E-3AEB-11D3-B7C1-7B03A0000000 18 HP-UX service E2A1E728-32E3-11D6-A682-7B03A0000000 19 Linux swap 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F 20 Linux filesystem 0FC63DAF-8483-4772-8E79-3D69D8477DE4 21 Linux server data 3B8F8425-20E0-4F3B-907F-1A25A76F98E8 22 Linux root (x86) 44479540-F297-41B2-9AF7-D131D5F0458A 23 Linux root (ARM) 69DAD710-2CE4-4E3C-B16C-21A1D49ABED3 24 Linux root (x86-64) 4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709 25 Linux root (ARM-64) B921B045-1DF0-41C3-AF44-4C6F280D3FAE 26 Linux root (IA-64) 993D8D3D-F80E-4225-855A-9DAF8ED7EA97 27 Linux reserved 8DA63339-0007-60C0-C436-083AC8230908 28 Linux home 933AC7E1-2EB4-4F13-B844-0E14E2AEF915 29 Linux RAID A19D880F-05FC-4D3B-A006-743F0F84911E 30 Linux extended boot BC13C2FF-59E6-4262-A352-B275FD6F7172 31 Linux LVM E6D6D379-F507-44C2-A23C-238F2A3DF928 32 FreeBSD data 516E7CB4-6ECF-11D6-8FF8-00022D09712B 33 FreeBSD boot 83BD6B9D-7F41-11DC-BE0B-001560B84F0F 34 FreeBSD swap 516E7CB5-6ECF-11D6-8FF8-00022D09712B 35 FreeBSD UFS 516E7CB6-6ECF-11D6-8FF8-00022D09712B 36 FreeBSD ZFS 516E7CBA-6ECF-11D6-8FF8-00022D09712B 37 FreeBSD Vinum 516E7CB8-6ECF-11D6-8FF8-00022D09712B 38 Apple HFS/HFS 48465300-0000-11AA-AA11-00306543ECAC 39 Apple UFS 55465300-0000-11AA-AA11-00306543ECAC 40 Apple RAID 52414944-0000-11AA-AA11-00306543ECAC 41 Apple RAID offline 52414944-5F4F-11AA-AA11-00306543ECAC 42 Apple boot 426F6F74-0000-11AA-AA11-00306543ECAC 43 Apple label 4C616265-6C00-11AA-AA11-00306543ECAC 44 Apple TV recovery 5265636F-7665-11AA-AA11-00306543ECAC 45 Apple Core storage 53746F72-6167-11AA-AA11-00306543ECAC 46 Solaris boot 6A82CB45-1DD2-11B2-99A6-080020736631 47 Solaris root 6A85CF4D-1DD2-11B2-99A6-080020736631 48 Solaris /usr Apple ZFS 6A898CC3-1DD2-11B2-99A6-080020736631 49 Solaris swap 6A87C46F-1DD2-11B2-99A6-080020736631 50 Solaris backup 6A8B642B-1DD2-11B2-99A6-080020736631 51 Solaris /var 6A8EF2E9-1DD2-11B2-99A6-080020736631 52 Solaris /home 6A90BA39-1DD2-11B2-99A6-080020736631 53 Solaris alternate sector 6A9283A5-1DD2-11B2-99A6-080020736631 54 Solaris reserved 1 6A945A3B-1DD2-11B2-99A6-080020736631 55 Solaris reserved 2 6A9630D1-1DD2-11B2-99A6-080020736631 56 Solaris reserved 3 6A980767-1DD2-11B2-99A6-080020736631 57 Solaris reserved 4 6A96237F-1DD2-11B2-99A6-080020736631 58 Solaris reserved 5 6A8D2AC7-1DD2-11B2-99A6-080020736631 59 NetBSD swap 49F48D32-B10E-11DC-B99B-0019D1879648 60 NetBSD FFS 49F48D5A-B10E-11DC-B99B-0019D1879648 61 NetBSD LFS 49F48D82-B10E-11DC-B99B-0019D1879648 62 NetBSD concatenated 2DB519C4-B10E-11DC-B99B-0019D1879648 63 NetBSD encrypted 2DB519EC-B10E-11DC-B99B-0019D1879648 64 NetBSD RAID 49F48DAA-B10E-11DC-B99B-0019D1879648 65 ChromeOS kernel FE3A2A5D-4F32-41A7-B725-ACCC3285A309 66 ChromeOS root fs 3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC 67 ChromeOS reserved 2E0A753D-9E48-43B0-8337-B15192CB1B5E 68 MidnightBSD data 85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7 69 MidnightBSD boot 85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7 70 MidnightBSD swap 85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7 71 MidnightBSD UFS 0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7 72 MidnightBSD ZFS 85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7 73 MidnightBSD Vinum 85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7 74 Ceph Journal 45B0969E-9B03-4F30-B4C6-B4B80CEFF106 75 Ceph Encrypted Journal 45B0969E-9B03-4F30-B4C6-5EC00CEFF106 76 Ceph OSD 4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D 77 Ceph crypt OSD 4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D 78 Ceph disk in creation 89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE 79 Ceph crypt disk in creation 89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE 80 OpenBSD data 824CC7A0-36A8-11E3-890A-952519AD3F61 81 QNX6 file system CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1 82 Plan 9 partition C91818F9-8025-47AF-89D2-F030D7000C2C可以得出一个明确的结论zfs文件系统是上层系统内核强相关的它的分区实现并不是通过调用底层程序来实现的这一个过程是完全自动化的。ZFS 是内核级的存储栈重构其磁盘管理是“去分区表”的自动化抽象。简单来说ZFS 跳过了传统分区表这一层直接坐在了磁盘驱动器的上一层。这就是为什么在 ZFS 最佳实践中我们强调“不要用硬件 RAID也不要预先分区”。完全自动化体现在以下三点无需预分区最佳实践是直接使用整盘/dev/sdXZFS 会自动处理磁盘布局无需人工干预分区大小。动态扩容添加新磁盘时只需zpool add池容量自动扩展无需调整分区。元数据自管理ZFS 自动管理校验和、快照、克隆等所有元数据对用户透明。zfs的数据集的概念概念在存储池之上创建的逻辑存储单元。您可以将其理解为传统文件系统中的“目录”或“分区”但功能强大得多。数据集是实际存储文件、设置属性如压缩、加密和创建快照的载体。类型文件系统标准的、可挂载的POSIX文件系统。ZVOL一个模拟的块设备可以用于创建swap或供虚拟机使用。操作您可以像创建目录一样轻松创建、销毁数据集并为其设置独立的属性。对于数据集的核心理解概念传统存储ZFS 存储物理存储​硬盘存储池 (zpool)逻辑划分​分区 (Partition)数据集 (Dataset)格式化​文件系统 (ext4/xfs)数据集自动包含文件系统挂载​mount 分区到目录数据集自动挂载到指定路径zfs文件系统的快照与克隆快照数据集在某一时间点的只读副本。它占用空间极少仅记录变化创建速度极快是数据备份、版本回滚的核心。克隆基于快照创建的可写副本。初期不占用额外空间后续独立变化。常用于数据分支测试。四、存储池的创建和销毁使用zpool create命令其核心语法为sudo zpool create 池名称 vdev类型 磁盘1 磁盘2 ...创建示例创建一个由2块磁盘组成的镜像池高可用zpool create mypool mirror /dev/sdb /dev/sdc创建一个由4块磁盘组成的RAIDZ1池允许坏1块盘zpool create mypool raidz1 /dev/sdb /dev/sdc /dev/sdd /dev/sde创建更复杂的池例如2个镜像vdev组成的池兼具性能和容量zpool create mypool mirror /dev/sdb /dev/sdc mirror /dev/sdd /dev/sde此池容量为2块磁盘之和性能接近2块磁盘的并行读写且可容忍每个镜像中坏掉1块盘。查看zpool的状态[rootcentos1 ~]# zpool list -v NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT mypool 59.5G 446K 59.5G - - 0% 0% 1.00x ONLINE - raidz2-0 59.5G 446K 59.5G - - 0% 0.00% - ONLINE - sdb 20.0G - - - - - - - ONLINE - sdc 20.0G - - - - - - - ONLINE - sdd 20.0G - - - - - - - ONLINE -注意事项使用整盘而非分区建议将整个磁盘如/dev/sdb提供给ZFS让其直接管理避免分区表引入的单点故障和复杂度。vdev的扩展性池的容量通过添加新的vdev来扩展。例如可以向一个已有镜像vdev的池中再添加一个由新磁盘组成的镜像vdev。混合vdev警告避免在同一个池中混合不同类型的vdev如一个镜像vdev和一个RAIDZ1 vdev。池的整体性能和数据分布将受制于最慢的那个vdev且空间分配会不均衡。单盘vdev风险一个仅由单个“条带”vdev即一块盘组成的池没有任何冗余。该盘损坏将导致整个池数据丢失。总结创建vdev是ZFS部署中最需谨慎的步骤。请根据上方的决策图明确您的冗余需求和容量目标选择正确的vdev类型并遵循使用整盘、及时验证的原则。规划得当的存储池是数据安全的基石。存储池销毁的完整流程与注意事项核心命令sudo zpool destroy 池名称关键步骤与安全确认终极确认在执行前请再次确认池名称。一个简单的拼写错误可能导致灾难。# 首先列出所有池双重确认目标池名 zpool list执行销毁# 例如销毁名为 oldpool 的存储池 sudo zpool destroy oldpool命令执行后没有确认提示会直接、静默地完成。这是ZFS的设计哲学假设管理员明确知道自己在做什么。验证结果销毁后再次使用zpool list命令该池应从列表中消失。高级选项与场景强制销毁危险如果池被标记为“故障”或设备丢失导致无法正常导入但您仍坚持要销毁其元数据可以使用-f标志。sudo zpool destroy -f corrupted_pool警告这仅用于清理无法正常操作的池的元数据标签不会恢复或擦除磁盘上的实际数据块。磁盘需要重新格式化才能安全使用。销毁后的磁盘处理销毁操作仅移除了ZFS的元数据。磁盘上的原有数据实际上仍可能存在直到被新数据覆盖。若要彻底清空磁盘以移作他用或归还建议使用wipefs或dd命令清除磁盘开头部分的标签和分区信息。# 示例清除 /dev/sdb 上的所有文件系统签名 sudo wipefs -a /dev/sdb关于操作权限的说明总结与强烈建议三思而后行销毁前务必确认数据已迁移或备份。核对名称使用zpool list做最后确认。理解后果操作不可逆且无确认提示。这个非常非常重要哦数据集的创建和销毁在已创建的存储池之上数据集是您实际用于存储文件、设置属性和管理快照的逻辑容器。您可以将其视为一个功能超级增强版的“目录”或“分区”。核心创建命令# 基本创建 zfs create 池名/数据集路径 # 示例在存储池 mypool 下创建一个名为 data 的数据集 zfs create mypool/data ##可以看到直接挂载到data1目录下了 [rootcentos1 ~]# zfs create mypool/data [rootcentos1 ~]# ls /data1/ data创建后该数据集通常会自动挂载到/池名/数据集路径例如/mypool/data您可以直接开始使用。创建时的高级控制一次性设置属性创建命令可结合关键属性设置一步到位提升效率# 创建时启用压缩和设置挂载点 zfs create -o compressionlz4 -o mountpoint/home/projects mypool/projects # 创建时设置配额限制该数据集最大使用空间为100G zfs create -o quota100G mypool/home/user1创建嵌套数据集推荐的结构化方式ZFS鼓励使用嵌套数据集来替代传统目录以实现精细化的属性管理和快照控制。# 创建父数据集 zfs create mypool/apps # 在父数据集下创建子数据集 zfs create mypool/apps/database zfs create mypool/apps/webserver优势每个子数据集可以拥有独立的压缩、加密、配额和快照策略管理非常灵活。数据集的销毁不可逆的删除操作销毁数据集将永久删除该数据集内的所有文件、其所有快照以及其下的所有子数据集如果使用递归选项。操作前必须确认。核心销毁命令与验证# 1. 首先务必确认要销毁的数据集名称和其包含的内容 zfs list -r mypool/data # 列出mypool/data及其所有子数据集 zfs list -t snapshot -r mypool/data # 列出该数据集下的所有快照 # 2. 销毁单个数据集如果该数据集下无子数据集且无挂载的文件系统正在使用 zfs destroy mypool/obsolete_data递归销毁强制、危险如果数据集包含子数据集或快照必须使用-r递归参数。# 递归销毁 mypool/apps/old 及其所有子数据集和快照 zfs destroy -r mypool/apps/old系统会提示确认因为此操作不可逆。强制卸载并销毁如果数据集正忙文件被打开、进程占用无法销毁可使用-f强制卸载并销毁。# 强制递归销毁 zfs destroy -rf mypool/apps/old警告-f会强制终止使用该数据集的进程可能导致数据损坏或程序异常仅在其他方法无效时使用。模拟销毁安全预演在执行前强烈建议使用-n干跑和-v详细参数进行模拟查看哪些对象将被删除。zfs destroy -rvn mypool/apps/old输出将显示“would destroy”列表而不会执行任何实际删除。这是最重要的安全步骤。核心效率要点与权限总结操作命令示例关键注意事项通常所需权限创建​zfs create pool/ds可结合-o一次性设置属性鼓励嵌套结构。已加入zfs组的用户即可。递归销毁​zfs destroy -r pool/ds务必先-n模拟确认目标无误递归会删除所有子项和快照。通常需要sudo或root即使已在zfs组。强制销毁​zfs destroy -rf pool/ds终极手段会强制终止相关进程可能导致问题。必须sudo或root。最佳实践流程创建前规划根据管理和备份需求用嵌套数据集构建清晰的树形结构。销毁前三步a.列内容zfs list -r -t all 目标数据集查看所有子项和快照。b.做模拟zfs destroy -rvn 目标数据集确认删除范围。c.再执行执行实际的zfs destroy -r命令。通过将数据集作为核心管理单元您可以实现比传统目录精细得多的存储策略控制这是发挥ZFS威力的关键。数据集的最终意义实现存储管理的“逻辑化”和“精细化”在传统文件系统如ext4中在一个分区里创建目录。所有目录共享相同的属性压缩、配额、加密等快照也只能针对整个卷进行。ZFS的数据集彻底改变了这一模式其核心意义在于1. 独立的属性管理核心价值每个数据集都可以拥有自己独立的属性设置并可以随时更改互不影响。这实现了极致的灵活性压缩为mypool/db设置compressionzstd高强度压缩为mypool/vm设置compressionlz4快速压缩为mypool/backup关闭压缩。配额与预留空间为mypool/home/alice设置quota200G硬性上限为关键项目mypool/projectX设置reservation1T确保空间始终可用。挂载点自由控制每个数据集挂载到文件系统的何处mountpoint/data/projectA。加密可以对单个数据集启用加密而不必加密整个池。2. 精确的快照与克隆快照粒度您可以仅对mypool/www/production数据集创建秒级快照而不会影响同池下的mypool/www/testing。这节省了时间和空间。克隆目标明确您可以从一个数据集的快照克隆出一个独立的、可写的新数据集用于开发测试或数据恢复而不会牵连其他数据。3. 高效的空间使用与监控空间核算zfs list可以清晰看到每个数据集的实际使用量USED、快照占用量、属性限制等。您可以快速定位是哪个项目或用户占用了大量空间。写时复制CoW共享所有数据集和它们的快照共享池中的相同数据块。只有发生变化时才会占用新空间。这比为每个部门创建独立的LVM卷或分区要节省得多。4. 权限与委托管理您可以将特定数据集的管理权限如创建快照、销毁数据集安全地委托给普通用户或应用程序而无需授予其整个存储池的管理权。这极大地提升了管理安全性和自动化能力。一个直观的生产场景对比假设您有一个存储池ssdpool需要承载数据库、Web服务器日志和用户家目录。传统方式使用目录/ssdpool/ ├── database/ # 无法单独设置压缩或配额 ├── weblogs/ # 日志轮转影响整个池的性能 └── home/ # 某个用户占满空间会导致所有服务中断管理混乱属性一刀切问题难以隔离。ZFS方式使用数据集# 创建具有独立属性的数据集 zfs create -o recordsize16K -o compressionzstd -o logbiasthroughput ssdpool/db zfs create -o compressiongzip -o atimeoff ssdpool/logs zfs create -o quota100G -o compressionlz4 ssdpool/home/alice zfs create -o quota50G -o compressionlz4 ssdpool/home/bob # 结果挂载点 /ssdpool/db/ # 为数据库优化 /ssdpool/logs/ # 为日志文件优化 /ssdpool/home/alice/ # 有空间硬限制 /ssdpool/home/bob/ # 独立的空间限制每个单元可独立管理、监控、快照和恢复。总结数据集的最终意义是将存储池提供的“物理资源块”转化为了无数个可独立配置、安全隔离、高效管理的“逻辑存储服务单元”。它让您能够按需配置为不同类型的数据应用最合适的存储策略。精准管控实现子项目、部门或用户级别的空间、性能和功能控制。提升效率通过细粒度快照和克隆极大简化了数据保护、测试和开发流程。简化运维通过清晰的属性继承和空间核算快速定位和解决问题。因此在ZFS最佳实践中强烈建议即使最初需求简单也至少创建一个数据集来使用而不是直接向存储池根目录写入数据。这为未来的管理留下了最大的灵活性和扩展性。制数据集大小的主要方法和命令1. 配额设置使用上限硬限制配额​ 是数据集及其所有子数据集、快照等总共能消耗的最大磁盘空间。这是最常用的限制手段。设置配额# 将数据集 mypool/projects 的大小限制在 500GB zfs set quota500G mypool/projects效果当mypool/projects下所有文件、快照等占用的空间总和达到500GB时写入操作将失败并返回“磁盘空间不足”错误。2. 预留保证最低空间软保证预留​ 是从存储池中预先划出并保证给该数据集使用的空间。这部分空间不会被其他数据集占用。设置预留# 保证 mypool/critical_db 至少有 200GB 可用空间 zfs set reservation200G mypool/critical_db效果存储池会优先满足所有数据集的“预留”空间之和。即使池空间紧张critical_db也至少有200GB可用。它通常与配额结合使用为关键应用提供空间保障。3. 引用配额与引用预留更精确的控制上述标准配额和预留包含了子数据集和快照的空间。若需仅控制数据集自身数据使用“引用”版本。引用配额仅限制数据集自身数据的大小不包括其快照和子数据集。# mypool/home/alice 自己的文件不能超过100GB但其快照和子目录不受此限 zfs set refquota100G mypool/home/alice引用预留仅保证数据集自身数据可用的空间。zfs set refreservation50G mypool/home/alice4. 空间核算与监控控制大小的前提是清晰了解空间使用情况。查看所有数据集的空间使用情况zfs list -o name,used,avail,refer,quota,reservation,refquota,refreservUSED数据集及其所有后代子数据集、快照占用的总空间。AVAIL数据集当前可用的空间。REFER数据集自身数据不包含快照和子集的大小这是判断是否超“引用配额”的关键。

相关文章:

Linux|操作系统|zfs文件系统的使用详解

一、 前言概述 书接上回,https://zskjohn.blog.csdn.net/article/details/160741859 Linux|操作系统|最新版openzfs编译记录,上文将zfs文件系统编译安装完毕了,也做了一些总结,但总结的不够全面,本文在做一些补充&am…...

第一阶段开发复盘与优化纪要

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 前言 截至目前,我们已经完成了 Flutter 鸿蒙端开发的第一阶段工作,覆盖了环境搭建、网络请求封装、列表下拉刷新与上拉加载、图片加载与缓存、第三方刷新组件适配等…...

【网安-Web渗透测试-内网渗透】内网信息收集(工具)

目录1. 内网基础知识1.1 局域网1.1.1 局域网简介1.1.2 局域网的网络结构1.2 工作组1.3 域1.4 内网渗透2. 环境说明2.1 DC2.2 WebServer2.3 Marry2.4 Jack3. Cobalt Strike工具:用户凭据(密码)收集4. Metasploit信息收集5. BloodHound工具6. 内…...

Armv8原子操作调试:LDXR/STXR指令对与独占监视器

1. 理解LDXR/STXR指令对的核心机制在Armv8-A架构中,LDXR(Load Exclusive Register)和STXR(Store Exclusive Register)是一对用于实现原子操作的指令。这对指令的工作机制可以类比为"拿号排队"系统&#xff1…...

转:调动员工积极性的七个关键

个人理解: 经营的原点,就是“调动员工的积极性” 讲述自己的哲学,与员工们共有这种哲学 思想意识发生变化,积极性、主动性提高 稻盛和夫:调动员工积极性的七个关键 稻盛和夫:调动员工积极性的七个关键 稻…...

量子计算中SIMD编译优化与离子阱架构实践

1. 量子计算中的SIMD编译优化概述量子计算正逐步从理论走向实践,而离子阱架构因其长相干时间和高保真度操作成为当前最有前景的物理实现方案之一。在传统量子编译器中,指令调度往往采用串行执行模式,导致离子传输和量子门操作存在大量等待时间…...

共享内存概述

共享内存,就是在内存里开辟一块公共空间,多个进程可以同时映射到自己的虚拟地址空间,大家直接读写同一块物理内存。是 Linux 进程间通信 IPC 最快 的一种方式。1️⃣创建共享内存空间2️⃣映射到自己的进程3️⃣strcpy写数据4️⃣断开与共享内…...

基于单相全波晶闸管的基本交流电压控制器,带电阻负载(Simulink仿真实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

彻底告别Row-By-Row:标量子查询外连接改写与向量化引擎深潜

在实际的复杂业务系统开发与运维中,SQL查询的结构往往会随着业务复杂度的提升而变得臃肿不堪。为了保证代码的可读性和逻辑的直观性,开发者非常喜欢使用 CTE(公共表表达式)、多层子查询、窗口函数,以及标量子查询&…...

私域流量红利见顶?那是你没解锁企业微信 API 的隐藏玩法!

在公域流量成本居高不下的今天,“私域流量”成了每个品牌的标配。然而,许多企业在把客户拉进企业微信后,却发现运营陷入了瓶颈:每天机械地群发广告,客户互动率低,退群率却居高不下。很多人惊呼:…...

Qt开发避坑|MQTT客户端频繁下线?竟是setClientId用错了!

做Qt物联网开发的小伙伴,大概率都遇到过这样的坑:本地调试时,MQTT客户端连接正常、消息收发流畅;可当另一个设备(或另一个调试窗口)启动后,前一个客户端突然被强制下线,日志里没明确…...

【更新至2025年】2001-2025年上市公司年报文本数据(txt格式)

【更新至2025年】2001-2025年上市公司年报文本数据(txt格式) 1、时间:2001-2025年 2、来源:巨潮资讯网 3、范围:A股上市公司 4、样本量:共7.2W份 5、说明:上市公司年报文本数据可以挖掘文本…...

YOLOv8改进策略【卷积层】| TGRS2024 小波变换特征分解器(WTFD)双频互补提精度 + 轻量分解保空间[特殊字符]

一、本文介绍 本文记录的是利用WTFD小波变换特征分解器优化YOLOv8的目标检测网络模型。 WTFD(小波变换特征分解器)通过Haar小波变换双迭代分解与分通道轻量化特征映射结合,为纯空间域分割网络引入互补的频域特征分支。本文利用WTFD模块,先通过点卷积增强输入空间特征的非…...

【2026年最新版】JDK安装、环境配置教程(详细图文附安装包)

【2026年最新版】Java JDK安装、环境配置教程 一、前期准备(重点)1. 版本选择2. 安装包下载二、安装步骤三、环境变量配置(必做)四、验证是否成功一、前期准备(重点) 1. 版本选择 首选 JDK 17&#xff08…...

Multi-head Self-Attention Machanism

3. 多头自注意力机制(Multi-head Self-Attention Machanism) 多头注意力机制是在自注意力机制的基础上发展起来的,是自注意力机制的变体,旨在增强模型的表达能力和泛化能力。它通过使用多个独立的注意力头,分别计算注…...

7.Linux笔记:shell

1.shellshell就是Linux内核的一个外层保护工具,并负责完成用户与内核之间的交互。用户>shell>内核>硬件内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,内核决定一个程序…...

FreeRTOS源码解析(9)任务通知

1.任务通知本质:直接操作目标任务的 TCB 字段。 它不自带控制块、不分配独立存储、不维护自己的等待列表——全程只做一件事:读写目标任务 TCB 里已有的 ulNotifiedValue 和 ucNotifyState,必要时将对方从延迟列表移到就绪列表。正因如此&…...

【Java实战】Java 实现 Base64 文件批量压缩为 ZIP

一、前言在实际项目开发中,经常遇到这样的场景:前端上传多个文件后以 Base64 格式存储,或者从数据库读取多个 Base64 编码的文件,需要将这些文件打包成 ZIP 压缩包供用户下载。本文分享一个实用的 Java ZIP 压缩工具类二、应用场景…...

2025年知识竞赛行业趋势报告:智能化、场景化与生态融合

📊 2025年知识竞赛行业趋势报告技术更智能 场景更融合 内容更鲜活 工具更普惠🚀 引言:变革中的竞赛生态知识竞赛,这一古老的知识检验与娱乐形式,在数字技术的持续赋能下,正经历着一场深刻的范式变革。从…...

What Are You Talking About(HDU- P1075)

伊格纳修斯真是走了狗屎运,昨天居然遇到了火星人!可惜他完全听不懂火星人的语言。临走时,火星人给了他一本火星历史书和一本词典。现在伊格纳修斯想把这本历史书翻译成英语,你能帮帮他吗?输入本题只有一组测试数据&…...

第二章:Compose入门—声明式UI编程

第二章:Compose 入门 — 声明式 UI 编程 Compose 的核心理念:用 Kotlin 代码声明 UI,而不是用 XML 布局文件。 2.1 传统 View 系统 vs Compose 对比项传统 View 系统Jetpack ComposeUI 描述XML 布局文件Kotlin 代码状态更新findViewById 手…...

三极管的削波失真是什么

削波失真(Clipping Distortion)是指当放大电路(如三极管、运放)的输出信号幅度超过了其供电电压或输出动态范围的极限时,信号的顶部和/或底部被“削平”而发生的失真现象。1. 它是如何发生的?以一个共射放大…...

SBA系列生物传感分析仪的工作原理是什么?

SBA系列生物传感分析仪利用酶促反应来进行定量分析,测定的关键传感器是固定化酶和过氧化氢电极复合传感器,分析过程基于以下生化反应:底物 固定化酶膜 → 产物谷氨酸    谷氨酸氧化酶  α-酮戊二酸葡萄糖    葡萄糖氧化…...

STM32F108C8T6小白入门特训营__1.4GPIO.C 代码分析

目录 1.只需要搞明白 cubemx 跟 代码对应关系就可以了 2.GPIO.C 代码加上注释 3.注意引脚的宏定义 1.只需要搞明白 cubemx 跟 代码对应关系就可以了 2.GPIO.C 代码加上注释 读懂注释部分代码即可 /* USER CODE BEGIN Header */ /*****************************************…...

JDBC(四):Statement

Statement作用:执行sql1. 执行dml、ddlint excuteUpdate(sql)(1)dml,输出受影响行数(为正,执行成功;为负,执行失败)(2)ddl,可能输出0&…...

HTML代码加密工具源码_在线网页加密解密_防复制源码

概述 在前端开发与网页设计中,保护原创代码不被轻易复制或篡改是许多开发者的核心诉求。无论是为了隐藏核心逻辑,还是防止样式被恶意盗用,一款高效、安全的加密工具都显得尤为重要。为此,幽络源源码网特别整理并分享这款HTML代码…...

从‘密码长度’到‘任意代码执行’:手把手复现攻防世界int_overflow靶场(附Python3 EXP)

从密码长度到系统控制:整数溢出漏洞实战攻防全解析 在网络安全领域,整数溢出漏洞往往因其隐蔽性而被开发者忽视,却可能成为攻击者打开系统大门的金钥匙。本文将带您深入一个典型场景:如何通过精心构造的密码输入,从简单…...

PPTX判断包含图表id

PPTX判断包含图表id ############################20250915判断是否包含图表################################################## i0 for shape in prs.slides[1].shapes:if shape.HasChart:print(fi:{i}包含图表)ii1 ############################20250915判断是否包含图表##…...

护眼钢化膜是智商税?圆偏振光+AR降反射实测,观复盾用硬核技术给出答案

护眼钢化膜是智商税?圆偏振光AR降反射实测,观复盾用硬核技术给出答案“花上百块买的护眼钢化膜,贴上后屏幕又黄又暗,眼睛反而更累了。”这样的抱怨在数码社区里比比皆是。与此同时,也有用户表示换了圆偏振光膜后&#…...

Docker Compose部署Nginx Proxy Manager保姆级教程:从端口映射到数据持久化全解析

Docker Compose部署Nginx Proxy Manager全流程精解:从架构设计到生产级实践 当你面对数十个需要反向代理的服务时,手动编辑Nginx配置文件的繁琐程度足以让人望而生畏。Nginx Proxy Manager的出现彻底改变了这种局面——这个基于Docker的开源解决方案将复…...