引言
ZFS文件系统的英文名称为ZettabyteFileSystem,也叫动态文件系统(DynamicFileSystem),是第一个128位文件系统。最初是由Sun公司为Solaris10操作系统开发的文件系统。作为OpenSolaris开源计划的一部分,ZFS于2005年11月发布,被Sun称为是终极文件系统,经历了10年的活跃开发,而最新的开发将全面开放,并重新命名为OpenZFS。
ZFS优势
- ZFS是一种先进的、高度可扩展的文件系统,最初是由Sun Microsystems开发的,现在OpenZFS是项目的一部分。有这么多文件系统可用在Linux上,那自然要问ZFS有什么特别之处。不同于其它文件系统,它不仅是一个文件系统逻辑卷管理器。ZFS使其受欢迎的特性是:
- 数据完整性——数据一致性和完整性通过即写即拷和校验技术保证。
- 存储空间池——可用存储驱动器一起放入称为zpool的单个池。
- 软件RAID ——像发出一个命令一样,建立一个raidz数组。
- 内置的卷管理器——ZFS充当卷管理器。
- Snapshots、克隆、压缩——这些都是一些ZFS提供的高级功能。
安装ZFS
在这篇文章中,我们将学习在Debian 8.8上安装、设置和使用ZFS文件系统。
根据网站www.zfsonlinux.org的信息 ,ZFS仅支持AMD64和Intel 64位架构(amd64)。 让我们开始安装。
1、更新Debian系统
在Debian8中,zfs软件包已经加入debian backports源
首先我们需要在系统中启用backports源,并更新系统
echo "deb http://ftp.debian.org/debian jessie-backports main contrib" /etc/apt/sources.list.d/backports.list
aptitiude update
apititiude upgrade
2、安装zfs
安装kernel headers
aptitiude install linux-headers-$(uname -r)
安装 zfs-dkms
aptitiude install -t jessie-backports zfs-dkms
如果需要在在根分区使用zfs,你需要安装zfs-initramfs
aptitiude install -t jessie-backports zfs-initramfs
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、创建和配置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是强大的,可扩展的,易于管理。