1

ZFS pools, VDEVs, physical drivers

  1. 大多数情况下是这样:physical drivers(物理驱动器)组合在一起形成VDEVs(Virtual Devices虚拟设备)。当然,VDEVs还可以是

    1. 最普通的单一的物理硬盘
    2. Mirror或是n-way mirror,或者是RAID1
    3. RAIDZ,这个基本上和RAID5一样,但规避了RAID5的缺点.
    4. RAIDZ2或RAIDZ3,这两者的区别是使用几块硬盘来进行备份
  2. 接着 VDEVs组合成一个ZFS pool。这个池里的数据分布在所有的VDEVs上,使用更高级别的条带化(具说raid5就是这块有点问题)

所以如果把数据存在池中,如果池中的 VDEVs 有一个不安全,那么这个数据肯定也不安全。

磁盘信息

# camcontrol devlist
<NECVMWar VMware SATA CD00 1.00>   at scbus2 target 0 lun 0 (cd0,pass0)
<VMware Virtual disk 2.0>          at scbus32 target 0 lun 0 (pass1,da0)
<VMware Virtual disk 2.0>          at scbus32 target 1 lun 0 (pass2,da1)
<ATA HGST HTS721010A9 A3W0>        at scbus33 target 0 lun 0 (pass3,da2)
<ATA ST500DM002-1BD14 KC65>        at scbus33 target 1 lun 0 (pass4,da3)
<ATA WDC WD10EZEX-08M 1A01>        at scbus33 target 2 lun 0 (pass5,da4)
<ATA ST500DM002-1BD14 KC65>        at scbus33 target 3 lun 0 (pass6,da5)

可见,当前系统有一个 CD 驱动器,两块VMware提供的硬盘以及4块走通的 ATA 硬盘组成.

查看当前分区:

root@nfs:/home/panjie #  gpart show
=>      40  62914480  da0  GPT  (30G)
        40      1024    1  freebsd-boot  (512K)
      1064       984       - free -  (492K)
      2048   4194304    2  freebsd-swap  (2.0G)
   4196352  58716160    3  freebsd-zfs  (28G)
  62912512      2008       - free -  (1.0M)

=>      40  62914480  da1  GPT  (30G)
        40      1024    1  freebsd-boot  (512K)
      1064       984       - free -  (492K)
      2048   4194304    2  freebsd-swap  (2.0G)
   4196352  58716160    3  freebsd-zfs  (28G)
  62912512      2008       - free -  (1.0M)

查看池信息

root@nfs:/home/panjie # zpool list
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
zroot  27.5G  1.35G  26.1G        -         -     0%     4%  1.00x    ONLINE  -

可见,当前有一个zroot池,大小为27.5GT,已使用了1.35G,可用容量为26.1G,使用率为4%,状态为在线.

接下来我看看这个zroot池由几个VDEV组成:

root@nfs:/home/panjie # zpool status
  pool: zroot
 state: ONLINE
config:

    NAME        STATE     READ WRITE CKSUM
    zroot       ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        da0p3   ONLINE       0     0     0
        da1p3   ONLINE       0     0     0

errors: No known data errors

可见当前zroot由一个VDEV组成,名称为mirror-0,该VDEV中有两块硬盘块(da0p3实际上是da0硬盘的第3个分区)组成.

接下来我们使用另外4块硬盘组成RAIDZ,并新建一个池叫:yzpool

创建池及RAIDZ

RAIDZ也叫RAIDZ1,指使用1块硬盘来做备份,组成RAIDZ要求最少有3块硬盘。

root@nfs:/home/panjie # zpool create -f yzpool raidz da2 da3 da4 da5
root@nfs:/home/panjie # zpool list
NAME     SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
yzpool  1.81T   912K  1.81T        -         -     0%     0%  1.00x    ONLINE  -
zroot   27.5G  1.35G  26.1G        -         -     0%     4%  1.00x    ONLINE  -

此时我们便有了两个pool,其中一个zroot用于运行系统,该pool有两块大小均为30G的虚拟硬盘组成,分别存放在两块不同的物理硬盘上。这保证了其中一块损坏后系统也可以正常运行。另一个yzpool由4块硬盘组成,两块500G,两块1T。得益于 ZFS 的优秀机制,我们后期可以任意替换容器小的硬盘从而达到提升存储池大小的目的。

root@nfs:/home/panjie # zpool status yzpool
  pool: yzpool
 state: ONLINE
config:

    NAME        STATE     READ WRITE CKSUM
    yzpool      ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        da2     ONLINE       0     0     0
        da3     ONLINE       0     0     0
        da4     ONLINE       0     0     0
        da5     ONLINE       0     0     0

errors: No known data errors

此时yzpool这个新池已经被自动挂载到/yzpool上了:

root@nfs:/yzpool # df -h
...
yzpool                1.3T    140K    1.3T     0%    /yzpool

重新创建pool

如果不小心操作系统挂了,也不用担心。zfs可以非常轻松的将原来的数据拿回来。

显示可以import的zpool:

$ zpool import

导入zpool

$ zpool import -f <zroot>
$ zpool list

其它

# 查看yzpool存储池写入读取状态
# zpool iostat -v yzpool
# 查看更多写入、等待状态
# zpool iostat -vly yzpool 1 1

参考文档

https://docs.freebsd.org/zh-tw/books/handbook/zfs/#zfs-zpool

https://docs.oracle.com/cd/E24847_01/html/819-7065/zfsover-1....


潘杰
3.1k 声望239 粉丝

引用和评论

0 条评论