如何在Linux上使用Debian Jessie 8.1安装和配置ZFS

ZFS是一个组合文件系统和逻辑卷管理器。 ZFS的功能包括防止数据损坏,支持高存储容量...

ZFS是一个组合的文件系统和逻辑卷管理器。 ZFS的特性包括防止数据损坏的保护,高存储容量的支持,高效的数据压缩,文件系统的集成和卷管理概念,快照和写时复制克隆,连续完整性检查和自动修复,RAID-Z和本机NFSv4 ACL。

ZFS最初是作为开放源代码软件实现的,根据共同开发和分发许可证(CDDL)许可。

当我们谈论ZFS文件系统时,我们可以强调以下关键概念:

  • 数据的完整性。
  • 简单的存储管理只有两个命令:zfs和zpool。
  • 一切都可以在文件系统在线时完成。

有关所有可用功能的完整概述和描述,请参阅此详细维基百科文章。

在本教程中,我将逐步引导您在Debian 8.1(Jessie)上安装ZFS文件系统。 我将向您展示如何使用raid0(条带),raid1(镜像)和RAID-Z(带有奇偶校验的Raid)创建和配置池,并说明如何使用ZFS配置文件系统。

根据网站www.zfsonlinux.org的信息 ,ZFS仅支持AMD64和Intel 64位架构(amd64)。 让我们开始安装。

先决条件:

  • Debian 8与64位内核。
  • root权限。

第1步 - 更新存储库并更新Debian Linux系统

要将zfsonlinux存储库添加到我们的系统中,请下载并安装zfsonlinux软件包,如下所示。 这将在您的计算机上添加/etc/apt/sources.list.d/zfsonlinux.list/etc/apt/trusted.gpg.d/zfsonlinux.gpg文件。 之后,您可以像使用apt-get命令的任何其他Debian软件包一样安装zfs。 使用zfsonlinux存储库的另一个好处是通过运行“apt-get update && apt-get upgrade”来自动获取更新。

使用SSH访问登录到Debian服务器,成为root用户,然后运行以下命令。

# uname -a
Linux debian-zfs 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1 (2015-05-24) x86_64 GNU/Linux
# wget http://archive.zfsonlinux.org/debian/pool/main/z/zfsonlinux/zfsonlinux_6_all.deb
# dpkg -i zfsonlinux_6_all.deb
# apt-get update

第2步 - 安装zfsonlinux

Zfsonlinux有许多软件依赖关系可以通过apt自动安装。 这个过程需要一段时间。 安装完成后,重启服务器。

# apt-get install lsb-release
# apt-get install debian-zfs
# shutdown -r now

第3步 - 创建和配置池

服务器重新启动后,检查zfsonlinux是否安装并运行良好。

# dpkg -l | grep zfs
ii  debian-zfs                     7~jessie                    amd64        Native ZFS filesystem metapackage for Debian.
ii  libzfs2                        0.6.5.2-2                   amd64        Native ZFS filesystem library for Linux
ii  zfs-dkms                       0.6.5.2-2                   all          Native ZFS filesystem kernel modules for Linux
ii  zfsonlinux                     6                           all          archive.zfsonlinux.org trust package
ii  zfsutils                       0.6.5.2-2                   amd64        command-line tools to manage ZFS filesystems

上面的结果显示,linux上的zfs已经安装好了,所以我们可以继续创建第一个池。

我已经为这台服务器添加了五个磁盘,每个磁盘的大小为2GB。 我们可以使用以下命令检查可用磁盘:

# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda5  /dev/sdb  /dev/sdc  /dev/sdd  /dev/sde  /dev/sdf  /dev/sdg

我们可以看到/ dev / sda直到/ dev / sdg/ dev / sda用于操作系统Debian Linux Jessie 8.1。 我们将使用/ dev / sdb直到/ dev / sdg为ZFS文件系统。

现在我们可以开始创建池,第一个我会告诉你如何创建一个raid0(条带)。

# zpool list
no pools available

# zpool create -f pool0 /dev/sdb
# zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
pool0  1.98G    64K  1.98G         -     0%     0%  1.00x  ONLINE  -

命令“zpool list”表示我们成功创建了一个raid0 zfs池,池名为pool0 ,大小为2GB。

接下来我们将创建一个raid1(镜像)与其他磁盘。

