在CentOS 7上安装和使用ZFS的教程
zfs,zettabyte文件系统的短形式是高级和高度可扩展的文件系统。
它最初由Sun Microsystems开发,现在是OpenZFS项目的一部分。
使用Linux上可用的许多文件系统,询问ZFS的特殊是非常自然的。
与其他文件系统不同,它不仅仅是一个文件系统,而是一个逻辑卷管理器。
ZFS的一些功能使其流行为:
- 数据完整性 - 通过编写编写和校验和技术确保数据一致性和完整性
- 存储空间汇集 - 可用的存储驱动器可以组合成一个名为ZPool的池
- 软件RAID - 设置RAIDZ阵列与发出单个命令一样简单。
- 内置卷管理器 - ZFS也充当卷管理器。
- 透视波,克隆,压缩 - 这些是ZFS提供的一些高级功能。
ZFS是一个128位文件系统,具有存储256 zetta字节的容量!在本教程中,我们将学习如何安装,设置,并在CentOS 7服务器上使用一些重要的ZFS命令。
注意:安装部件特定于CentOS服务器,而在任何Linux系统上都很常见
术语
在我们继续前进之前,让我们了解ZFS中常用的一些术语。
池
存储驱动器的逻辑分组。
它是ZFS的基本构建块,它来自其中存储空间为数据集分配。
数据集
ZFS文件系统的组件即文件系统,克隆,快照和卷被称为数据集。
镜像
虚拟设备存储两个或者更多个磁盘上的相同数据副本。
在一个磁盘发生故障的情况下,在该镜像的其他磁盘上可用的数据。
重新同步(Resilvering)
在还原设备的情况下将数据从一个磁盘复制到另一个磁盘的过程。
擦洗(Scrub)
Scrub用于zfs中的一致性检查,如fsck如何在其他文件系统中使用
安装ZFS.
要在CentOS上安装ZFS,我们需要首先设置涡旋存储库以支持包,然后是ZFS存储库安装所需的ZFS包。
注意:如果不是root用户,请向所有命令前缀sudo。
yum localinstall --nogpgcheck http://epel.mirror.net.in/epel/7/x86_64/e/epel-release-7-5.noarch.rpm yum localinstall --nogpgcheck http://archive.zfsonlinux.org/epel/zfs-release.el7.noarch.rpm
现在安装内核开发和ZFS包。
当ZFS构建为模块并插入内核时,需要内核开发包。
yum install kernel-devel zfs
使用"lsmod"命令验证ZFS模块是否插入内核中,使用"modprobe"命令手动插入它。
[root@li1467-130 ~]# lsmod |grep zfs [root@li1467-130 ~]# modprobe zfs [root@li1467-130 ~]# lsmod |grep zfs zfs 2790271 0 zunicode 331170 1 zfs zavl 15236 1 zfs zcommon 55411 1 zfs znvpair 89086 2 zfs,zcommon spl 92029 3 zfs,zcommon,znvpair
让我们检查我们是否能够使用ZFS命令:
[root@li1467-130 ~]# zfs list no datasets available
管理
ZFS有两个主要的实用程序,ZPool和ZFS。
ZPool使用磁盘ZFS实用程序涉及池的创建和维护,而ZFS实用程序负责创建和维护数据集。
ZPool实用程序
创建和销毁池
首先验证可用于创建存储池的磁盘。
[root@li1467-130 ~]# ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 Mar 16 08:12 /dev/sda brw-rw---- 1 root disk 8, 16 Mar 16 08:12 /dev/sdb brw-rw---- 1 root disk 8, 32 Mar 16 08:12 /dev/sdc brw-rw---- 1 root disk 8, 48 Mar 16 08:12 /dev/sdd brw-rw---- 1 root disk 8, 64 Mar 16 08:12 /dev/sde brw-rw---- 1 root disk 8, 80 Mar 16 08:12 /dev/sdf
从一组驱动器创建池。
zpool create <option> <pool name. <drive 1> <drive 2> .... <drive n>
[root@li1467-130 ~]# zpool create -f zfspool sdc sdd sde sdf
'zpool status'命令显示可用池的状态
[root@li1467-130 ~]# zpool status pool: zfspool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM zfspool ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 sdf ONLINE 0 0 0 errors: No known data errors
验证池创建是否成功。
[root@li1467-130 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda 19G 1.4G 17G 8% / devtmpfs 488M 0 488M 0% /dev tmpfs 497M 0 497M 0% /dev/shm tmpfs 497M 50M 447M 11% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup tmpfs 100M 0 100M 0% /run/user/0 zfspool 3.7G 0 3.7G 0% /zfspool
正如我们所看到的,ZPOOL按名称为3.7 GB的名称创建了一个游泳池,并且还将其安装在/zfspool中。
要销毁池,请使用"zpool destroy"命令
zpool destroy <pool name> [root@li1467-130 ~]# zpool destroy zfspool [root@li1467-130 ~]# zpool status no pools available
让我们现在尝试创建一个简单的镜像池。
zpool create <option> <pool name> mirror <drive 1> <drive 2>... <drive n>
我们还可以通过重复镜像关键字后跟驱动器同时创建多个镜像。
[root@li1467-130 ~]# zpool create -f mpool mirror sdc sdd mirror sde sdf [root@li1467-130 ~]# zpool status pool: mpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM mpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 sde ONLINE 0 0 0 sdf ONLINE 0 0 0 errors: No known data errors
在上面的示例中,我们已经创建了具有两个磁盘的镜像池。
同样,我们可以创建一个RAIDZ池。
[root@li1467-130 ~]# zpool create -f rpool raidz sdc sdd sde sdf [root@li1467-130 ~]# zpool status pool: rpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 sdf ONLINE 0 0 0 errors: No known data errors
在ZFS池中管理设备
创建池后,可以从池中添加或者删除热备件和缓存设备,从镜像池添加或者分离设备并替换设备。
但无法从池中删除非冗余和RAIDZ设备。
我们将在本节中看到如何执行以下一些操作。
我首先创建一个名为'testpool'的池,由两个设备,SDC和SDD组成。
然后将添加另一个设备SDE。
[root@li1467-130 ~]# zpool create -f testpool sdc sdd [root@li1467-130 ~]# zpool add testpool sde [root@li1467-130 ~]# zpool status pool: testpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM testpool ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors
如前所述,我无法删除此新添加的设备,因为它不是冗余或者raidz池。
[root@li1467-130 ~]# zpool remove testpool sde cannot remove sde: only inactive hot spares, cache, top-level, or log devices can be removed
但我可以将备用磁盘添加到此池中并删除它。
[root@li1467-130 ~]# zpool add testpool spare sdf [root@li1467-130 ~]# zpool status pool: testpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM testpool ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 spares sdf AVAIL errors: No known data errors [root@li1467-130 ~]# zpool remove testpool sdf [root@li1467-130 ~]# zpool status pool: testpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM testpool ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors
同样,我们可以使用Attach命令将磁盘添加到镜像或者非镜像池,并分离命令以从镜像池分离磁盘。
zpool attach <options> <pool name> <device> <new device> zpool detach <pool name> <device>
当设备发生故障或者已损坏时,我们可以使用"替换"命令替换它。
zpool replace <options> <pool name> <device> <new device>
我们将通过强制损坏镜像配置来测试这一点。
[root@li1467-130 ~]# zpool create -f testpool mirror sdd sde
这将创建由磁盘SDD和SDE组成的镜像池。
现在,让我们故意通过将零写入其中损坏SDD驱动器。
[root@li1467-130 ~]# dd if=/dev/zero of=/dev/sdd dd: writing to ‘/dev/sdd’: No space left on device 2048001+0 records in 2048000+0 records out 1048576000 bytes (1.0 GB) copied, 22.4804 s, 46.6 MB/s
我们将使用"scrub"命令来检测此损坏。
[root@li1467-130 ~]# zpool scrub testpool [root@li1467-130 ~]# zpool status pool: testpool state: ONLINE status: One or more devices could not be used because the label is missing or invalid. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Replace the device using 'zpool replace'. see: http://zfsonlinux.org/msg/ZFS-8000-4J scan: scrub repaired 0 in 0h0m with 0 errors on Fri Mar 18 09:59:40 2015 config: NAME STATE READ WRITE CKSUM testpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdd UNAVAIL 0 0 0 corrupted data sde ONLINE 0 0 0 errors: No known data errors
我们现在将用SDC替换SDD。
[root@li1467-130 ~]# zpool replace testpool sdd sdc; zpool status pool: testpool state: ONLINE scan: resilvered 83.5K in 0h0m with 0 errors on Fri Mar 18 10:05:17 2015 config: NAME STATE READ WRITE CKSUM testpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 replacing-0 UNAVAIL 0 0 0 sdd UNAVAIL 0 0 0 corrupted data sdc ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors [root@li1467-130 ~]# zpool status pool: testpool state: ONLINE scan: resilvered 74.5K in 0h0m with 0 errors on Fri Mar 18 10:00:36 2015 config: NAME STATE READ WRITE CKSUM testpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdc ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors
池迁移
我们可以使用导出和导入命令在不同主机之间迁移存储池。
为此,池中使用的磁盘应从两个系统中获得。
[root@li1467-130 ~]# zpool export testpool [root@li1467-130 ~]# zpool status no pools available
命令'zpool import'列出了可用于导入的所有池。
从要导入池的系统执行此命令。
[root@li1467-131 ~]# zpool import pool: testpool id: 3823664125009563520 state: ONLINE action: The pool can be imported using its name or numeric identifier. config: testpool ONLINE sdc ONLINE sdd ONLINE sde ONLINE
现在导入所需的池
[root@li1467-131 ~]# zpool import testpool [root@li1467-131 ~]# zpool status pool: testpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM testpool ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors
Iostat.
可以使用iostat命令验证池设备的IO统计信息。
[root@li1467-130 ~]# zpool iostat -v testpool capacity operations bandwidth pool alloc free read write read write ---------- ----- ----- ----- ----- ----- ---- testpool 1.80M 2.86G 22 27 470K 417K sdc 598K 975M 8 9 200K 139K sdd 636K 975M 7 9 135K 139K sde 610K 975M 6 9 135K 139K ---------- ----- ----- ----- ----- ----- ----
ZFS实用程序
我们现在将继续前进到ZFS实用程序。
其中我们将看看如何创建,销毁数据集,文件系统压缩,配额和快照。
创建和销毁zfs文件系统
可以使用zfs创建命令创建zfs文件系统
zfs create <filesystem>
[root@li1467-130 ~]# zfs create testpool/students [root@li1467-130 ~]# zfs create testpool/professors [root@li1467-130 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda 19G 1.4G 17G 8% / devtmpfs 488M 0 488M 0% /dev tmpfs 497M 0 497M 0% /dev/shm tmpfs 497M 50M 447M 11% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup testpool 2.8G 0 2.8G 0% /testpool tmpfs 100M 0 100M 0% /run/user/0 testpool/students 2.8G 0 2.8G 0% /testpool/students testpool/professors 2.8G 0 2.8G 0% /testpool/professors
从上面的输出,观察到,虽然在文件系统创建时没有给出的安装点,但使用与池的路径关系相同的路径关系创建挂载点。
ZFS创建允许使用-o使用它可以使用它指定挂载点,压缩,配额,exec等选项。
可以使用zfs列表列出可用文件系统:
[root@li1467-130 ~]# zfs list NAME USED AVAIL REFER MOUNTPOINT testpool 100M 2.67G 19K /testpool testpool/professors 31K 1024M 20.5K /testpool/professors testpool/students 1.57M 98.4M 1.57M /testpool/students
我们可以使用Destroy选项销毁文件系统
zfs destroy <filesystem>
zfs压缩
我们现在将了解压缩在ZFS中的工作原理。
在我们开始使用压缩之前,我们需要使用"设置压缩"启用它
zfs set <compression=value> <filesystem|volume|snapshot>
一旦完成这一点,透明地瞬间就会在文件系统上发生压缩和解压缩。
在我们的示例中,我将使用LZ4压缩算法对学生目录进行压缩。
[root@li1467-130 ~]# zfs set compression=lz4 testpool/students
我现在将将大小15米的文件复制到此文件系统中,并在复制后检查大小。
[root@li1467-130 /]# cd /var/log [root@li1467-130 log]# du -h secure 15M secure [root@li1467-130 ~]# cp /var/log/secure /testpool/students/ [root@li1467-130 students]# df -h . Filesystem Size Used Avail Use% Mounted on testpool/students 100M 1.7M 99M 2% /testpool/students
请注意,文件系统中使用的大小仅为1.7米,而文件大小为15米。
我们也可以检查压缩比..
[root@li1467-130 ~]# zfs get compressratio testpool NAME PROPERTY VALUE SOURCE testpool compressratio 9.03x
zfs配额和预留
让我解释一个真实例子的配额。
假设我们有一个大学要求限制文件系统用于教授和学生的磁盘空间。
让我们假设我们需要为学生和1GB为教授分配100MB。
我们可以利用ZFS中的"配额"来满足这一要求。
配额确保文件系统使用的磁盘空间量不超过限制集。
预约有助于实际分配和保证所需的磁盘空间数量可用于文件系统。
zfs set quota=<value> <filesystem|volume|snapshot> zfs set reservation=<value> <filesystem|volume|snapshot>
[root@li1467-130 ~]# zfs set quota=100M testpool/students [root@li1467-130 ~]# zfs set reservation=100M testpool/students [root@li1467-130 ~]# zfs list NAME USED AVAIL REFER MOUNTPOINT testpool 100M 2.67G 19K /testpool testpool/professors 19K 2.67G 19K /testpool/professors testpool/students 1.57M 98.4M 1.57M /testpool/students [root@li1467-130 ~]# zfs set quota=1G testpool/professors [root@li1467-130 ~]# zfs list NAME USED AVAIL REFER MOUNTPOINT testpool 100M 2.67G 19K /testpool testpool/professors 19K 1024M 19K /testpool/professors testpool/students 1.57M 98.4M 1.57M /testpool/students
在上面的例子中,我们为学生和1GB分配了100MB的教授。
观察"ZFS列表"中的"可用"列。
最初,它们每次都有2.67GB的大小,在设置配额后,值相应地更改。
zfs快照
快照是在给定时间点的ZFS文件系统的只读副本。
它们不会在ZFS池中消耗任何另外的空间。
我们可以在稍后阶段滚动到相同的状态,或者根据用户要求提取单个或者一组文件。
我现在将在前面的示例中创建一些目录和文件下的"/towtpool/productions"下文件,然后拍摄此文件系统的快照。
[root@li1467-130 ~]# cd /testpool/professors/ [root@li1467-130 professors]# mkdir maths physics chemistry [root@li1467-130 professors]# cat > qpaper.txt Question paper for the year 2015-17 [root@li1467-130 professors]# ls -la total 4 drwxr-xr-x 5 root root 6 Mar 19 10:34 . drwxr-xr-x 4 root root 4 Mar 19 09:59 .. drwxr-xr-x 2 root root 2 Mar 19 10:33 chemistry drwxr-xr-x 2 root root 2 Mar 19 10:32 maths drwxr-xr-x 2 root root 2 Mar 19 10:32 physics -rw-r--r-- 1 root root 36 Mar 19 10:35 qpaper.txt
要拍摄快照,请使用以下语法:
zfs snapshot <filesystem|volume<@snap>>
[root@li1467-130 professors]# zfs snapshot testpool/professors@03-2015 [root@li1467-130 professors]# zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT testpool/professors@03-2015 0 - 20.5K
我现在我现在将删除创建并从快照中提取它的文件
[root@li1467-130 professors]# rm -rf qpaper.txt [root@li1467-130 professors]# ls chemistry maths physics [root@li1467-130 professors]# cd .zfs [root@li1467-130 .zfs]# cd snapshot/03-2015/ [root@li1467-130 03-2015]# ls chemistry maths physics qpaper.txt [root@li1467-130 03-2015]# cp -a qpaper.txt /testpool/professors/ [root@li1467-130 03-2015]# cd /testpool/professors/ [root@li1467-130 professors]# ls chemistry maths physics qpaper.txt
已删除的文件返回其位置。
我们可以使用ZFS列表列出所有可用的快照:
[root@li1467-130 ~]# zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT testpool/professors@03-2015 10.5K - 20.5K
最后,让我们使用zfs destroy命令销毁快照:
zfs destroy <filesystem|volume<@snap>>
[root@li1467-130 ~]# zfs destroy testpool/professors@03-2015 [root@li1467-130 ~]# zfs list -t snapshot no datasets available