一、VDEVs简介
首先,我们需要了解虚拟设备或VDEV的概念。如果你已经熟悉RAID,那么这个概念对你来说并不陌生,尽管你可能没有将其称为“VDEVs”。基本上,我们有一个代表一个或多个物理设备的元设备。在Linux软件RAID中,您可能有一个“/dev/md0”设备,它代表一个包含4个硬盘的RAID-5阵列。在这种情况下,“/dev/md0”将是您的“VDEV”。
ZFS中有七种类型的VDEV:
disk(default) - 系统中的物理硬盘驱动器。
file - 预分配文件/镜像的绝对路径。
mirror - 标准软件RAID-1镜像。
raidz1/2/3 - 非标准分布式基于奇偶校验的软件RAID级别。
备用硬盘标记为ZFS软件RAID的“热备件”
cache - 用于2级自适应读缓存(L2ARC)的设备。
log - 一个单独的日志(SLOG),称为“ZFS Intent Log”或ZIL。
值得注意的是,VDEV始终是动态条带化的。但是,假设ZFS条带中有4个硬盘,条带大小由硬盘数量和阵列中硬盘的大小计算得出。如果添加了更多硬盘,则可以根据需要调整其他硬盘的条带大小。
二、zfs池
2.1 创建raidz1池
# zpool create storage raidz1 sda sdb sdc
RAIDZ-1类似于RAID-5,因为在阵列中的所有硬盘上都有一个奇偶校验位。 条带宽度是可变的,可以覆盖阵列中硬盘的精确宽度,更少的硬盘或更多的硬盘。 RAIDZ-1只允许一个硬盘故障来维护数据,两次硬盘故障会导致数据丢失。RAIDZ-1中至少应使用3个硬盘,存储容量将是阵列中硬盘的数量乘以最小硬盘的存储量,减去一个用于奇偶校验存储的硬盘。
2.2 查看pool信息
# zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
storage 8.12T 2.48M 8.12T - 0% 0% 1.00x ONLINE -# zpool status storagepool: storagestate: ONLINEscan: none requested
config:NAME STATE READ WRITE CKSUMstorage ONLINE 0 0 0raidz1-0 ONLINE 0 0 0sda ONLINE 0 0 0sdb ONLINE 0 0 0sdc ONLINE 0 0 0errors: No known data errors
三、文件系统
3.1 创建adfs
# zfs create storage/adfs
3.2 查看adfs相关信息
# zfs get all storage/adfs
NAME PROPERTY VALUE SOURCE
storage/adfs type filesystem -
storage/adfs creation Mon May 6 14:27 2019 -
storage/adfs used 128K -
storage/adfs available 5.24T -
storage/adfs referenced 128K -
storage/adfs compressratio 1.00x -
storage/adfs mounted no -
storage/adfs quota none default
storage/adfs reservation none default
storage/adfs recordsize 128K default
storage/adfs mountpoint /storage/adfs default
storage/adfs sharenfs off default
storage/adfs checksum on default
storage/adfs compression off default
storage/adfs atime on default
storage/adfs devices on default
storage/adfs exec on default
storage/adfs setuid on default
storage/adfs readonly off default
storage/adfs zoned off default
storage/adfs snapdir hidden default
storage/adfs aclinherit restricted default
storage/adfs createtxg 3453 -
storage/adfs canmount on default
storage/adfs xattr on default
storage/adfs copies 1 default
storage/adfs version 5 -
storage/adfs utf8only off -
storage/adfs normalization none -
storage/adfs casesensitivity sensitive -
storage/adfs vscan off default
storage/adfs nbmand off default
storage/adfs sharesmb off default
storage/adfs refquota none default
storage/adfs refreservation none default
storage/adfs guid 17063632217463997049 -
storage/adfs primarycache all default
storage/adfs secondarycache all default
storage/adfs usedbysnapshots 0B -
storage/adfs usedbydataset 128K -
storage/adfs usedbychildren 0B -
storage/adfs usedbyrefreservation 0B -
storage/adfs logbias latency default
storage/adfs dedup off default
storage/adfs mlslabel none default
storage/adfs sync standard default
storage/adfs dnodesize legacy default
storage/adfs refcompressratio 1.00x -
storage/adfs written 128K -
storage/adfs logicalused 40K -
storage/adfs logicalreferenced 40K -
storage/adfs volmode default default
storage/adfs filesystem_limit none default
storage/adfs snapshot_limit none default
storage/adfs filesystem_count none default
storage/adfs snapshot_count none default
storage/adfs snapdev hidden default
storage/adfs acltype off default
storage/adfs context none default
storage/adfs fscontext none default
storage/adfs defcontext none default
storage/adfs rootcontext none default
storage/adfs relatime off default
storage/adfs redundant_metadata all default
storage/adfs overlay off default
3.3 修改属性,关闭文件系统的访问时间修改
# zfs set atime=off storage/adfs# zfs get atime storage/adfs
NAME PROPERTY VALUE SOURCE
storage/adfs atime off local
四、清除ZFS的元数据
将zfs池中的物理硬盘从池中移除或用新盘替换后的, 旧盘上遗留zfs许多标头信息/元数据;旧盘重建新池时有出现报警。
- /dev/sdb1 is part of potentially active pool 'storage'
- /dev/sdb contains a corrupt primary EFI label.
- status: The pool was last accessed by another system.
- status: One or more devices contains corrupted data.
- action: The pool cannot be imported due to damaged devices or data.
尽管ZFS提供了一种方法(zpool labelclear)来删除此信息,但是仅当硬盘仍连接到服务器时,它才起作用。 如果缺少硬盘,则您无能为力。 例如,以下命令将失败:
# zpool labelclear -f ada3
由于zfs将标头信息存储在硬盘的第一个和最后一个扇区中,所以要做的就是清除第一个和最后一个扇区。
linux系统
dd if=/dev/zero of=/dev/sdXX bs=512 count=10
dd if=/dev/zero of=/dev/sdXX bs=512 seek=$(( $(blockdev --getsz /dev/sdXX) - 4096 )) count=1M
FreeBSD系统
dd if=/dev/zero of=/dev/da1 bs=512k count=1
查找最后一个扇区
diskinfo -c /dev/da1
/dev/da1
512 # sectorsize
1500301910016 # mediasize in bytes (1.4T)
2930277168 # mediasize in sectors
0 # stripesize
0 # stripeoffset
2907021 # Cylinders according to firmware.
16 # Heads according to firmware.
63 # Sectors according to firmware.
S1Y6J1KS710613 # Disk ident.
在示例中,扇区总数为2930277168(扇区中的介质大小)。
# dd if=/dev/zero of=/dev/da1 oseek=293027000
参考:
1. https://pthree.org/2012/04/17/install-zfs-on-debian-gnulinux/