zfs学习笔记

一、zfs概念:

存储池 raid 集成于各种RAID与条带技术于一身的技术[软raid],不再依赖于硬件RAID卡,只依赖于计算机上能转接多少硬盘。
写实拷贝    校验 和 拷贝 --- 把数据做成几分相同的数据进行存储。
快照和克隆  相当于给当前文件系统 的时间点上拍了一个照片[照片有时光机的功能] 克隆, 很快地复制出一文件系统。
动态条带化  容量随时进行扩展
可变块尺寸  传统设备的块大小要依赖于单一文件系统的配置,ZFS是可以调整块大小的。

二、ZFS操作:

  1. linux安装zfs:
root@ubt:~# apt install zfsutils-linux
root@ubt:~# which zfs
/usr/sbin/zfs
  1. 存储池创建:
root@ubt:~# zpool create diskz1 sdb sdc
#添加一块硬盘
root@ubt:~# zpool add diskz1 sdd
root@ubt:~# zpool remove diskz1 sdx   #移除故障硬盘
#挂载所有ZFS文件系统
root@ubt:~# zfs create -V 100G -o compression=lz4 -o volblocksize=128k diskz1/data0
root@ubt:~# zfs mount -a
  1. 查看存储池:
root@ubt:~# zpool status
  pool: diskz1
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    diskz1      ONLINE       0     0     0
      sdb       ONLINE       0     0     0
      sdc       ONLINE       0     0     0
      sdd       ONLINE       0     0     0

errors: No known data errors
  1. 销毁存储池:
root@ubt:~# zpool destroy -f diskz1
  1. 创建镜像存储池:
root@ubuntu:~# zpool create diskz2 mirror sd{d,c}
root@ubuntu:~# zpool list
NAME     SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
diskz2  9.50G   132K  9.50G        -         -     0%     0%  1.00x    ONLINE  -
root@ubt:~# zpool status 
  pool: diskz2
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    diskz2      ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        sdd     ONLINE       0     0     0
        sdc     ONLINE       0     0     0

errors: No known data errors
  1. 创建文件系统:
#创建文件系统data_0
root@ubuntu:~# zfs create diskz2/data_0
#查看挂载
root@ubuntu:~# df -hT |grep data_0
diskz2/data_0  zfs       9.3G  128K  9.3G   1% /diskz2/data_0
#如果没有挂载,可以执行zfs mount -a 挂载ZFS文件系统
root@ubuntu:~# zfs mount -a
  1. 进入文件系统:
root@ubt:~# cd /diskz2/data_0/
root@ubt:/diskz2/data_0# dd if=/dev/zero of=./file1 count=1 bs=10M
1+0 records in
1+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0215152 s, 487 MB/s
  1. 查看ZFS文件系统属性:
