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是强大的,可扩展的,易于管理。