zl程序教程

您现在的位置是:首页 >  大数据

当前栏目

rhel配置zfs

配置 RHEL
2023-09-14 09:15:55 时间

rhel配置zfs

环境声明

OS Version: Rocky9

实验环境使用4块1T硬盘
在这里插入图片描述


ZFS简介

https://www.wolai.com/littlenewton/gJvungs54zWgZ3YfoXAvKW


ZFS块指针的结构

在这里插入图片描述


ZFS的存储池布局

在这里插入图片描述


下面这张图能更好地体现datasetzvol之间的关系。
在这里插入图片描述


rhel8/rhel9安装zfs

https://openzfs.github.io/openzfs-docs/Getting%20Started/RHEL-based%20distro/index.html

# 安装zfs源
dnf install -y https://zfsonlinux.org/epel/zfs-release-2-2$(rpm --eval "%{dist}").noarch.rpm

# 安装epel源
dnf install -y epel-release

# 安装dev内核
dnf install -y kernel-devel

# 禁用zfs源
## zfs源是dkms(动态内核模块支持)---ZFS on Linux for EL 7 - dkms
dnf config-manager --disable zfs

# 启用zfs-kmod源
## kmod是内核模块
dnf config-manager --enable zfs-kmod

# 安装zfs主程序
dnf install -y zfs

# 加载zfs内核模块
modprobe zfs

# 安装分区工具
dnf install -y gdisk dosfstools

始终在启动时加载OpenZFS模块

默认情况下,当检测到 ZFS 池时,会自动加载 OpenZFS 内核模块。如果您希望**始终在启动时加载**模块,则必须创建一个 /etc/modules-load.d/zfs.conf 文件:

# 在启动时自动加载zfs模块
echo zfs >/etc/modules-load.d/zfs.conf

开机自启zfs服务

# 开机自启zfs服务
systemctl enable --now zfs-import-scan.service zfs-mount zfs-import.target zfs-zed zfs.target

# 查看zfs-import-scan服务状态
systemctl status zfs-import-scan

在这里插入图片描述


zfs基本操作

https://blog.csdn.net/wanghai__/article/details/6196790
https://www.escapelife.site/posts/caf259ea.html


查看磁盘

# 查看磁盘
lsblk

在这里插入图片描述


创建pool和ZFS文件系统


创建一个存储池

# 创建一个存储池
## zpool create -f 存储池名称 磁盘1 磁盘2 磁盘3 磁盘4
zpool create -f zfspool vdc vdd vde vdf

在这里插入图片描述


设置zfs挂载点

# 挂载在/export/home 下
zfs set mountpoint=/export/home tank/home

为多个用户创建起始目录

请注意:由于继承而自动挂载在 /export/home/{ahrens,bonwick,billm} 下

zfs create tank/home/ahrens
zfs create tank/home/bonwick
zfs create tank/home/billm

向池中添加更多空间

# 向存储池中添加磁盘
zpool add zfspool -f /dev/sdx

# 创建名为 “tank” 的存储池 (type: “”,mirror,raidz,raidz2)
zpool create tank <type> c0t0d0 c1t0d0 c1t1d0

修改文件系统名称

# 修改文件系统名称
zfs rename tank/home/ahrens tank/home/nahrens

删除文件系统

# 删除文件系统
zfs destroy -Rf tank/fs

修改存储池的名称

zpool export tank
zpool import tank newpool

显示存储池的状态

# 显示可用池的状态
# 查看zpool中有哪些磁盘
zpool status

在这里插入图片描述

# 获取存储服务的状态
zpool get all

# 获取存储服务的状态
zpool get all 存储池名

在这里插入图片描述

在这里插入图片描述


查看存储池(pool)列表

# 查看存储池
zpool list

在这里插入图片描述


验证存储池是否创建成功

如果存储池创建成功,df -Th中会会出现一个路径为**zfspool**大小3.8TB的空间,同时挂载在/zfspool

# 查看磁盘使用率
df -Th

在这里插入图片描述


显示存储池修改历史

# 显示以前修改了存储池状态信息
zpool history

在这里插入图片描述


销毁一个存储池

# 销毁一个地址池
## zpool destroy 存储池名称
zpool destroy zfspool

# 查看存储池列表
zpool list

# 查看存储池状态
zpool status

# 查看磁盘空间使用情况
df -Th

在这里插入图片描述


更新存储池

# 当你更新ZFS时,你也需要更新你的池

# 更新指定存储池
zpool upgrade zfspool

# 更新全部存储池
zpool upgrade -a

磁盘管理


添加磁盘

# 将磁盘添加到存储池中
zpool add zfspool -f /dev/sdx

标记磁盘运行状态

# 标记磁盘状态为运行
zpool online testpool sdc

# 在有故障的时候,标记磁盘状态为非运行
zpool offline testpool sdc

删除磁盘

不能直接删除一个磁盘,因为它是一个冗余或raidz池

# 将磁盘从存储池中删除
zpool remove 存储池名称 /dev/sdx

在这里插入图片描述


vdc已从zfspool中删除

在这里插入图片描述


添加热备件(hot spare)磁盘

https://www.onitroad.com/jc/unix/solaris/solaris-zfs-how-to-specify-hot-spare-in-storage-pool.html
热备件磁盘平时是空闲状态,当工作磁盘出现故障时,可以立即将热备件磁盘附加到存储池中,顶替故障磁盘后,将故障磁盘分离,然后到物理机上拆除更换故障磁盘。


创建存储池时指定镜像和热备件

# 创建存储池时添加备件
### mirror参数为镜像,后面跟两个磁盘
### spare表示热备件,后面参数跟磁盘
zpool create 存储池名称 mirror sdb sdc spare sde sdf

向现有存储池添加热备件

# 向现有存储池添加热备件
## zpool add 存储池名称 spare 磁盘名
### spare表示热备件,后面参数跟磁盘名
zpool add 存储池名称 spare sdf sdg

从现有存储池中删除热备件

# 从现有存储池中删除热备件
## zpool remove 存储池名称 spare 磁盘名
zpool remove 存储池 sdf

附加热备件磁盘

如果已使用热备件自动替换了故障磁盘,则您可能需要在替换故障磁盘分离该热备件

# 例如: 如果替换故障磁盘后,sdf仍为活动热备件,则对其进行附加
zpool attach 存储池名称 sdf

分离热备件磁盘

# 例如: 如果替换故障磁盘后,sdf仍为活动热备件,则对其进行分离
zpool detach 存储池名称 sdf

替换故障磁盘

# 磁盘发生故障,使用replace命令替换故障磁盘sdc
## 使用用SDD磁盘替换SDC磁盘
zpool replace 存储池名称 sdc sdd

磁盘镜像配置

镜像会让两个磁盘数据完全一致,损坏一个磁盘,另一个磁盘的数据还在。
替换这个损坏的磁盘,数据会很快同步回来,保障数据不丢失。


使用镜像创建存储池

# 在镜像配置当中我们将爆力的测试一个设备
## mirror参数为镜像,后面跟两个磁盘
zpool create -f 存储池名称 mirror sdd sde

模拟磁盘故障

# 这将创建一个镜像磁盘池组成的SDD和SDE
# 现在,让我们故意损坏SDD写零到磁盘中
dd if=/dev/zero of=/dev/sdd

检测存储池是否损坏

# 我们将使用“scrub”命令来检测这种损坏
zpool scrub 存储池名称

替换磁盘

# 使用用SDC替换SDD
zpool replace 存储池名称 sdd sdc

# 查看存储池状态
zpool status

创建RAID池


创建RAID0(不推荐)

RAID0,最少2块硬盘,速度快,但**不容灾**
且不支持做热备,做了也没用