root@ubt:/diskz2/data_0# zfs get all diskz2/data_0 
NAME           PROPERTY              VALUE                  SOURCE
diskz2/data_0  type                  filesystem             -
diskz2/data_0  creation              Mon Mar 14  7:39 2022  -
diskz2/data_0  used                  10.0M                  -
diskz2/data_0  available             96.4G                  -
diskz2/data_0  referenced            10.0M                  -
diskz2/data_0  compressratio         1.00x                  -
diskz2/data_0  mounted               yes                    -
diskz2/data_0  quota                 none                   default
diskz2/data_0  reservation           none                   default
diskz2/data_0  recordsize            128K                   default
diskz2/data_0  mountpoint            /diskz2/data_0         default
diskz2/data_0  sharenfs              off                    default
diskz2/data_0  checksum              on                     default
diskz2/data_0  compression           off                    default
diskz2/data_0  atime                 on                     default
diskz2/data_0  devices               on                     default
diskz2/data_0  exec                  on                     default
diskz2/data_0  setuid                on                     default
diskz2/data_0  readonly              off                    default
diskz2/data_0  zoned                 off                    default
diskz2/data_0  snapdir               hidden                 default
diskz2/data_0  aclinherit            restricted             default
diskz2/data_0  createtxg             24                     -
diskz2/data_0  canmount              on                     default
diskz2/data_0  xattr                 on                     default
diskz2/data_0  copies                1                      default
diskz2/data_0  version               5                      -
diskz2/data_0  utf8only              off                    -
diskz2/data_0  normalization         none                   -
diskz2/data_0  casesensitivity       sensitive              -
diskz2/data_0  vscan                 off                    default
diskz2/data_0  nbmand                off                    default
diskz2/data_0  sharesmb              off                    default
diskz2/data_0  refquota              none                   default
diskz2/data_0  refreservation        none                   default
diskz2/data_0  guid                  8285245533383785742    -
diskz2/data_0  primarycache          all                    default
diskz2/data_0  secondarycache        all                    default
diskz2/data_0  usedbysnapshots       0B                     -
diskz2/data_0  usedbydataset         10.0M                  -
diskz2/data_0  usedbychildren        0B                     -
diskz2/data_0  usedbyrefreservation  0B                     -
diskz2/data_0  logbias               latency                default
diskz2/data_0  objsetid              146                    -
diskz2/data_0  dedup                 off                    default
diskz2/data_0  mlslabel              none                   default
diskz2/data_0  sync                  standard               default
diskz2/data_0  dnodesize             legacy                 default
diskz2/data_0  refcompressratio      1.00x                  -
diskz2/data_0  written               10.0M                  -
diskz2/data_0  logicalused           10.0M                  -
diskz2/data_0  logicalreferenced     10.0M                  -
diskz2/data_0  volmode               default                default
diskz2/data_0  filesystem_limit      none                   default
diskz2/data_0  snapshot_limit        none                   default
diskz2/data_0  filesystem_count      none                   default
diskz2/data_0  snapshot_count        none                   default
diskz2/data_0  snapdev               hidden                 default
diskz2/data_0  acltype               off                    default
diskz2/data_0  context               none                   default
diskz2/data_0  fscontext             none                   default
diskz2/data_0  defcontext            none                   default
diskz2/data_0  rootcontext           none                   default
diskz2/data_0  relatime              off                    default
diskz2/data_0  redundant_metadata    all                    default
diskz2/data_0  overlay               off                    default
diskz2/data_0  encryption            off                    default
diskz2/data_0  keylocation           none                   default
diskz2/data_0  keyformat             none                   default
diskz2/data_0  pbkdf2iters           0                      default
diskz2/data_0  special_small_blocks  0                      default
  1. 修改文件系统属性:
#关闭数据校验示例
root@ubuntu:/diskz2/data_0# zfs get checksum diskz2/data_0
NAME           PROPERTY  VALUE      SOURCE
diskz2/data_0  checksum  on         local
root@ubuntu:/diskz2/data_0# zfs set checksum=off diskz2/data_0
root@ubuntu:/diskz2/data_0# zfs get checksum diskz2/data_0 
NAME           PROPERTY  VALUE      SOURCE
diskz2/data_0  checksum  off        local

#给文件系统限额示例
root@ubuntu:/diskz2/data_0# zfs set quota=2g diskz2/data_0
root@ubuntu:/diskz2/data_0# zfs get quota diskz2/data_0 
NAME           PROPERTY  VALUE  SOURCE
diskz2/data_0  quota     2G     local
root@ubuntu:/diskz2/data_0# dd if=/dev/zero of=./file0 count=4096 bs=1M
dd: error writing './file0': Disk quota exceeded
2048+0 records in
2047+0 records out
2147352576 bytes (2.1 GB, 2.0 GiB) copied, 5.56725 s, 386 MB/s
root@ubuntu:/diskz2/data_0# ls -lh 
total 2.1G
-rw-r--r-- 1 root root 2.0G Aug 13 07:57 file0

