smartos教程三:smartos虚拟化技术

SmarOS 是基于 Illumos 核心,之后大牛们还将KVM移植了进去。严格来说,SmartOS 并非Solaris,但也保留了一些Solaris的特性。Illumos 提供了一个通用内核和一些基础的系统工具。基于 illumos 的发行版软件都有一些很赞的体验.

前言

严格来说,SmartOS 并非Solaris,但也保留了一些Solaris的特性。所以说 SmartOS 和 Linux 是有一定区别的,这个学习需要一点时间,但是值得你去付出,因为 SmartOS 中很多杀手级特性都是 Linux 不具备的。

SmarOS 是基于 Illumos 核心(注:第一个字母是i,后面两个才是l),之后大牛们还将KVM移植了进去。而 Illumos 基于 OpenSolaris 项目的(已不复存在)。实际上,Oracle 收购 Sun 后,对 OpenSolaris 态度很冷淡,毫无兴趣,并关闭源码。大多数Sun最优秀的工程师转投入 Illumos 旗下。现在他们大多数都在 Joyent 和 Nexenta。具体的故事我就不详述了,有兴趣的可以看看这两篇文章:

Illumos

illumos

Illumos 提供了一个通用内核和一些基础的系统工具。基于 illumos 的发行版软件都有一些很赞的体验,这里提几个让人印象深刻,最具创新的distributions(参考链接):

  • OpenIndiana 那些有 Solaris 或 OpenSolarisis 背景的人可能比较熟悉这个东东。OpenIndiana 项目的目标是继续开发和发行 OpenSolaris。该项目隶属于 Illumos 基金会。由于 Oracle 宣布不再发行 OpenSolaris ,该项目被建立以为 OpenSolaris 继续其更新。
  • Nexenta CP 即Nexenta Community Platform,现在成为 Illumos 旗下的一款产品,改名叫 illumian 了,何去何从可以参考此链接。现在只能看到 NexentaStor 了,它是Nexenta 公司推出的基于 OpenSolaris OS 和 ZFS 等技术的一个 NAS 软件解决方案。如果你熟悉 Linux,尤其是 Debian 或 Ubuntu,那就会很快上手。ZFS文件系统(Zettabyte File System)是 NexentaStor 的亮点,它是一种基于 Solaris 的128位的文件系统,强健可靠、可伸缩、易于管理,突出了对数据完整性的保护。我之后还会专门写文章介绍 ZFS,不过网上也已经有很多类似的文章了。
  • SmartOS 是由 Joyent 提供的 community distro,可以认为是 SmartDataCenter 商业化产品的一部分。这次就要专门谈谈它及其独特的虚拟化技术。

其实illumos还出了一些很好的书,这些书现在网上都有电子版,链接是:http://illumos.org/books/ 。

SmartOS云平台

Joyent SmartOS与SmartMachine、SmartDataCenter以及物理机紧密集成,在各个层面保证云平台的安全性。与其他的云平台不同,SmartOS云平台的虚拟资源驻留在SmartOS中,而不是在虚拟机本身。这种包容性的虚拟化架构避免了Web应用层和操作系统之间接口的潜在漏洞。在网络层,Joyent的SmartDataCenter支持动态的虚拟局域网(vLAN),使客户在任何时候都可以有效隔离云平台上的不同用户。Joyent的安全保障架构图如下所示:

smartos安全保证

SmartOS简单可以解释为:“illumos-derived OS that is the foundation of both Joyentʼs public cloud and SmartDataCenter product”。 既然作为是illumos的衍生产品,那么它具备以下几个关键特性:

  • ZFS —— 企业级的写时复制(copy-on-write)文件系统,可提供诸如constant time snapshots,writable clones,built-in compression,checksumming,volume management 等众多功能。
  • DTrace: 用来在生产和试验性生产系统上找出系统瓶颈的工具,可以以对核心(kernel)和应用程序(user application)进行动态跟踪并且对系统运行不构成任何危险。支持原位(in situ)的数据聚合,用户级评估测量等。
  • 基于操作系统的虚拟化(Zones):完整的安全的虚拟操作系统实例,提供给多租户硬件级的性能。网络虚拟化(Crossbow):虚拟NIC架构,方便对网络带宽管理和资源控制。这里有论文链接。
  • KVM:Joyent技术专家已经将KVM移植到SmartOS中,支持硬件虚拟化,并加强了以上四项特性,具体可以参见此链接

 