# 创建RAID0
zpool create -f zfspool /dev/sdc /dev/sdd

创建RAID1

RAID1,最少2块硬盘,镜像容灾,但**容量减半**

# 创建RAID1
zpool create -f zfspool mirror /dev/sdc /dev/sdd

创建RAIDZ1/RAID5

RAID5最少3块硬盘,奇偶校验,只允许坏一块硬盘
容量只有n-1,剩余的1块磁盘保存奇偶校验和

在这里插入图片描述

# 创建RAID5/RAIDZ
zpool create -f zfspool raidz1 /dev/sdc /dev/sdd /dev/sde

创建RAIDZ2/RAID6

在这里插入图片描述

# 创建RAID6/RAIDZ2
zpool create -f zfspool raidz2 /dev/sdc /dev/sdd /dev/sde /dev/sdf

创建RAID10(条带化镜像)

读:RAID一零
最少要用4块硬盘;
RAID10=RAID1+RAID0,金融行业专用
优点:性能高,数据安全性强
缺点:**成本贵**

# RAID10(条带化镜像)
# RAID10
zpool create -f zfspool mirror /dev/sdc /dev/sdd mirror /dev/sde /dev/sdf

快照


在ZFS池创建快照

# 创建快照
## zfs snapshot 挂载点名称@快照名称
zfs snapshot volume@snapname

在这里插入图片描述


为所有后代文件系统创建快照

# 通过使用-r选项可为所有后代文件系统创建快照
## ## zfs snapshot -r 挂载点名称@快照名称
zfs snapshot -r data@2020-04-28

查看快照列表

# 查看快照列表
zfs list -t snapshot

在这里插入图片描述

# 查看后代快照列表
zfs list -t snapshot -r data@2020-04-28

在这里插入图片描述


查看快照文件详情

# 默认显示
zfs list -t snapshot -r tank/home

# 列出为特定文件系统创建的快照
zfs list -r -t snapshot -o name,creation tank/home

在这里插入图片描述


查看快照属性

# 获取快照属性
## zpool get listsnapshots 快照名
zpool get listsnapshots data

设置快照属性

快照属性的默认值为listsnapshots=on,zfs list命令**会显示**快照列表。
设置listsnapshots=offzfs list命令**不会显示**快照列表;要使用 **zfs list -t snapshot**命令显示快照信息。

# 设置快照显示属性
## zpool set listsnapshots=off 快照名
zpool set listsnapshots=off data

image.png


删除快照

# 删除快照
## zfs destroy 挂载点名称@快照名称
zfs destroy data@2020-04-28

删除后代快照

如果使用**-r**参数来创建快照,需要先删除下层快照。

按照提示删除下层快照即可

image.png


保持快照

保持快照的作用是防止被不小心销毁。
每个快照都有一个关联的用户引用计数,其初始值为 0。在一个快照上设置一个保持标志时,此计数**递增1**;释放一个保持标志时,此计数**递减1**
**设置保持**后会**禁止删除**该快照。

# 保持一个快照或一组快照
zfs hold keep data@2020-04-28

# 使用-r选项递归保持所有后代文件系统的快照
zfs hold -r keep data@2020-04-28

# 要销毁保持的快照,须使用-d选项
zfs destroy -d data@2020-04-28

# 显示受保持的快照列表
zfs holds data@2020-04-28
zfs holds -r data@2020-04-28

# 释放对一个快照或一组快照的保持
zfs release -r keep data@2020-04-28

# 释放快照后销毁快照
zfs destroy -r data@2020-04-28

设置**保持快照**后,删除快照时将**禁止删除**
image.png


快照重命名

# 单个快照重命名
zfs rename data@2020-04-28 data@2020-04-27

# 以递归方式重命名快照
zfs rename -r data@2020-04-28 @2020-04-27

快照回滚

-r 删除中间快照,恢复早期版本
-R 选项以销毁中间快照的克隆

