在CentOS 7上安装和使用ZFS的教程

时间:2020-03-05 15:26:57  来源:igfitidea点击:

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