# zpool create -f pool1 mirror /dev/sdc /dev/sdd
# zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
pool0  1.98G    64K  1.98G         -     0%     0%  1.00x  ONLINE  -
pool1  1.98G    64K  1.98G         -     0%     0%  1.00x  ONLINE  -

我们可以看到我们现在有两个池, pool0为raid0, pool1为raid1。

要检查池的状态,我们可以使用以下命令:

# zpool status
  pool: pool0
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        pool0       ONLINE       0     0     0
          sdb       ONLINE       0     0     0

errors: No known data errors

  pool: pool1
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        pool1       ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            sdc     ONLINE       0     0     0
            sdd     ONLINE       0     0     0

errors: No known data errors

我们可以使用“zpool status”命令检查池状态。 我们可以看到pool0和pool1之间的区别,pool0只有一个磁盘,pool1有两个磁盘,磁盘状态为mirror(mirror-0)。

接下来,我们将使用RAID-Z创建一个池,RAID-Z是像RAID-5这样的数据/奇偶校验分配方案,但它使用动态条带宽度:每个块都具有自己的RAID条带,无论块大小如何,导致每个RAID-Z写入都是全条带写入。

RAID-Z需要至少三个硬盘驱动器,并且是RAID 0和RAID 1之间的妥协。在RAID-Z池中:如果池中的单个磁盘死机,则只需替换该磁盘,ZFS将自动重建数据基于来自其他磁盘的奇偶校验信息。 要松开存储池中的所有信息,两个磁盘将不得不死亡。 为了使驱动器设置更加冗余,您可以使用RAID 6(在ZFS情况下为RAID-Z2)获得双重奇偶校验。

我们先创建一个奇偶校验的RAID-Z池。

# zpool create -f poolz1 raidz sde sdf sdg
# zpool list poolz1
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
poolz1  5.94G   117K  5.94G         -     0%     0%  1.00x  ONLINE  -

# zpool status poolz1
  pool: poolz1
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        poolz1      ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            sde     ONLINE       0     0     0
            sdf     ONLINE       0     0     0
            sdg     ONLINE       0     0     0

errors: No known data errors

# df -h /poolz1
Filesystem      Size  Used Avail Use% Mounted on
poolz1          3.9G     0  3.9G   0% /poolz1

我们可以看到,df -h显示我们的6GB池已经减少到4GB,2GB被用于保存奇偶校验信息。 使用zpool status命令,我们看到我们的池现在正在使用RAID-Z。

接下来我们将创建RAID-Z2(raid 6),为此,我们必须删除现有的池,因为没有更多的磁盘可用。 删除池很容易,我们可以使用zpool destroy命令。

# zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
pool0   1.98G    64K  1.98G         -     0%     0%  1.00x  ONLINE  -
pool1   1.98G    64K  1.98G         -     0%     0%  1.00x  ONLINE  -
poolz1  5.94G   117K  5.94G         -     0%     0%  1.00x  ONLINE  -

# zpool destroy pool0
# zpool destroy pool1
# zpool destroy poolz1
# zpool list
no pools available

现在我们所有的zpool都没有了,所以我们可以创建一个RAID-Z2池。

# zpool create poolz2 raidz2 sdb sdc sdd sde
# zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
poolz2  7.94G   135K  7.94G         -     0%     0%  1.00x  ONLINE  -

# df -h /poolz2
Filesystem      Size  Used Avail Use% Mounted on
poolz2          3.9G     0  3.9G   0% /poolz2

# zpool status poolz2
  pool: poolz2
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        poolz2      ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            sdb     ONLINE       0     0     0
            sdc     ONLINE       0     0     0
            sdd     ONLINE       0     0     0
            sde     ONLINE       0     0     0

errors: No known data errors

我们可以看到,df -h显示,我们的8GB池已经减少到4GB,因为4GB被用于持有奇偶校验信息两次。 使用“zpool status”命令,我们看到我们的池现在使用RAID-Z2。

第4步 - 模拟磁盘故障

在此步骤中,我们将模拟灾难性磁盘故障(即zpool中的一个HDD停止运行)。

poolz2中创建一个文件,并确保我们可以访问它。

# echo "Test Only" > /poolz2/test.txt
# cat /poolz2/test.txt
Test Only

在我们模拟故障之前:检查poolz2的状态,确保状态为Online ,所有磁盘的状态为Online。

通过使用dd命令将随机数据写入/ dev / sdb来模拟故障。

# dd if=/dev/urandom of=/dev/sdb bs=1024 count=20480
# zpool scrub poolz2
# zpool status
  pool: poolz2
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
        using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://zfsonlinux.org/msg/ZFS-8000-9P
  scan: scrub repaired 17K in 0h0m with 0 errors on Tue Dec  8 22:37:49 2015
config:

        NAME        STATE     READ WRITE CKSUM
        poolz2      ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            sdb     ONLINE       0     0    25
            sdc     ONLINE       0     0     0
            sdd     ONLINE       0     0     0
            sde     ONLINE       0     0     0

errors: No known data errors

现在我们可以看到一个或多个磁盘出现了不可恢复的错误,所以我们必须更换磁盘。 在这种情况下,我们用/ dev / sdf替换/ dev / sdb磁盘。

# zpool replace poolz2 sdb sdf
# zpool status
  pool: poolz2
 state: ONLINE
  scan: resilvered 49.5K in 0h0m with 0 errors on Tue Dec  8 22:43:35 2015
config:

        NAME        STATE     READ WRITE CKSUM
        poolz2      ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            sdf     ONLINE       0     0     0
            sdc     ONLINE       0     0     0
            sdd     ONLINE       0     0     0
            sde     ONLINE       0     0     0

errors: No known data errors

/ dev / sdb替换/ dev / sdb之后,错误消失了,我们仍然可以访问我们之前创建的测试文件。

# cat /poolz2/test.txt
Test Only

直到这一步,我们才知道如何创建和配置一个zpool。

第5步 - 创建和配置ZFS文件系统

在下一步中,我们将学习如何创建和配置ZFS文件系统。

# zfs list
NAME     USED  AVAIL  REFER  MOUNTPOINT
poolz2   105K  3.83G  26.1K  /poolz2

我们已经有一个ZFS文件系统,当我们创建zpool时,这个文件系统会自动添加。 现在我们将创建另一个ZFS文件系统。

# zfs create poolz2/tank
# zfs list
NAME          USED  AVAIL  REFER  MOUNTPOINT
poolz2        132K  3.83G  26.1K  /poolz2
poolz2/tank  25.4K  3.83G  25.4K  /poolz2/tank

# df -h | grep poolz2
poolz2          3.9G  128K  3.9G   1% /poolz2
poolz2/tank     3.9G  128K  3.9G   1% /poolz2/tank

很容易吗 我们创建一个名为tank的新的ZFS文件系统,并自动将其安装为/ poolz2 / tank

如何为ZFS文件系统创建自定义安装点? 使用以下命令:

# zfs create poolz2/data -o mountpoint=/data
# df -h | grep poolz2
poolz2          3.9G     0  3.9G   0% /poolz2
poolz2/tank     3.9G     0  3.9G   0% /poolz2/tank
poolz2/data     3.9G     0  3.9G   0% /data

如何修改现有的mountpoint? 我们可以通过以下命令来做到这一点:

# zfs set mountpoint=/tank poolz2/tank
# df -h | grep poolz2
poolz2          3.9G     0  3.9G   0% /poolz2
poolz2/data     3.9G     0  3.9G   0% /data
poolz2/tank     3.9G     0  3.9G   0% /tank

要安装和卸载文件系统,请使用以下命令:

# zfs unmount /data
# df -h | grep poolz2
poolz2          3.9G     0  3.9G   0% /poolz2
poolz2/tank     3.9G     0  3.9G   0% /tank

# zfs mount poolz2/data
# df -h | grep poolz2
poolz2          3.9G     0  3.9G   0% /poolz2
poolz2/tank     3.9G     0  3.9G   0% /tank
poolz2/data     3.9G     0  3.9G   0% /data

删除zfs文件系统非常容易,我们可以使用命令zfs destroy来进行。

# zfs destroy poolz2/data
# zfs list
NAME          USED  AVAIL  REFER  MOUNTPOINT
poolz2        152K  3.83G  26.1K  /poolz2
poolz2/tank  25.4K  3.83G  25.4K  /tank

文件系统/数据已经没了。

结论

ZFS文件系统是一个革命性的新文件系统,从根本上改变了在类Unix操作系统上管理文件系统的方式。 ZFS提供了在今天可用的任何其他文件系统中找不到的功能和优点。 ZFS是强大的,可扩展的,易于管理。