#给用户限额示例
root@ubuntu:/diskz2/data_0# zfs set userquota@hw=100M diskz2/data_0 
root@ubuntu:/diskz2/data_0# su - hw
hw@ubuntu:~$ cd /diskz2/data_0/
hw@ubuntu:/diskz2/data_0$ ls
hw@ubuntu:/diskz2/data_0$ dd if=/dev/zero of=./file1 count=99 bs=1M
99+0 records in
99+0 records out
103809024 bytes (104 MB, 99 MiB) copied, 0.12715 s, 816 MB/s
hw@ubuntu:/diskz2/data_0$ dd if=/dev/zero of=./file2 count=99 bs=1M
dd: error writing './file2': Disk quota exceeded
81+0 records in
80+0 records out
84541440 bytes (85 MB, 81 MiB) copied, 0.114823 s, 736 MB/s
hw@ubuntu:/diskz2/data_0$ ls -lh
total 180M
-rw-rw-r-- 1 hw hw 99M Aug 13 08:07 file1
-rw-rw-r-- 1 hw hw 81M Aug 13 08:07 file2
hw@ubuntu:/diskz2/data_0$ dd if=/dev/zero of=./file3 count=99 bs=1M
dd: failed to open './file3': Disk quota exceeded
  1. 快照操作:
官方文档:https://docs.oracle.com/cd/E26926_01/html/E25826/gbciq.html

#创建快照
zfs snapshot diskz2/data_0@first

#查看快照
root@ubuntu:/diskz2# zfs list -t snapshot 
NAME                  USED  AVAIL     REFER  MOUNTPOINT
diskz2/data_0@first    13K      -      180M  -
root@ubuntu:/diskz2# zfs list -t snapshot -r diskz2/data_0 
NAME                  USED  AVAIL     REFER  MOUNTPOINT
diskz2/data_0@first    13K      -      180M  -

#还原快照
root@ubuntu:/diskz2/data_0# ls
file1  file2
root@ubuntu:/diskz2/data_0# rm -rf *
root@ubuntu:/diskz2/data_0# ls
root@ubuntu:/diskz2/data_0# zfs rollback diskz2/data_0@first 
root@ubuntu:/diskz2/data_0# ls
file1  file2

#删除快照
root@ubuntu:~# zfs list -t snapshot -r diskz2/data_0 
NAME                  USED  AVAIL     REFER  MOUNTPOINT
diskz2/data_0@first     0B      -       25K  -
root@ubuntu:~# zfs destroy -d diskz2/data_0@first 
root@ubuntu:~# zfs list -t snapshot -r diskz2/data_0 
no datasets available

三、ZFS物理组成部分:

3.1 描述:

zpool 命令用于配置 ZFS 存储池。一个存储池就是一个为 ZFS 数据集提供收集物理存储设备和数据同步功能的集合。 所有存在于相同存储池中的数据集共享相同的空间大小。数据集包含:ZFS文件系统、ZFS快照、ZFS克隆。所有存在于相同存储池中的数据集共享相同的空间大小。

存储池---不同于卷---存储池类似于我们传统物理模式下的RAID卡---不同于RAID卡的地方是:存储池是由软件设计实现的功能。因此存储池是可以跨越物理硬盘的。

3.2 创建raidz1:

root@ubuntu:~# zpool create diskz1 raidz1 sd{b,c,d}
root@ubt:~# zpool list
NAME     SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
diskz1   298G   199K   298G        -         -     0%     0%  1.00x    ONLINE  -
root@ubt:~# zpool status
no pools available
root@ubt:~# zpool create diskz1 raidz1 sd{b,c,d}
root@ubt:~# zpool status
  pool: diskz1
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        diskz1      ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            sdb     ONLINE       0     0     0
            sdc     ONLINE       0     0     0
            sdd     ONLINE       0     0     0

errors: No known data errors
#sd{b,c,d}每块磁盘大小为100G,创建raidz1(1是单倍校验,另外还有2、3--2倍校验和3倍校验)后可用空间为192G,有小部分空间被用来做哈希校验,对出错的数据进行修补。
#所需硬盘数量=raidzx+1,即使raidz1至少需要2块硬盘、raidz2至少需要3块硬盘、raidz3至少需要4块硬盘;
#存储容量计算方式=(N-P)*X;N硬盘数量,P几倍校验,X硬盘容量;