smartos教程一:smartos入门

SmartOS是一个开源的Unix系列操作系统,从Solaris10分支出来,由Joyent公司开发。SmartOS拥有非常强大而简便的虚拟化功能,非常适合用来做云计算。

概述

Smartos是一个开源的Unix系列操作系统,从Solaris10分支出来,由Joyent公司开发。Smartos拥有非常强大而简便的虚拟化功能,非常适合用来做云计算。

Smartos详细资料请参考:https://wiki.smartos.org/display/DOC/Home

SmartOS入门

为了方便理解接下来的安装配置过程,先介绍一些Smartos相关的入门知识。

SmartOS是驻内存的操作系统,它本身不在磁盘上保存任何操作系统运行相关的文件,只将配置、虚拟机等信息持久化到磁盘上。所以每次启动时,整个系统都会被全部加载到内存中运行。而根据加载源的不同,就有两种加载方式:

  1. USB启动。将操作系统写入到U盘中,并让服务器从本地U盘启动。
  2. PXE启动。将操作系统放到某个服务器中并提供PXE启动服务,其他的服务器就可以通过网络启动了。

因此,操作系统更新时,也从来不用打任何补丁,直接从最新版的系统重新启动即可。

zfs文件系统

SmartOS使用zfs作为本地的文件系统,而zfs本身并不是SmartOS独有的,其他Linux发行版也可以使用。zfs和其他的文件系统相比有诸多好处,这里就不一一陈述了,但是简单的介绍下zfs的结构。

存储池

zfs首先从物理磁盘开始构建存储池,叫做zpool,服务器的存储空间可以由一个或者多个zpool组成,每个zpool都是独立的存储空间。

zpool

disk:操作系统可以直接检测到物理磁盘,也可以检测到硬件raid虚拟化出来的磁盘,但是为了充分利用zfs的性能,应该将硬件raid设置成直连(HBA)模式,直接暴露所有物理磁盘。

array:将物理磁盘进行任意组合,可以生成一个或多个软件阵列,可以是mirrorraid等模式。一旦阵列生成,组成阵列的磁盘数量将不允许变更,只能对成员磁盘进行脱离、更换等工作。

zpool:将阵列进行任意的组合,可以生成一个或者多个zpoolzpool可以添加或者删除子阵列,zpool的存储空间就是所有阵列存储空间的叠加。

文件系统

有了zpool存储空间后,就可以构建文件系统了。

zpool

zfs文件系统以zpool为根,以树形结构进行层级划分和管理,但是文件系统的属性(比如预留空间、权限、配额)可以有继承和依赖关系。zfs文件系统和虚拟机里面的文件系统很像似,但是不一样,zfs文件系统的节点是一个设备,需要挂载到虚拟机文件系统的一个目录树节点上,而虚拟机文件系统中的节点就是目录或者文件。最简洁的判别方法就是zfs文件系统不以/开头。

SmartOS网络层次

Smartos作为虚拟化操作系统,必然要实现网络硬件的虚拟化,虚拟化的技术叫做Crossbow,这里只简单的介绍一下。smartos网络层次

physical nic:一台物理机上可以插多张物理网卡,每个网卡上可以有多个物理网口,每个物理网口都有一个全宇宙唯一的mac地址。

aggregation:聚合网口由多个物理网口聚合而成,一个物理网口只能加入一个聚合网口或者不聚合,聚合网口通过一个名称来进行标识,物理网口直接用mac进行标识。

virtual switch:虚拟交换机的名称在Smartos里叫做nic tag,每个虚拟交换机能且只能配置一个聚合网口或者物理网口,一个聚合网口或者物理网口可以属于任意多个虚拟交换机。

global zonevm:global zone就是物理机的根操作系统,但是应该理解成一个特殊的虚拟机。虚拟机通过给每个虚拟网卡指定nic tag来接入虚拟交换机,每台虚拟机都必须指定一个主要网卡作为默认路由。

硬件需求

Smartos对硬件有些需求,并不适用任意硬件,不过也没有太多苛刻的地方,这里简单概括下:

1.64-bit x86架构,推荐Intel的CPU,开启VT-x功能支持kvm虚拟化。

2.能够USB启动以及能够PXE启动,第一台机器只可能USB启动,之后的机器可以PXE启动。

3.只支持本地存储,尽量避免使用硬件RAID,将RAID控制器设置成HBA直连模式。因为要使用zfs文件系统。

4.推荐Intel的网卡,至少两块网卡。

在Debian 8.8安装使用zfs文件系统

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

引言

ZFS文件系统的英文名称为ZettabyteFileSystem,也叫动态文件系统(DynamicFileSystem),是第一个128位文件系统。最初是由Sun公司为Solaris10操作系统开发的文件系统。作为OpenSolaris开源计划的一部分,ZFS于2005年11月发布,被Sun称为是终极文件系统,经历了10年的活跃开发,而最新的开发将全面开放,并重新命名为OpenZFS。

ZFS优势

  1. ZFS是一种先进的、高度可扩展的文件系统,最初是由Sun Microsystems开发的,现在OpenZFS是项目的一部分。有这么多文件系统可用在Linux上,那自然要问ZFS有什么特别之处。不同于其它文件系统,它不仅是一个文件系统逻辑卷管理器。ZFS使其受欢迎的特性是:
  2.  数据完整性——数据一致性和完整性通过即写即拷和校验技术保证。
  3. 存储空间池——可用存储驱动器一起放入称为zpool的单个池。
  4. 软件RAID ——像发出一个命令一样,建立一个raidz数组。
  5. 内置的卷管理器——ZFS充当卷管理器。
  6. 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是强大的,可扩展的,易于管理。

FreeBSD定期创建快照

1、安装sysutils/freebsd-snapshot


portmaster sysutils/freebsd-snapshot

2、配置cron


sudo crontab -e

添加


# /etc/crontab
0 * * * * root /usr/local/sbin/periodic-snapshot hourly
0 0 * * * root /usr/local/sbin/periodic-snapshot daily
0 0 * * 0 root /usr/local/sbin/periodic-snapshot weekly

编辑/etc/periodic.conf

sudo vim /etc/periodic.conf

添加

snapshot_enable="YES"
snapshot_schedule="/home:2:10:0"

上述snapshot_schedule变量值必须符合以下语法:

<schedule>
::= <entry>*
<entry>
::= <fs> (", <fs>)* : <spec>
<fs>
::= /^.*$/
<spec>
::= <gen_weekly> : <gen_daily> : <gen_hourly> <gen_weekly> 
::= <generation>
<gen_daily>
::= <generation> <gen_hourly> 
::= <generation> ("@ <hour> (", <hour>)*)? <generation> 
::= /^[0-9]+$/
<hour>
::= /^(0?[0-9]|1[0-9]|2[0-3])$/

ZFS文件系统介绍 – 快照和克隆

快照是文件系统或卷的只读副本,而克隆是可读写的卷或文件系统,克隆只能从快照创建。

ZFS快照

创建快照几乎没有任何成本,可以即时创建完成,而且快照创建的最初几乎不占用额外的存储池空间,ZFS采用COW策略,快照会与原始文件系统共享快照创建后一直没有变化的存储块。无法直接访问卷的快照,但是可以对它们执行克隆、备份、回滚等操作

创建ZFS快照

使用zfs snapshot filesystem@snapname,快照名称由两部分组成,@前面为文件系统名称,@后面为快照标识,二者组成完成的快照名

# zfs snapshot reservoir/data@thursday

查看ZFS快照


# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
reservoir/data@thursday 0 – 30K –

使用-r选项为所有后代文件系统递归创建快照

# zfs snapshot reservoir/data@thursday

销毁ZFS快照

使用zfs destroy filesystem@snapname销毁ZFS快照

# zfs destroy reservoir/data@thursday

如果数据集(dataset)存在快照,则不能销毁该数据集。也可指定-r选项一起销毁快照和数据集。

重命名ZFS快照

可以重命名快照,但是不能跨越池和数据集对它们进行重命名。

# zfs rename reservoir/data@thursday reservoir/data@thursday1

可以使用更快捷的方式重命名快照