# 示例快照列表
zfs list -t snapshot -r tank/home

# 将tank/home/matt文件系统回滚到tuesday快照
## zfs rollback 挂载点名@快照名
zfs rollback tank/home/matt@tuesday

# 删除中间的快照即可恢复到之前的版本
zfs rollback -r tank/home/matt@tuesday

image.png


快照恢复

无法直接回滚到之前快照的时候,就需要手动恢复数据了。
原理:将快照挂载到一个临时挂载点,进入这个挂载点拷贝数据。

# 将快照挂载到一个临时挂载点,手动进行数据恢复
mount -t zfs data@2020-04-28 /mnt/recovery

对比两个快照差异

# 确定两个快照之间的差异
zfs diff tank/home/tim@snap1 tank/home/timh@snap2

image.png


ZFS池迁移


从旧服务器上导出存储池

https://blog.csdn.net/wanghai__/article/details/6196790

# 从旧服务器上导出存储池
zpool export tank

列出所有可以导入的存储池

# 列出所有可以导入的存储池
zpool import

image.png


导入指定存储池

# 导入指定存储池
zpool import 存储池名称

# 查看导入后到存储池状态
zpool status

image.png


zfs常用命令参考

https://blog.csdn.net/wanghai__/article/details/6196790


1. 创建pool和ZFS文件系统:

# 创建文件系统
zfs create tank/home

# 挂载在/export/home 下
zfs set mountpoint=/export/home tank/home

为多个用户创建起始目录

请注意:由于继承而自动挂载在 /export/home/{ahrens,bonwick,billm} 下

zfs create tank/home/ahrens
zfs create tank/home/bonwick
zfs create tank/home/billm

向池中添加更多空间

# 向池中添加磁盘
zpool add tank mirror c2t0d0 c3t0d0

# 创建名为 “tank” 的存储池 (type: “”,mirror,raidz,raidz2)
zpool create tank <type> c0t0d0 c1t0d0 c1t1d0

修改文件系统名称

# 修改文件系统名称
zfs rename tank/home/ahrens tank/home/nahrens

删除文件系统

# 删除文件系统
zfs destroy -Rf tank/fs

修改存储池的名称

zpool export tank
zpool import tank newpool

2. 设置属性


自动以NFS方式共享该文件系统

# 自动以 NFS 方式共享该文件系统
zfs set sharenfs=rw tank/home

对文件系统中所有数据启用压缩

# 对文件系统中所有数据启用压缩
zfs set compression=on tank

将用户A的最大空间限制为10g

# 将用户A的最大空间限制为10g
zfs set quota=10g tank/home/usera

保证用户B有20g的预留空间

# 保证用户B有20g的预留空间
zfs set reservation=20g tank/home/userb

可通过命令查询文件系统的所有属性

# 可通过命令查询文件系统的所有属性
zfs get all tank/home

可通过命令查询存储池的所有属性

# 可通过命令查询存储池的所有属性
zpool get all tank

大多数属性可通过继承方式自动设置

# 大多数属性可通过继承方式自动设置
zfs inherit <property> tank/home/eschrock

3. ZFS snapshot


文件系统的只读副本

即时创建、数量不限,不占用额外空间 - 块仅在发生更改时才会被复制
可通过每个文件系统根目录下的 **.zfs/snapshot** 访问
使用户可在没有系统管理员介入的情况下恢复文件,


对用户A的起始目录执行快照捕获

# 对用户A的起始目录执行快照捕获
zfs snapshot tank/home/usera@tuesday

回滚到前一个快照

# 回滚到前一个快照
zfs rollback tank/home/usera@monday

查看星期三的foo.c版本

# 查看星期三的foo.c版本
cat /tank/home/usera/.zfs/snapshot/wednesday/foo.c

删除快照

# 删除快照
zfs destroy -R tank/home/usera@monday

3.1 ZFS Clone