root@ubt:~# zfs create diskz1/data
root@ubt:~# zfs list
NAME          USED  AVAIL     REFER  MOUNTPOINT
diskz1        153K   192G     30.6K  /diskz1
diskz1/data  30.6K   192G     30.6K  /diskz1/data
#创建文件系统后,可以看到可用空间只有192G,因为raidz1有一块盘是拿来做校验的,因此raidz1坏掉一块盘不会影响数据完整性。

3.3 虚拟设备:

一个“虚拟设备”(vdev) 可以描述成是一个单一设备或者是一个根据某些特性和故
障特征等属性来收集设备的设备收集器[设备:指存储设备

disk 是一种块设备,位于/dev目录下。ZFS可以使用单独的柱面或分区,但是这里推荐的模式是使用整个磁盘。磁盘可以使用设备全路径名称或者使用/dev下的设备名来指定。当使用整个磁盘时,ZFS 有可能会自动为其添加卷标。

  • 使用硬盘创建存储池:
root@ubt:~# zpool create disk0 sdb #创建一个只有sdb的存储池

root@ubt:~# zpool status 
  pool: disk0
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        disk0       ONLINE       0     0     0
          sdb       ONLINE       0     0     0

errors: No known data errors

file 是指普通文件。这里强烈反对使用文件作为后备存储。它只是被设计成使用文件容错的实验特性,只有文件占用单独的文件系统才会达到正常磁盘性能。

  • 使用文件创建存储池:
root@ubuntu:/diskz1/zfs-file# truncate -s 6G zdisk.0
root@ubuntu:/diskz1/zfs-file# truncate -s 6G zdisk.1
root@ubuntu:/diskz1/zfs-file# ls -lh zdisk.*
-rw-r--r-- 1 root root 6.0G Aug 14 06:35 zdisk.0
-rw-r--r-- 1 root root 6.0G Aug 14 06:36 zdisk.1
root@ubuntu:/diskz1/zfs-file# zpool create diskz2 /diskz1/zfs-file/zdisk.0 /diskz1/zfs-file/zdisk.1
root@ubuntu:/diskz1/zfs-file# zpool status diskz2
  pool: diskz2
 state: ONLINE
  scan: none requested
config:

    NAME                        STATE     READ WRITE CKSUM
    diskz2                      ONLINE       0     0     0
      /diskz1/zfs-file/zdisk.0  ONLINE       0     0     0
      /diskz1/zfs-file/zdisk.1  ONLINE       0     0     0

errors: No known data errors

3.4 zfs存储池的两种组织模式:

3.4.1 mirror

对两块或多块磁盘进行镜像。数据以完全相同的方式在 mirror 组件中被复制。如果一个 mirror 由 N 块磁盘组成且单一尺寸小为 X ,可以容纳 X bytes 的数据并且可以承受 (N-1) 块磁盘坏损(硬盘数量为2或者2个倍数)。

使用mirror组织模式,如果sdb和sdc大小不同,可以加-f参数,但是空间以磁盘小的为准。

root@ubuntu:~# zpool create -f diskzM mirror sdb sdc mirror sdd sde
root@ubuntu:~# zpool status diskzM 
  pool: diskzM
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    diskzM      ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        sdb     ONLINE       0     0     0
        sdc     ONLINE       0     0     0
      mirror-1  ONLINE       0     0     0
        sdd     ONLINE       0     0     0
        sde     ONLINE       0     0     0

errors: No known data errors
root@ubuntu:~# zpool list
NAME     SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
diskzM    19G   147K  19.0G        -         -     0%     0%  1.00x    ONLINE  -

3.4.2 raidz

raidz (可以是 raidz1 raidz2 raidz3)。是 RAID-5 的变体,有比 RAID-5 更好的磁盘奇偶校验性能和弥补“RAID-5”掉电写入(掉电后数据和校验不一致)。数据和奇偶校验会在所有磁盘的 raidz 组中有条理的被访问。raidz 阵列组可以是 单、双、或三倍奇偶校验,也就意味着 raidz可以承受单、双、或三倍容错,而不丢失任何数据。raidz1 虚拟设备会建立一个单倍奇偶校验 raidz 阵列组;raidz2 虚拟设备会建立一个双倍奇偶校验raidz 阵列组;raidz3 虚拟设备会建立一个三倍奇偶校验 raidz 阵列组; raidz 虚拟设备默认是指 raidz1。一个 raidz 阵列组有 N 块磁盘组成,单一磁盘大小为 X ,且使用 P 倍校验,可以使用大约 (N-P)*X bytes 的数据空间,并且可以容纳 P 设备损坏而不损失数据。在 raidz 阵列组中最小磁盘数量应该是比奇偶校验模式数字多 1[比如:raid3 最少需要 4 块磁盘]。推荐的磁盘数量是 3-9 之间。

raidz模式,两个raidz组成条带化的存储池

root@ubuntu:~# zpool create diskz1 raidz sd{b,c,d,e} raidz sd{f,g,h,i}
root@ubuntu:~# zpool list diskz1
NAME     SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
diskz1    79G   263K  79.0G        -         -     0%     0%  1.00x    ONLINE  -
root@ubuntu:~# zpool status
  pool: diskz1
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    diskz1      ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        sdb     ONLINE       0     0     0
        sdc     ONLINE       0     0     0
        sdd     ONLINE       0     0     0
        sde     ONLINE       0     0     0
      raidz1-1  ONLINE       0     0     0
        sdf     ONLINE       0     0     0
        sdg     ONLINE       0     0     0
        sdh     ONLINE       0     0     0
        sdi     ONLINE       0     0     0

errors: No known data errors

3.4.3 spare

创建热备盘

root@ubuntu:~# zpool add diskz1 spare sdj
root@ubuntu:~# zpool status diskz1
  pool: diskz1
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    diskz1      ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        sdb     ONLINE       0     0     0
        sdc     ONLINE       0     0     0
        sdd     ONLINE       0     0     0
        sde     ONLINE       0     0     0
      raidz1-1  ONLINE       0     0     0
        sdf     ONLINE       0     0     0
        sdg     ONLINE       0     0     0
        sdh     ONLINE       0     0     0
        sdi     ONLINE       0     0     0
    spares
      sdj       AVAIL   

errors: No known data errors
#可以看到spares下面出现了sdj,当raidz组中的磁盘出现故障时,spare盘会顶替上去。

3.4.4 log

是一种独立的日志设备。如果指定了多于 1 个日志设备,那么数据会在这些设备之间进行 load-balanced [轮询/均衡] 写入。日志设备也可以被镜像[mirror]。但是 raidz 格式的虚拟设备组对专用日志设备不适用。

  • 添加日志盘
root@ubuntu:~# zpool create diskz1 raidz2 sd{b,c,d,e,f}
root@ubuntu:~# zpool add diskz1 log sdg
root@ubuntu:~# zpool status
  pool: diskz1
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    diskz1      ONLINE       0     0     0
      raidz2-0  ONLINE       0     0     0
        sdb     ONLINE       0     0     0
        sdc     ONLINE       0     0     0
        sdd     ONLINE       0     0     0
        sde     ONLINE       0     0     0
        sdf     ONLINE       0     0     0
    logs 
      sdg       ONLINE       0     0     0

errors: No known data errors

#给日志盘添加一个 镜像
root@ubuntu:~# zpool attach diskz1 sdg sdh
root@ubuntu:~# zpool status
  pool: diskz1
 state: ONLINE
  scan: resilvered 0B in 0 days 00:00:00 with 0 errors on Sat Aug 14 07:45:26 2021
config:

    NAME        STATE     READ WRITE CKSUM
    diskz1      ONLINE       0     0     0
      raidz2-0  ONLINE       0     0     0
        sdb     ONLINE       0     0     0
        sdc     ONLINE       0     0     0
        sdd     ONLINE       0     0     0
        sde     ONLINE       0     0     0
        sdf     ONLINE       0     0     0
    logs 
      mirror-1  ONLINE       0     0     0
        sdg     ONLINE       0     0     0
        sdh     ONLINE       0     0     0

errors: No known data errors

#attach与detach对应

3.4.5 cache

一种用于对存储池数据进行缓存的设备。这种缓存设备不能被配置成镜像或者 raidz 模式。

root@ubuntu:~# zpool add diskz1 cache sdj sdi
root@ubuntu:~# zpool status
  pool: diskz1
 state: ONLINE
  scan: resilvered 0B in 0 days 00:00:00 with 0 errors on Sat Aug 14 07:45:26 2021
config:

    NAME        STATE     READ WRITE CKSUM
    diskz1      ONLINE       0     0     0
      raidz2-0  ONLINE       0     0     0
        sdb     ONLINE       0     0     0
        sdc     ONLINE       0     0     0
        sdd     ONLINE       0     0     0
        sde     ONLINE       0     0     0
        sdf     ONLINE       0     0     0
    logs 
      mirror-1  ONLINE       0     0     0
        sdg     ONLINE       0     0     0
        sdh     ONLINE       0     0     0
    cache
      sdj       ONLINE       0     0     0
      sdi       ONLINE       0     0     0

errors: No known data errors

#注:虚拟设备不能被嵌套使用,所以 mirror 或 raidz 等虚拟设备只能包含文件或磁盘。比如:在 mirror 中再做 mirror(或者其他虚拟设备组合) 是不允许的。一个存储池在配置的最顶层(可以被认为是“root[根]”虚拟设备)可以有任意数量的虚拟设备。数据在所有顶层设备之间被动态均衡的访问。当有新虚拟设备被添加时,ZFS 会自动的对其存储数据。虚拟设备在命令执行完毕就会被指定。关键字 “mirror”和 “raidz”被用于区别阵列组在什么地方开始以及到什么地方结束。比如,以下命令用于创建两个虚拟顶层设备,每个虚拟设备是对两块盘进行镜像。

#zpool create mypool mirror da0 da1 mirror da2 da3

四、设备故障:

ZFS 对处理设备故障和数据坏损提供了一组丰富的处理机制。所有的元数据都是被添加了校验的,当有数据坏损时 ZFS 会自动的从正常区域拷贝数据以修复坏损数据。为了能使用到这些特性,存储池必须使用某种形式的冗余,比如 mirror 或 raidz阵列组。当 ZFS 运行在一个非冗余配置环境下那就意味着所有数据都会存储在单一的磁盘或文件中,这种方式是我们强烈反对的,哪怕出现一点坏损都有可能会导致你的全部数据都不可用[注:有些时候是磁盘的物理特性,而不是 ZFS 的特性]。

一个存储池的健康状况通常使用三种状态的其中一种来描述,他们是:online、degraded、或者 faulted;online[在线] 状态的存储池中所有设备都在正常运转。degraded[分裂] 状态的存储池中有一块或者多个设备失效但是数据由于冗余配置的存在仍然能够被正常访问;faulted[坏损] 状态的存储池中已经有元数据被损坏或者多于一个设备损坏,而且不足以使用副本数据继续支持正常访问。

顶级虚拟设备的健康状态(比如 mirror 和 raidz 设备)会受到其相关联的子集虚拟设备的影响,顶级虚拟设备或子集设备以及与其相关虚拟设备的状态如下:DEGRADED 一个或多个顶级虚拟设备处在 degraded 状态,因为一个或多个相关设备处在 offline 状态。存在足够的冗余以支持访问。

4.1 Degraded

DEGRADED 一个或多个顶级虚拟设备处在 degraded 状态,因为一个或多个相关设备处在 offline 状态。存在足够的冗余以支持访问。

  • 一个或多个相关设备处于 degraded 状态或 faulted 状态,但是存在足够的冗余以支持访问。底层条件如下:
    • 由于某些错误导致校验错误超过了可接受级别,设备已处于分裂状态。且 ZFS 有必要继续使用该设备。
    • I/O 错误数量超过了可接受级别。因为有足够的冗余副本支持工作,所以设备还没有被标记为 faulted 状态。
root@ubuntu:~# zpool offline diskz1 sdc
root@ubuntu:~# zpool status
  pool: diskz1
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
    Sufficient replicas exist for the pool to continue functioning in a
    degraded state.
action: Online the device using 'zpool online' or replace the device with
 'zpool replace'.
  scan: resilvered 0B in 0 days 00:00:00 with 0 errors on Sat Aug 14 07:45:26 2021
config:

    NAME        STATE     READ WRITE CKSUM
    diskz1      DEGRADED     0     0     0
      raidz2-0  DEGRADED     0     0     0
        sdb     ONLINE       0     0     0
        sdc     OFFLINE      0     0     0
        sdd     ONLINE       0     0     0
        sde     ONLINE       0     0     0
        sdf     ONLINE       0     0     0
    logs 
      mirror-1  ONLINE       0     0     0
        sdg     ONLINE       0     0     0
        sdh     ONLINE       0     0     0
    cache
      sdj       ONLINE       0     0     0
      sdi       ONLINE       0     0     0

errors: No known data errors

4.2 Faulted

FAULTED 一个或多个顶级虚拟设备处于 faulted 状态下,导致这种情况的原因是因为有一个或多个与其相关的子集设备等处于 offline 状态下。不存在足够的冗余以支持访问。

  • 一个或多个相关设备处于 faulted 状态下,不存在足够的冗余以支持访问。底层条件如下:
    • 设备可以被打开,但是内容错误。
    • I/O 错误已经超过了可接受级别,设备是 faulted 状态的,且不允许访问设备。
OFFLINE 设备被使用 “zpool offline” 命令明确的指定为离线。

ONLINE 设备在线并且工作。

REMOVED 设备在系统运行状态下被物理移除。热插拔属性属于物理支持,不是所有平台上都被支持。

UNAVAIL 设备不能被打开。当一个设备无效时导入一个存储池,只要路径第一次不能被正确装配那么这个设备就会被使用唯一标识而不是其全路径来确认。[不是物理损坏,而是物理访问句柄无效]

五、Properties

获取zpool属性

root@ubuntu:~# zpool get all diskz1
NAME    PROPERTY                       VALUE                          SOURCE
diskz1  size                           49.5G                          -
diskz1  capacity                       0%                             -
diskz1  altroot                        -                              default
diskz1  health                         DEGRADED                       -
diskz1  guid                           1857335905105017657            -
diskz1  version                        -                              default
diskz1  bootfs                         -                              default
diskz1  delegation                     on                             default
diskz1  autoreplace                    off                            default
diskz1  cachefile                      -                              default
diskz1  failmode                       wait                           default
diskz1  listsnapshots                  off                            default
diskz1  autoexpand                     off                            default
diskz1  dedupditto                     0                              default
diskz1  dedupratio                     1.00x                          -
diskz1  free                           49.5G                          -
diskz1  allocated                      552K                           -
diskz1  readonly                       off                            -
diskz1  ashift                         0                              default
diskz1  comment                        -                              default
diskz1  expandsize                     -                              -
diskz1  freeing                        0                              -
diskz1  fragmentation                  0%                             -
diskz1  leaked                         0                              -
diskz1  multihost                      off                            default
diskz1  checkpoint                     -                              -
diskz1  load_guid                      5384114779895256754            -
diskz1  autotrim                       off                            default
diskz1  feature@async_destroy          enabled                        local
diskz1  feature@empty_bpobj            enabled                        local
diskz1  feature@lz4_compress           active                         local
diskz1  feature@multi_vdev_crash_dump  enabled                        local
diskz1  feature@spacemap_histogram     active                         local
diskz1  feature@enabled_txg            active                         local
diskz1  feature@hole_birth             active                         local
diskz1  feature@extensible_dataset     active                         local
diskz1  feature@embedded_data          active                         local
diskz1  feature@bookmarks              enabled                        local
diskz1  feature@filesystem_limits      enabled                        local
diskz1  feature@large_blocks           enabled                        local
diskz1  feature@large_dnode            enabled                        local
diskz1  feature@sha512                 enabled                        local
diskz1  feature@skein                  enabled                        local
diskz1  feature@edonr                  enabled                        local
diskz1  feature@userobj_accounting     active                         local
diskz1  feature@encryption             enabled                        local
diskz1  feature@project_quota          active                         local
diskz1  feature@device_removal         enabled                        local
diskz1  feature@obsolete_counts        enabled                        local
diskz1  feature@zpool_checkpoint       enabled                        local
diskz1  feature@spacemap_v2            active                         local
diskz1  feature@allocation_classes     enabled                        local
diskz1  feature@resilver_defer         enabled                        local
diskz1  feature@bookmark_v2            enabled                        local

每个存储池都有一些相关属性。一些属性是只读的,另外一些属性是可配置和更改的。以下是一些只读属性:

  • alloc:存储池中已经被物理分配的有效存储空间。
  • capacity:存储池的已用空间,这个属性也可以使用他的短列名“cap”给出。
  • comment:存储成由文本字符串组成且可打印ASCII字符集,即使存储池失效这个属性也同样是有效的。对于存储池的这个特性超级管理员可以获得更多额外的有效帮助信息。
  • dedupratio:是为存储池指定的精简重复数据的属性,用乘法表示。比如:重复数据删除率的值为 1.76 则表示有 1.76 单位的数据被存储,但是只用到 1 单位的实际硬盘存储空间 [可以理解为:1.76:1]。
  • free:存储池中未被划分的数据块的数量。[包括未被添加到 存储池中的游离状态的磁盘总空间 ,以及添加到存储池中不能被正常使用的剩余磁盘空间 ]。
  • freeing:当一个文件系统或者一个快照被摧毁后他们所使用的空间会异步的回归到存储池中。freeing 则表示这部分需要被回收的空间。一段时间后 freeing 空间将减少 free 空间将增加[注:回收过程]。
  • expandsize:存储池内未初始化的空间或者是可以增加存储池容量的设备。未初始化的设备包括具有 EFI 标签且未上线的 vdev 设备(比如使用zpool online -e)。当 LUN 扩展时,这块空间自动增加。[注:其实意思是说当使用大容量新盘替换小容量旧盘时,新盘多出来的容量可以被自动扩展和识别]。
  • guid:存储池的唯一标识。
  • health:当前存储池的健康状态,状态值可以是:online、degraded、faulted、offline、remove、unavail等。
  • size:存储池的总空间大小。
  • unsupported@feature_guid:给出“信息不被支持的属性已经在存储池上启用”的提示。
  • used:存储池中已使用的空间大小。
  • altroot:修改zfs文件系统默认挂载位置。只能在创建时设定zpool create -o altroot=/mp diskz mirror sdb sdc。
  • readonly=on|off:如果设置了on,存储池被以只读的方式导入,并有如下限制:
    • 同步在专用日志设备中的数据将不可访问。
    • 不能改变池的属性。
    • 此池中的数据集也只能以只读方式被挂载。
    • 如果向一个只读存储池中写入数据,导入和导出存储池也是必须的。
    • autoexpand 所有硬盘替换更大的硬盘后,会自动扩展zpool空间。

六、修改存储池属性:

root@ubuntu:~# zpool get comment diskz1
NAME    PROPERTY  VALUE    SOURCE
diskz1  comment   -        default
root@ubuntu:~# zpool set comment="here is diskz1" diskz1
root@ubuntu:~# zpool get comment diskz1
NAME    PROPERTY  VALUE           SOURCE
diskz1  comment   here is diskz1  local

七、挂载和引入: