rhel配置zfs
- 环境声明
- ZFS简介
- ZFS块指针的结构
- ZFS的存储池布局
- rhel8/rhel9安装zfs
- 始终在启动时加载OpenZFS模块
- 开机自启zfs服务
- zfs基本操作
- 查看磁盘
- 创建pool和ZFS文件系统
- 创建一个存储池
- 设置zfs挂载点
- 为多个用户创建起始目录
- 向池中添加更多空间
- 修改文件系统名称
- 删除文件系统
- 修改存储池的名称
- 显示存储池的状态
- 查看存储池(pool)列表
- 验证存储池是否创建成功
- 显示存储池修改历史
- 销毁一个存储池
- 更新存储池
- 磁盘管理
- 添加磁盘
- 标记磁盘运行状态
- 删除磁盘
- 添加热备件(hot spare)磁盘
- 创建存储池时指定镜像和热备件
- 向现有存储池添加热备件
- 从现有存储池中删除热备件
- 附加热备件磁盘
- 分离热备件磁盘
- 替换故障磁盘
- 磁盘镜像配置
- 使用镜像创建存储池
- 模拟磁盘故障
- 检测存储池是否损坏
- 替换磁盘
- 创建RAID池
- 创建RAID0(不推荐)
- 创建RAID1
- 创建RAIDZ1/RAID5
- 创建**RAIDZ2/RAID6**
- 创建RAID10(条带化镜像)
- 快照
- 在ZFS池创建快照
- 为所有后代文件系统创建快照
- 查看快照列表
- 查看快照文件详情
- 查看快照属性
- 设置快照属性
- 删除快照
- 删除后代快照
- 保持快照
- 快照重命名
- 快照回滚
- 快照恢复
- 对比两个快照差异
- ZFS池迁移
- 从旧服务器上导出存储池
- 列出所有可以导入的存储池
- 导入指定存储池
- zfs常用命令参考
- 1. 创建pool和ZFS文件系统:
- 为多个用户创建起始目录
- 向池中添加更多空间
- 修改文件系统名称
- 删除文件系统
- 修改存储池的名称
- 2. 设置属性
- 自动以NFS方式共享该文件系统
- 对文件系统中所有数据启用压缩
- 将用户A的最大空间限制为10g
- 可通过命令查询文件系统的所有属性
- 可通过命令查询存储池的所有属性
- 大多数属性可通过继承方式自动设置
- 3. ZFS snapshot
- 文件系统的只读副本
- 对用户A的起始目录执行快照捕获
- 回滚到前一个快照
- 查看星期三的foo.c版本
- 删除快照
- 3.1 ZFS Clone
- 创建OpenSolaris源代码的克隆
- 4. ZFS send/receive
- 生成完整备份
- 生成增量备份
- 远程复制:每分钟发送一次增量
- 5. ZFS 数据迁移
- 从旧服务器上导出池
- 物理移动磁盘并将池导入到新服务器中
- 6. 设备管理
- 添加/替换新设备 (type: “”,mirror,raidz,raidz2)
- 添加/移除镜像磁盘
- 将设备停止或手工启动
- 查看存储池当前状态和I/O状况
- 添加热备磁盘
- 指定热备启动/停止热备
- 将热备设备删除
- 添加/删除独立的日志设备(性能改善)
- 7. ZFS 权限管理
- 将权限授予一个普通用户
- 将指定权限回收
- 查看文件系统当前的权限
- 8. 其它命令
- 显示存储池所有操作历史记录
- 升级存储池到指定SPA版本
- 升级文件系统到指定ZPL版本
- 手工挂载/卸载文件系统
环境声明
OS Version: Rocky9
实验环境使用4
块1T硬盘
ZFS简介
https://www.wolai.com/littlenewton/gJvungs54zWgZ3YfoXAvKW
ZFS块指针的结构
ZFS的存储池布局
下面这张图能更好地体现dataset
和zvol
之间的关系。
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=off
,zfs list
命令**不会显示**
快照列表;要使用 **zfs list -t snapshot**
命令显示快照信息。
# 设置快照显示属性
## zpool set listsnapshots=off 快照名
zpool set listsnapshots=off data
删除快照
# 删除快照
## zfs destroy 挂载点名称@快照名称
zfs destroy data@2020-04-28
删除后代快照
如果使用**-r**
参数来创建快照,需要先删除下层快照。
按照提示删除下层快照即可
保持快照
保持快照的作用是防止被不小心销毁。
每个快照都有一个关联的用户引用计数,其初始值为 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
设置**保持快照**
后,删除快照时将**禁止删除**
快照重命名
# 单个快照重命名
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
快照恢复
当无法直接回滚
到之前快照的时候,就需要手动恢复
数据了。
原理:将快照挂载
到一个临时挂载点
,进入这个挂载点
去拷贝
数据。
# 将快照挂载到一个临时挂载点,手动进行数据恢复
mount -t zfs data@2020-04-28 /mnt/recovery
对比两个快照差异
# 确定两个快照之间的差异
zfs diff tank/home/tim@snap1 tank/home/timh@snap2
ZFS池迁移
从旧服务器上导出存储池
https://blog.csdn.net/wanghai__/article/details/6196790
# 从旧服务器上导出存储池
zpool export tank
列出所有可以导入的存储池
# 列出所有可以导入的存储池
zpool import
导入指定存储池
# 导入指定存储池
zpool import 存储池名称
# 查看导入后到存储池状态
zpool status
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