快照的可写副本,
即时创建、数量不限;
存储大部分为共享数据的众多专用副本的理想方法.
软件安装
工作区
无盘客户机


创建OpenSolaris源代码的克隆

# 创建OpenSolaris源代码的克隆
zfs clone tank/solaris@monday tank/ws/lori/fix

4. ZFS send/receive

基于快照点
完整备份:任何快照
增量备份:任何快照增量
速度很快 - 开销与更改的数据成比例
非常高效,可执行远程复制


生成完整备份

# 生成完整备份
zfs send tank/fs@A >/backup/A

生成增量备份

# 生成增量备份
zfs send -i tank/fs@A tank/fs@B >/backup/B-A

远程复制:每分钟发送一次增量

# 远程复制:每分钟发送一次增量
zfs send -i tank/fs@11:31 tank/fs@11:32 |
ssh host zfs receive -d /tank/fs

5. ZFS 数据迁移

独立于主机的磁盘格式
将服务器从 x86 更改为 SPARC,也能运行
自适应字节存储顺序 (Adaptive endianness):在两个平台上都无需额外成本
写入总是使用本地字节存储顺序 (native endianness),在块指针中设置位
仅当主机字节存储顺序 (endianness) != 块字节存储顺序时,才会针对读取进行字节交换

ZFS 负责所有处理
无需考虑设备路径、配置文件、/etc/vfstab 等等
ZFS 会在必要时进行共享/取消共享、挂载/取消挂载等等


从旧服务器上导出池

# 从旧服务器上导出池
zpool export tank

物理移动磁盘并将池导入到新服务器中

# 物理移动磁盘并将池导入到新服务器中
zpool import tank

6. 设备管理


添加/替换新设备 (type: “”,mirror,raidz,raidz2)

# 添加新设备
zpool add tank <type> c0t2d0 c0t3d0 c0t4d0

# 替换新设备
zpool replace tank c0t1d0 c0t2d0

添加/移除镜像磁盘

# 添加镜像设备
zpool attach tank c0t1d0 c0t2d0

# 移除镜像设备
zpool detach tank c0t2d0

将设备停止或手工启动

# 将设备停止
zpool offline tank c0t2d0

# 将设备上线(启动)
zpool online tank c0t2d0

查看存储池当前状态和I/O状况

# 查看存储池当前状态
zpool status -v tank

# 查看存储池当前I/O状况
zpool iostat tank 1

添加热备磁盘

# 添加热备磁盘
zpool add tank spare c0t2d0

指定热备启动/停止热备

# 启动指定热备件磁盘
zpool replace tank c0t1d0 c0t2d0

# 停止指定热备件磁盘
zpool detach tank c0t2d0

将热备设备删除

# 将热备磁盘删除
zpool remove tank c0t2d0

添加/删除独立的日志设备(性能改善)

# 添加独立的日志设备(性能改善)
zpool add tank log c0t3d0

# 删除独立的日志设备(性能改善) 
zpool remove tank c0t3d0

7. ZFS 权限管理

可以将zfs(1M) 的管理权限分派给普通用户
zfs allow
zfs unallow


将权限授予一个普通用户

# 将权限授予一个普通用户
zfs allow marks create,snapshot tank/marks

将指定权限回收

# 将指定权限回收
zfs unallow marks create,snapshot tank/marks

查看文件系统当前的权限

# 查看文件系统当前的权限
zfs allow tank/marks

8. 其它命令


显示存储池所有操作历史记录

# 显示存储池所有操作历史记录
zpool history tank

升级存储池到指定SPA版本

# 升级存储池到指定SPA版本
zpool upgrade -V <version> tank

升级文件系统到指定ZPL版本

# 升级文件系统到指定ZPL版本
zfs upgrade -V <version> tank/fs

手工挂载/卸载文件系统

# 手工挂载文件系统
zfs mount -a

# 卸载文件系统
zfs unmount tank/fs

# 自动卸载临时挂载 
zfs unmount -a