ZFS详解及具体操作代码及流程

ZFS

简介

ZFS可完全避免使用卷管理。ZFS将设备聚集到存储池中,而不是强制要求创建虚拟卷。不再需要预先确定文件系统的大小,因为文件系统会在分 配给存储池的磁盘空间内自动增长。添加新存储器后,无需执行其他操作,池中的所有文件系统即可立即使用所增加的磁盘空间

vdev(virtual device)由一个或多个磁盘组成的阵列的虚拟设备,一个存储池(pool)至少有一个vdev(存储设备)。一个存储池由一个或多个vdev组成,vdev间是以条带式组合,坏一个,所有数据丢失。一个池中的vdev的阵列类型必须相同(raid-z/mirror…)

鼓励为每个用户、项目、工作区等创建一个文件系统。通过此设计,可定义细分的管理点

建议至少使用7-13GB的磁盘空间,RAID-Z 配置包含的分组中的磁盘数目应为一位数 (1-9)

使用iscsi,挂载到客户端,即使格式化为其他格式,也并不影响服务端zfs的使用

  • 建议:

    始终启用压缩,性能消耗低

    除非有RAM,否则请避免使用重复数据删除

    使用配额

命名规范

  • 特殊字符:
    1. 下划线(_)
    2. 连字符(-)
    3. 冒号(😃
    4. 句点(.)
  • 池名必须以字母开头
  • 数据集必须以字母数字开头

简单命令

创建以及销毁

  • 创建虚拟磁盘(重复操作)

    dd if=/dev/zero of=disk0.img bs=64M count=1
    losetup /dev/loop0 ./disk0.img
    
  • 同时创建名为tank的基本镜像存储池和名为tank的 ZFS文件系统

    zpool create tank mirror /dev/loop0 /dev/loop1
    
  • 使用高速缓存设备创建ZFS存储池

    zpool create tank mirror /dev/loop0 /dev/loop1 cache c2t5d0
    
  • 在存储池tank中创建名为fs的文件系统(创建成功则自动挂载,挂载点为提供的路径 tank/fs)

    zfs create [-o mountpoint=...] pool-name/[filesystem-name/]filesystem-name
    zfs create -o mountpoint=/export/zfs tank/fs
    zfs create -m /export/zfs tank/fs
    zfs create -n tank/fs (预创建池,此预运行选项执行设备使用中检查和复制级别验证,此操作不会创建池)
    zfs create -V 5gb tank/vol
    
  • 设置文件系统属性(会继承)

    zfs set compreson tank/fs
    
  • 删除存储池(注意:存储池被删除后,数据也同时会丢失)

    使用destroy子命令时不会出现确认提示。请务必谨慎使用该子命令

    zpool destroy [-f] [-r](递归) tank
    
  • 删除文件系统(注意:存储池被删除后,数据也同时会丢失)

    使用destroy子命令时不会出现确认提示。请务必谨慎使用该子命令

    zfs destroy [-f] [-r] [-R](若有间接依赖项) tank/home
    

查看

  • 查看存储池结果

    zpool list [-r](递归查询) [-o name,mountpoint...](查询特定信息) [-t volume or filesystem or snapshot] [-H](忽略标题) [tank/fs]
    
  • 查看存储池状态

    zpool status [tank] [-x](健康状态) [-v](列出带有详细说明的完成错误列表) [-T d](显示时间戳) [间隔时间] [执行次数]
    
  • 查看历史记录

    zpool history [-l] [-i] [tank]
    
  • 查看存储池io统计信息

    zpool iostat [-l] [-v] [-T d](显示时间戳) [间隔时间] [执行次数]
    
  • 查看文件系统

    zfs list [-t snapshot] [[-r] [tank2]]
    zpool set listsnapshots=on tank2 (执行zfs list 则会列出快照)
    
  • 查看属性

    zfs get all [-s local or default or inherited or temporary or none] [-r](递归) -H(省略标题) tank/fs
    zfs get checksum tank/fs
    
  • 查看已挂载的zfs文件系统

    zfs mount [| grep tank/fsfs]
    

挂载

  • 挂载zfs文件系统

    zfs mount tank/fs
    
  • 取消挂载zfs文件系统

    zfs unmount [-f] tank/fs
    
  • 阻止文件系统被挂载,需手动挂载

    zfs set canmount=off tank  (不会自动挂载)
    zfs set mountpoint=legacy tank  (不会自动挂载)
    

存储池设备管理

  • 向存储池中添加设备

    zpool add [-n](执行预运行) tank mirror /dev/loop13 /dev/loop14
    
  • 向存储池中附加设备

    zpool attach tank2 loop12 loopnew
    
  • 分割镜像zfs存储池以创建新池

    zpool split [-R /tank3](若挂载点冲突则需,指定新池的备用根目录) tank2 tank3 [loop11](指定分配到新池的设备)
    zpool import tank3
    
    
  • 删除属于主镜像池配置的设备(非冗余设备和 RAID-Z 设备无法从池中删除)

    zpool detach tank2 loop11
    
  • 删除设备(仅能删除日志设备,cache,热备份)

    zpool remove tank mirror-1
    
  • 替换存储池中设备

    zpool replace tank loop0 loop3
    
  • 添加热备件(热备件的大小必须等于或大于池中最大磁盘的大小)自动替换

    zpool add tank spare loop4
    zpool replace tank brokenloop(损坏的磁盘)
    zpool detach tank loop4
    
    
  • 使设备脱机/联机

    zpool offline [-t](重新引导时会自动联机) tank2 loop12
    zpool online tank2 loop12
    

迁移存储池

  • 导出zfs存储池

    zpool export [-f] tank
    
  • 导入zfs存储池(仅在 /dev/dsk 目录中搜索设备)

    zpool import(类似查询,不能导入)
    若设备存在于其他目录中zpool import -d /file
    zpool import tank
    zpool import 6223921996155991199(id)
    zpool import dozer zeepool(别名) 
    zpool import -o readonly=on tank (只读模式)
    zpool import -m (导入缺少日志设备的池)
    
  • 恢复已销毁的存储池

    zpool destroy tank
    zpool import -D(类似查询,不能导入)
    zpool import -D tank
    

设置ZFS配额和预留空间

如果对 tank/home 文件系统设置了配额,则 tank/home 及其所有后代使用的总磁盘空间量不能超过该配额。同样,如果为 tank/home 指定了预留空间,则tank/home 及其所有后代都会使用该预留空间。

  • 设置ZFS文件系统的配额(不能将配额设置为比文件系统当前使用的空间小的数量)

    zfs set quota=10G tank/home/data
    
  • 在ZFS文件系统中设置用户和组配额

    zfs set userquota@student1=10G tank/home/data
    

ZFS 预留空间是从池中分配的保证可供数据集使用的磁盘空间

  • 在ZFS文件系统中设置用户和组配额

    zfs set reservation=5G tank/home/data
    

委托权限

  • 显示ZFS委托权限

    zfs allow tank/home
    
  • 向单个用户委托权限

    zfs allow [-l]仅在当前文件系统 [-d]仅允许在后代文件系统 mark create,destroy,mount tank/home
    
  • 向用户组委托权限

    zfs allow [-l]仅在当前文件系统 [-d]仅允许在后代文件系统 staff create,mount tank/home
    
  • ZFS委托权限集

    zfs allow -s @myset create,destroy,mount,snapshot,promote,clone,readonly tank/home
    zfs allow mark @myset,rename tank/home
    
  • 删除ZFS委托权限

    zfs unallow mark rename tank/home (删除snapshot权限)
    zfs unallow mark tank/home (删除全部权限)
    zfs unallow -s @myset tank/home (删除@myset权限集)
    

其他

  • 升级存储池

    zpool upgrade -a
    
  • ZFS重复数据删除属性

    zfs set dedup=on tank/home
    
  • 重命名zfs文件系统

    1. 更改文件系统的名称。
    2. 在ZFS分层结构内重定位文件系统。
    3. 更改文件系统的名称并在ZFS分层结构内对其重定位。
    zfs rename tank/fs tank/newfs      //重命名文件系统
    zfs rename tank/newfs/test tank/fsfs/test   //重定位文件系统(同一池中,空间足够)
    

快照

  • 创建快照

    zfs snapshot [-r](递归) tank/fsfs@yesterday
    
  • 查询快照

    zfs list [-r] -t snapshot [-o name,creation] tank/fsfs
    
  • 销毁快照

    zfs destroy [-r](递归) tank/fsfs@yesterday
    
  • 对快照保持

    zfs hold [-r] keep tank/fsfs@today 加保持(此时不允许销毁快照)
    zfs holds [-r] tank/fsfs@today 查询保持
    zfszfs release [-r] keep tank/home@now 释放保持(此时允许销毁快照)
    
  • 重命名快照

    zfs rename [-r] tank/fsfs@snap1 tank/fsfs@today
    zfs rename [-r] tank/fsfs@snap1 today
    
  • 回滚快照(文件系统会取消挂载并重新挂载)(-f 强制)

    zfs rollback [-r](删除在yesterday之后创建的快照) tank/home/data@yesterday
    
  • 快照差异

    zfs diff tank/home/data@snap1 tank/home/data@snap2
    (M表示修改,+表示存在于较新的快照中,-表示存在于较老的快照中)
    

克隆(只要克隆存在就无法删除原始快照)

  • 创建克隆

    zfs clone tank/home/data@1 tank/clonedata
    
  • 销毁克隆(必须先销毁克隆,才能销毁父快照)

    zfs destroy tank/clonedata
    
  • 克隆替换原文件系统(快照同时也会更改为tank/clonedata@1)

    zfs promote tank/clonedata
    重命名文件系统
    zfs rename tank/home/data tank/home/datalegacy
    zfs rename tank/clonedata tank/home/data
    

发送与接收zfs数据

  • 发送到同一系统中

    zfs send tank/home/data@1 | zfs recv tank2/data (发送完整的流时,目标文件系统必须不能存在)
    zfs send -i tank/home/@1 tank/home/data@2 |zfs recv tank2/data(此时目标文件系统必须存在)
    等同于
    zfs send -i @1 tank/home/data@2 |zfs recv [-F] tank2/data(此时目标文件系统必须存在)
    (若提示目标文件系统已修改,则对目标文件系统执行zfs rollback tank2/data@1或在目标文件系统前加上-F)
    
  • 发送到不同系统中

    zfs send tank/home/data@1 |ssh sys2 zfs recv tank2/data (发送完整的流时,目标文件系统必须不能存在)
    
  • 将一组增量快照合并 并发送/接收

    //存在tank/fs@1 tank/fs@2 tank/fs@3 tank/fs@4
    zfs send -I tank/fs@1 tank/fs@4 > /backup/fs@all-I
    zfs destroy pool/fs@2
    zfs destroy pool/fs@3
    zfs destroy pool/fs@4
    //接收组合快照(目标文件系统需要存在 因为是增量)(快照同时会一起接收)
    zfs receive -d -F tank2/fs < /backup/fs@all-I
    
  • 合并快照和克隆快照

    zfs send -I pool/fs@snap1 pool/clone@snapA > /snaps/fsclonesnap-I
    zfs destroy pool/clone@snapA
    zfs destroy pool/clone
    zfs receive -F pool/clone < /snaps/fsclonesnap-I
    
  • 使用send -R命令将ZFS文件系统和所有后代文件系统复制到一个已命名的快照中

    zfs snapshot -r tank/users@today
    zfs send -R tank/users@today> /backup/users-r
    zfs destroy -r tank/users
    zfs receive -F [-d](若存在tank/users则不需要-d) tank/users < /backup/users-r
    zfs receive -F [-d](若存在tank/users则不需要-d) tank2/users < /backup/users-r (接收到另一个池tank2)
    
  • 属性

    查看p180
    

共享NFS(若为SMB,sharenfs→sharesmb)待验证!!

  • 共享(默认文件系统是非共享的)(属性是继承的)

    ·zfs set sharenfs=on tank/home
    ·zfs set sharenfs=ro tank/home/2;zfs share [tank/home/2] [a]
    
  • 取消共享

    ·zfs set sharenfs=off tank/home
    ·zfs unshare [tank/home/2] [-a]
    

共享iscsi(传统方法)

  • iSCSI

    服务端

    • 在服务端创建一个ZFS供target之用

      zfs create -s -V 4G -b 4k tank/testtarget
      
    • 在 /etc/rc.conf 里增加下面一行启用ctld(iSCSI服务)

      ctld_enable="YES"
      
    • 配置ctld。创建 /etc/ctl.conf 文件

      portal-group san {
              discovery-auth-group no-authentication
              listen 192.168.x.x
      }
       
      target iqn.2014-05.com.example:target0 {
              auth-group no-authentication
              portal-group san
              lun 0 {
                      path /dev/zvol/tank/testtarget
                      blocksize 4096
                      size 4G
              }
      }
      
    • 启动target

      chmod 600 /etc/ctl.conf
      service ctld start
      

    客户端

    • 安装软件

      sudo apt-get install open-iscsi open-iscsi-utils
      
    • 启动服务

      sudo service open-iscsi start
      
    • 搜索target

      sudo iscsiadm -m discovery -t sendtargets -p 192.168.x.x
      
    • 登录连接target

      sudo iscsiadm -m node -T iqn.2014-05.com.example:target0 -p 192.168.x.x -l
      
  • iSCSI-SCST

    服务端(target)

    • 安装内核升级

      yum install gcc ncurses-devel kernel-devel lsscsi patch subversion
      
    • 下载scst源代码

      svn co https://svn.code.sf.net/p/scst/svn/trunk scst
      
    • 转到 SCST 源目录。默认情况下,生成模式是用于调试 SCST 代码的调试模式。若要将此选项更改为释放模式,请发出以下命令:

      cd scst
      make 2release
      
    • 构建并安装 SCST 内核模块

      BUILD_2X_MODULE=y make all install
      
    • 验证安装是否成功

      ls -l /lib/modules/`uname -r`/extra/scst*.ko
      
    • 插入 SCST内核模块

      for j in scst scst_vdisk scst_user ; do modprobe $j ; done
      
    • 创建虚拟设备,该设备将由 SCST 使用 iSCSI 导出为 LUN

      dd if=/dev/zero of=/mnt/disk01 bs=1024k count=512
      
    • 创建一个示例配置文件,该配置文件将使用此命令将此新创建的设备导出为 LUN

      # cat << /etc/scst.conf
      *HANDLER vdisk_fileio {
      DEVICE disk1 {
      filename /mnt/disk1
      }
      }
      TARGET_DRIVER iscsi{
      TARGET iqn.2015-11.com.example:storage1 {
      enabled 1
      LUN 0 disk1
      }
      }
      EOF*
      
    • 使用 SCST 服务重新启动 SCST

      /etc/init.d/scst restart
      

    客户端(initiator)

    • 安装启动器包

      yum install -y iscsi-initiator-utils
      
    • 发现目标

      iscsiadm -m discovery -t sendtargets -p <IP_ADDRESS_TARGET>
      
    • 登录

      iscsiadm -m node –targetname <targetname> -p <IP_ADDRESS_TARGET> --login
      
    • 使用 fdisk 检查 LUN 在启动器环境中是否可见

      fdisk -l
      
    • 使用 fdisk 和mkfs命令创建分区和格式化磁盘

      # fdisk -l /dev/sdb4
      *Disk /dev/sdb4: 536 MB, 536870912 bytes, 1048576 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*
      # mkfs.ext4 /dev/sdb4
      *mke2fs 1.42.9 (28-Dec-2013)
      Discarding device blocks: done
      Filesystem label=
      OS type: Linux
      Block size=4096 (log=2)
      Fragment size=4096 (log=2)
      Stride=0 blocks, Stripe width=0 blocks
      32768 inodes, 131072 blocks
      6553 blocks (5.00%) reserved for the super user
      First data block=0
      Maximum filesystem blocks=134217728
      4 block groups
      32768 blocks per group, 32768 fragments per group
      8192 inodes per group
      Superblock backups stored on blocks:
      32768, 98304
       
      Allocating group tables: done
      Writing inode tables: done
      Creating journal (4096 blocks): done
      Writing superblocks and filesystem accounting information: done*
      

共享iscsi

  • 安装 COMSTAR 存储服务器软件

    pkg install group/feature/storage-server
    
  • 重新引导系统或启用 stmf 服务

    target# svcadm enable stmf
    # svcs stmf
    
  • 完成 COMSTAR 配置之后,复制一份可恢复的副本(如果需要)

    svccfg export -a stmf > COMSTAR.backup (导出)
    svccfg import COMSTAR.backup (导入)
    
  • 创建 ZFS 卷作为 SCSI LUN 使用

    zfs create -V 2g sanpool/vol1
    
  • 为 ZFS 卷创建 LUN

    stmfadm create-lu /dev/zvol/rdsk/sanpool/vol1
    //Logical unit created: 600144F0B5418B0000004DDAC7C10001
    
  • 确认已创建 LUN

    stmfadm list-lu
    
  • 添加 LUN 视图(此命令使 LUN 可访问所有系统)

    stmfadm add-view 600144F0B5418B0000004DDAC7C10001
    
  • 验证 LUN 配置

    stmfadm list-view -l 600144F0B5418B0000004DDAC7C10001
    View Entry: 0
        Host group   : All
        Target group : All
        LUN          : 0
    

创建 iSCSI 目标

  • 启用 iSCSI 目标服务

    svcadm enable -r svc:/network/iscsi/target:default
    
  • 确认服务已启用

    target# svcs -l iscsi/target
    fmri         svc:/network/iscsi/target:default
    name         iscsi target
    enabled      true
    state        online
    next_state   none
    state_time   Mon May 23 14:48:59 2011
    logfile      /var/svc/log/network-iscsi-target:default.log
    restarter    svc:/system/svc/restarter:default
    dependency   require_any/error svc:/milestone/network (online)
    dependency   require_all/none svc:/system/stmf:default (online)
    
  • 创建iSCSI目标

    itadm list-target -v
    
  • 显示 iSCSI 目标信息

    stmfadm list-lu
    

配置 iSCSI 启动器

  • 启用 iSCSI 启动器服务

    initiator# svcadm enable network/iscsi/initiator
    
  • 登录到提供目标的服务器的同时,验证目标名称和 IP 地址

    target# ipadm show-addr
    ADDROBJ           TYPE     STATE        ADDR
    lo0/v4            static   ok           127.0.0.1/8
    e1000g0/_b        dhcp     ok           10.80.227.189/24
    lo0/v6            static   ok           ::1/128
    e1000g0/_a        addrconf ok           fe80::214:4fff:fe27:360c/10
    target# itadm list-target -v
    TARGET NAME                                                  STATE    SESSIONS 
    iqn.1986-03.com.sun:02:73d12edc-9bb9-cb44-efc4-c3b36c039405  online   0        
            alias:                  -
            auth:                   none (defaults)
            targetchapuser:         -
            targetchapsecret:       unset
            tpg-tags:               default
    
  • 配置要静态搜索的目标

    initiator# iscsiadm add static-config iqn.1986-03.com.sun:02:73d12edc-9bb9-cb44-efc4-c3b36c039405,
    10.80.227.189
    
  • 查看静态配置信息

    initiator# iscsiadm list static-config
    
  • 配置以下目标搜索方法之一

    如果已配置动态搜索 (SendTargets) 目标,请配置 SendTargets 搜索方法
    initiator# iscsiadm add discovery-address 10.80.227.189
    如果已配置动态搜索 (iSNS) 目标,请配置 iSNS 搜索方法。
    initiator# iscsiadm add isns-server 10.80.227.189
    
  • 启用以下目标搜索方法之一

    如果已配置动态搜索 (SendTargets) 目标,请启用 SendTargets 搜索方法
    initiator# iscsiadm modify discovery --sendtargets enable
    如果已配置动态搜索 (iSNS) 目标,请启用 iSNS 搜索方法。
    initiator# iscsiadm modify discovery --iSNS enable
    如果已配置静态目标,请启用静态目标搜索方法。
    initiator# iscsiadm modify discovery --static enable
    
    
  • 如有必要,请重新配置 /dev 名称空间来识别 iSCSI 磁盘

    initiator# devfsadm -i iscsi
    

删除等更加详细的操作请见链接

共享iSCSI

  • 共享iscsi(失效)
    • 创建 ZFS 稀疏卷

      zfs create -sVsize poolname/volumename
      example: zfs create -sV 100G vdipool/vdi-disks
      
    • 通过 iSCSI 共享 ZFS 卷

      zfs set shareiscsi=on poolname/volumename
      example: zfs set shareiscsi=on vdipool/vdi-disks
      
    • 使用 iscsitadm list target 命令获取 iSCSI 目标的详细信息

      iscsitadm list target
      

错误处理

  • 显式ZFS数据清理

    zpool scrub tank
    zpool status -v tank (显示清理结果)
    zpool scrub -s tank (停止请理)
    
  • 清除瞬态错误

    zpool clear tank /dev/loop0 
    zpool clear tank (清除所有设备错误)
    

影子迁移zfs(暂不支持)

  1. 创建一个空zfs
  2. 将此zfs的shadow属性指向要迁移的文件系统
    • shadow=file:///path-使用此语法迁移本地文件系统
    • shadow=nfs://host:path-使用此语法迁移 NFS 文件系统
  3. 数据从要迁移的文件系统复制到影子文件系统(要迁移的文件系统必须为只读)

总结

  • Zfs命令包括一组子命令主要如下:

    create 创建zfs文件系统

    destroy 摧毁一个ZFS文件系统

    snapshot 建立一个文件系统的快照

    rollback 从一个文件系统的快照中恢复

    clone 建立一个文件系统的克隆

    promote 从一个克隆创建一个文件系统

    upgrade 升级 ZFS 文集系统

    list查看和询问数据集的信息

    allow 将用于执行 ZFS 管理任务的细粒度权限委托给非特权用户

    unallow 将用于执行 ZFS 管理任务的细粒度权限删除

    share 共享zfs文件系统

    unshared 取消共享zfs文件系统

    rename 重命名 ZFS 快照

    mount 挂载zfs文件系统

    umount 卸载zfs文件系统

    set 可以设置或修改数据集的属性

    get 得到文件系统的一个专门属性

  • zpool命令包括一组子命令如下:

    create 使用指定的实际设备建立存储池

    destroy摧毁一个ZFS存储池,但是不删除设备中数据

    add 在存储池中添加虚拟设备

    remove 在存储池中删除虚拟设备,但是不删除设备中数据

    list 显示所有存储池

    iostat查看存储池I/O状况

    status 查看存储池健康状况

    online把存储池状态设置为在线

    offline把存储池状态设置为离线

    clear 消除存储池设备错误计数

    attach 固定一个设备在存储池中

    detach 从存储池中分离设备

    replace 替换存储池中的设备

    scrub 校验存储池

    import 导入存储池

    export 导出存储池

    upgrade 升级存储池

    history 显示所有存储池操作命令

    get 找回和列出存储池的设备

    set 设置一个或者多个设备在一个存储池

  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值