# zfs rename reservoir/data@thursday thursday1

回滚ZFS快照

可以使用 zfs rollback 命令放弃自特定快照创建以来对文件系统所做的全部更改。文件系统恢复到创建快照时的状态。缺省情况下,该命令无法回滚到除最新快照以外的快照。
要回滚到早期快照,必须销毁所有的中间快照。可以通过指定 -r 选项销毁早期的快照。如果存在任何中间快照的克隆,则还必须指定 -R 选项以销毁克隆。

# zfs rollback reservoir/data@thursday

则自此快照之后文件系统的任何改变都会被丢弃。

ZFS快照差异比较

可以使用 zfs diff 命令来比较两个ZFS快照之间的差异。

比如下面的例子


# cd /reservoir/data/

# touch file1

# zfs snapshot reservoir/data@snap1

# touch file2

# zfs diff reservoir/data@snap1 reservoir/data@snap2

M /reservoir/data/

+ /reservoir/data/file2

M表示目录被修改过了,+表示文件/reservoir/data/file2存在与更新的快照中zfs diff 命令输出符号的含义见下表


文件或目录更改 标识符

————————————————– ——

文件或目录已被修改,或文件或目录链接已更改 M

文件或目录出现在较旧的快照中,但未出现在较新的快照中 –

文件或目录出现在较新的快照中,但未出现在较旧的快照中 +

文件或目录已重命名 R

ZFS克隆

克隆是可写入的卷或文件系统,其初始内容与从中创建它的数据集的内容相同。与快照一样,创建克隆几乎是即时的,而且最初不占用其他磁盘空间。此外,还可以创建克隆的快照。克隆只能从快照创建。克隆快照时,会在克隆和快照之间建立隐式相关性。即使克隆是在文件系统分层结构中的其他位置创建的,但只要克隆存在,就无法销毁原始快照。

创建ZFS克隆

使用 zfs clone 命令创建克隆,指定从中创建克隆的快照以及新文件系统或卷的名称。新文件系统或卷可以位于ZFS文件系统分层结构中的任意位置。新数据集与从其中创建克隆的快照属同一类型(例如文件系统或卷)。不能在原始文件系统快照所在池以外的池中创建该文件系统的克隆,亦即克隆是不能跨越存储池的。

# zfs clone reservoir/data@snap2 reservoir/clone_snap2

销毁ZFS克隆

# zfs destroy reservoir/clone_snap2

必须先销毁克隆,才能销毁父快照。

发送和接收ZFS快照流

通过使用zfs send命令,可以将 ZFS 文件系统或卷的快照转换为快照流。然后可以通过zfs receive命令使用快照流重新创建 ZFS 文件系统或卷。

可以生成两种快照流:

完整流 – 包含从创建数据集时开始到指定的快照为止的所有数据集内容。zfs send 命令生成的缺省流是完整流。它包含一个文件系统或卷,直到并包括指定的快照。流不会包含在命令行上指定的快照之外的快照。

增量流 – 包含一个快照与另一个快照之间的差异。

使用 zfs send 命令来发送快照流,并在同一系统的另一个池中或用于存储备份数据的不同系统上的另一个池中接收快照流。

例如

# zfs send reservoir/data@snap1 | zfs receive reservoir/data_received

这样通过send和receive发送和接收快照流生成一个新的ZFS文件系统reservoir/data_snap_stream

使用 zfs send -i 选项可以发送增量数据。

例如:

# zfs send -i reservoir/data@snap1 reservoir/data@snap2 | zfs receive reservoir/data_received

这里snap1是较早的快照,snap2是较晚的快照,而且reservoir/data_received必须已经存在而且已经接收了snap1快照流,增量接收才能成功。

可以通过SSH将快照流发送到远程系统

# zfs send reservoir/data@snap1 | ssh remote_system zfs receive reservoir/data_received

还可以将快照流压缩归档保存

# zfs send reservoir/data@snap1 | gzip > data.gz

然后可以接收压缩归档的快照流

# zfs gunzip -c data.gz | zfs receive reservoir/data_recv

可以将发送接收ZFS快照流以及其增量机制作为备份ZFS文件系统的一种策略,但这种备份方式不能逐个恢复文件,必须恢复整个文件系统。