本指南旨在向新用户展示 ZFS 在 Solaris Containers 中的功能。文章将描述如何分配 ZFS 文件系统给 zone,以及此配置所支持的 ZFS 管理任务。通过将文件系统分配给 zone,可实现 zone 管理器对 ZFS 文件系统的完全委托控制,允许他们捕获快照、创建子文件系统以及在没有全局 zone 管理器参与的情况下执行其他任务。
通过阅读本指南,用户将理解如何委托 ZFS 文件系统给容器以及如何在容器内部管理它们。
Solaris ZFS 和 Container:概述
ZFS 是 SUN 在 Solaris 10 OS 中提供的一种全新的文件系统。它能够提供高水平的数据完整性和性能,通过消除对卷管理器的需要使系统管理变得更容易。此外,由于它是基于 128 位的,所以真正实现了数据的无限制扩展。
对于传统的文件系统,它们都具备一个设备模型或卷模型。这使管理工作变得非常复杂且容易出现管理错误,从而导致数据损坏或者数据访问缺乏。ZFS 提供了一个池存储模型,存储能力可以在其内部一个叫做 zpool 的可扩展池中控制。文件系统可共存于 zpool 中并能够共享池中的容量和 IO 资源。虚拟内存存储版本是一个全新的架构方式,能够简化文件系统管理并实现性能上的重大突破。
Solaris Containers 是 Sun 开发的操作系统虚拟化技术。它由几项技术组成,这些技术将共同提高资源管理能力并创建与潜在 OS 隔离的环境。借助 Solaris Containers,您可以自己决定如何对应用程序和服务分配资源并确保它们不会彼此干扰。紧密集成在一起的 ZFS 和 Containers 允许委托 zone 管理器控制 ZFS 文件系统。通过结合 ZFS 与 Containers,您可以分配存储池中的一部分容量给容器,使容器管理器有权管理存储池中的部分容量,同时又不干扰系统的其余部分(见下图)。因此,您将从 ZFS 数据集成中获益并获得容器的高可用性和资源控制。
注意:Containers 技术包含几个方面,本指南只针其中的 zone 部分。
ZFS 和 Containers:示例
本节将演示如何在 Solaris Containers 内部执行特定的 ZFS 文件系统任务。例如捕获快照和管理数据压缩。操作步骤如下:
- 创建 zpool
- 创建 zone
- 分配 ZFS 文件系统给 zone
- 创建新文件系统
- 对文件系统应用配额
- 更改文件系统的安装点
- 设置压缩属性
- 捕获快照
下面是对每一个步骤的详细描述。
创建 zpool
在处理池或设备时,ZFS 将使用设备名称或分区名称。对于设备来说,一般可能是 c1t0d0(SCSI 设备)或 c1d1(IDE 设备)。对于分区来说,可能是 c1t0d0s0(SCSI 设备)或 c1d1s0(IDE 设备)。
- 要在全局 zone 中创建 zpool,可以使用 zpool 创建命令。通常,我们使用两个设备提供冗余。
Global# zpool create mypool mirror c2t5d0 c2t6d0
注意:如果设备正处于使用状态或包含已存数据类型(如 UFS 文件系统),那么 zpool 创建命令可能会失败。如果设备正处于使用中,需要卸下或者停用。如果包含已存数据,可以通过 -f(force) 标记忽略安全检验但要确保不破坏您想要保留的数据。
- 使用 zpool list 命令检验池属性
Global# zpool list
NAME |
SIZE |
USED |
AVAIL |
CAP |
HEALTH |
ALTROOT |
mypool |
199G |
164K |
199G |
0% |
online |
-- | | 命令显示存在一个名为 mypool 的 zpool,容量为 199GB。
创建 zone
要使 ZFS 在一个与其他应用程序隔离的环境下运行,需要创建一个 zone,步骤如下:
- 首先,使用 mkdir 命令创建一个用于存放 zone 文件系统的目录。需确保所选位置的文件系统至少有 80 MB 的可用空间。
Global# mkdir /zones
注意:在本例中,为了节省时间,zone 的根文件系统是一个 UFS 文件系统。
- 使用 zonecfg 命令配置该 zone(myzone),并指定 zone 文件(/zones/myzone)的位置。使用以下命令:
Global# zonecfg -z myzone myzone: No such zone configured Use 'create' to begin configuring a new zone zonecfg:myzone< create zonecfg:myzone< set zonepath=/zones/myzone zonecfg:myzone< verify zonecfg:myzone< commit zonecfg:myzone< exit
为了达到精简的目的,本例选择使用一个非常小的 zone。有关创建 zone 的更多信息,请参阅 Solaris Containers How To Do Stuff 指南:
- 使用 zoneadm 安装 zone。
Global# zoneadm -z myzone install Preparing to install zone >myzone< [Output from zoneadm, this may take a few mins]
- 使用 zoneadm 命令启动 zone 以完成安装。
Global# zoneadm -z myzone boot
- 使用 zlogin 命令连接到 zone 控制台。
Global# zlogin -C myzone [Connected to zone 'myzone' console] [Initial zone boot output, service descriptions are loaded etc.]
首次启动时,需要进行各种配置并加载全部描述符等等,这可能需要一点时间。您还要提供系统配置的细节,相关建议如下:
Terminal=(12)X Terminal Emulator (xterms) Not Networked No Kerberos Name service = None Time Zone = your-time-zone root passwd = (Your choice—remember it though!)
在提供配置信息后,zone 将重新启动。
- 在进入下一个步骤之前,需要关闭已配置的 zone(只有在 zone 启动时,配置更改才会生效)。
Global# zlogin myzone init 5
分配 ZFS 文件系统给 zone
现在,您已经创建了一个 zpool(mypool)和一个 zone(myzone)。接下来,需要分配 ZFS 文件系统给 zone。
- 使用 zfs 创建命令创建 ZFS 文件系统。
Global# zfs create mypool/myzonefs
- 使用 zfs 设置配额指令,应用配额到文件系统。
Global# zfs set quota=5G mypool/myzonefs
文件系统和所有子文件系统不能大于指定配额。注意:在全局 zone 中这些步骤是必须执行的。还要注意的是在 ZFS 中创建文件系统要比使用传统的文件系统/容量管理器容易的多。
使用 ZFS 描述容器的隔离/安全属性。本实例创建的 ZFS 文件系统将保留在容器外部,无需应用配额到这个外部的文件系统。
- 再次使用 zfs 创建命令创建另一个文件系统。
Global# zfs create mypool/myfs
- 要显示所有池和文件系统的属性,可以使用 zfs list 命令。
Global# zfs list
NAME |
USED |
AVAIL |
REFER |
MOUNTPOINT |
mypool |
396G |
197G |
99.5K |
/mypool |
mypool/myfs |
98.5K |
197G |
98.5K |
/mypool/myfs |
mypool/myzonefs |
98.5K |
5G |
98.5K |
/mypool/myzonefs | |
要使文件系统(myzonefs)在 zone(myzone)中可用,需更新 zone 配置。
- 要更新 zone 配置,可以使用 zonecfg 命令。
Global# zonecfg -z myzone zonecfg:myzone> add dataset zonecfg:myzone:dataset> set name=mypool/myzonefs zonecfg:myzone:dataset> end zonecfg:myzone> commit zonecfg:myzone> exit
现在,mypool/myzonefs 文件系统已经加载到 zone 配置上了。注意:这些步骤必须在 zone 关闭的状态下执行,否则在下一次重新启动前,看不到 zone 配置的更改。要检查 zone 是否已经关闭,使用 zlogin myzone 登录,如果 zone 处于关闭状态,则登录会失败,如果 zone 正在运行,会显示登录提示—login as root,可以使用 init 5 关闭 zone。在全局 zone 中执行这些步骤。
- 启动 zone。
Global# zoneadm -z myzone boot
- 登陆到 zone。(保留几秒钟用来启动 zone)
Global# zlogin -C myzone [Connected to zone 'myzone' pts/3] [Usual Solaris login sequence]
- 在 zone 中列出 ZFS 文件系统。
NAME |
USED |
AVAIL |
REFER |
MOUNTPOINT |
mypool |
0M |
200B |
-- |
/mypool |
mypool/myzonefs |
8K |
5G |
8K |
/mypool/myzonefs | |
注意,外部配额的 5GB 最大可用空间和位于池内的(mypool/myfs)文件系统是不可见的,这验证了 Containers 能够提供隔离功能。
创建新的文件系统
虽然操作被限制在分配到 zone(mypool/myzonefs)的文件系统内,但是从非全局 zone 管理 ZFS 文件系统和在全局内的操作时相同的。由于 ZFS 文件系统是非全局 zone 惟一能查看的文件系统,所以新的 ZFS 文件系统总是以子文件系统的形式创建的。操作无需全局 zone 管理器的参与,即使在需要的时候可以使用管理器操作。
- 要创建新的文件系统,可以使用 zfs create 命令。
MyZone# zfs create mypool/myzonefs/tim MyZone# zfs list
NAME |
USED |
AVAIL |
REFER |
MOUNTPOINT |
mypool |
594M |
197G |
99K |
/mypool |
mypool/myzonefs |
197K |
5.00G |
98.5K |
/mypool/myzonefs |
mypool/myzonefs/tim |
98.5K |
5.00G |
98.5K |
/mypool/myzonefs/tim | |
非全局 zone 管理器可以任意创建子文件系统(无数量限制),并且每个子文件系统都拥有自己的文件系统,在此基础上形成了一个层级式结构。
非全局 zone 管理器只用于指定的文件系统,本实例试着通过在容器“空间”外部创建一个文件系统以打破这种安全性。
- 要在 mypool/myzonefs 外部创建另一个文件系统,可以使用 zfs create 命令。
MyZone# zfs create mypool/myzonefs1 cannot create 'mypool/myzonefs1': permission denied
正如所见,ZFS 和 zone 安全性拒绝非全局 zone 访问没有指定的资源,操作失败。
应用配额到文件系统
通常情况,为了阻止用户耗尽所有的存储空间,非全局 zone 管理器会对新文件系统应用配额。子文件系统的配额不能超过 5GB,因为这个数目是全局 zone 管理器对 mypool/myzonefs 下全部文件系统指定的配额总量。
- 要对新文件系统设置配额,使用 zfs set quota 命令。
MyZone# zfs set quota=1G mypool/myzonefs/tim MyZone# zfs list
NAME |
USED |
AVAIL |
REFER |
MOUNTPOINT |
mypool |
508M |
197G |
99K |
/mypool |
mypool/myzonefs |
198K |
5.00G |
99K |
/mypool/myzonefs |
mypool/myzonefs/tim |
98.5K |
1024M |
98.5K |
/mypool/myzonefs/tim | |
非全局 zone 管理器子文件系统的配额设置为 1G,由于操作的是委托的资源且不需要全局 zone 管理器的参与,所以有足够的授权进行上述操作。
ZFS 属性继承机制允许跨 zone 应用,所以非全局 zone 管理器能够根据需要指定自身的属性值。使用标准 ZFS 属性继承,可以覆盖继承的值。
改变文件系统的安装点
现在,文件系统配置完成并分配了正确的配额,准备就绪。但是,文件系统出现的部分位置是由全局 zone 管理器选择的池名称指定的(本实例中为 mypool/myzonefs)。通常情况,非全局 zone 管理器会对其进行更改。
- 要更改安装点,使用 zfs set mountpoint 命令。
MyZone# zfs set mountpoint=/export/home/tim mypool/myzonefs/tim MyZone# zfs list
NAME |
USED |
AVAIL |
REFER |
MOUNTPOINT |
mypool |
508M |
197G |
99K |
/mypool |
mypool/myzonefs |
198K |
5.00G |
99K |
/mypool/myzonefs |
mypool/myzonefs/tim |
98.5K |
1024M |
98.5K |
/export/home/tim | |
注意:任何文件系统的安装点 都能够单独更改。
设置压缩属性
下面的实例的目的是验证压缩属性。如果压缩时可执行的,ZFS 将在数据被写入磁盘前将其全部压缩。
压缩的优点是节省磁盘空间并提高编写速度。
- 要查看当前压缩设置,可以使用 zfs get 命令。
MyZone# zfs get compression mypool mypool/myzonefs mypool/myzonefs/tim
NAME |
PROPERTY |
VALUE |
SOURCE |
mypool |
compression |
off |
default |
mypool/myzonefs |
compression |
off |
default |
mypool/myzonefs/tim |
compression |
off |
default | |
需要注意:由于池的压缩属性是由文件系统和子文件系统通过继承得到的,所以如果非全局 zone 管理器一旦为委托的文件系统设置了压缩属性,那么它会对后面所有文件系统设置相同的属性。administrator sets the compression property for the delegated file system, it will set it for everything below, as well.
- 要设置文件系统压缩属性,可以使用 zfs set 命令。
MyZone# zfs set compression=on mypool/myzonefs
- 再次检查非全局 zone 的压缩属性。
MyZone# zfs get compression mypool mypool/myzonefs mypool/myzonefs/tim
NAME |
PROPERTY |
VALUE |
SOURCE |
mypool |
compression |
off |
default |
mypool/myzonefs |
compression |
on |
local |
mypool/myzonefs/tim |
compression |
on |
Inherited from mypool/myzonefs | |
注意:与标准属性管理相同,mypool/myzonefs/tim 已经继承了压缩属性。
捕获快照
ZFS 的一个主要优势就是具备瞬时创建针对任何文件系统快照的能力。通过委托文件系统到非全局 zone 使非全局 zone 管理器的选择成为可能。
- 要捕获一个名为“1st”的文件系统快照,可以使用 zfs snapshot 命令。
MyZone# zfs snapshot mypool/myzonefs@1st MyZone# zfs list
NAME |
USED |
AVAIL |
REFER |
MOUNTPOINT |
mypool |
512K |
99K |
default |
/mypool |
mypool/myzonefs |
198K |
5.00G |
99K |
/mypool/myzonefs |
mypool/myzonefs@1st |
OK |
-- |
99K |
-- |
mypool/myzonefs/tim |
98.5K |
1024M |
98.5K |
/export/home/tim | |
与全局 zone 中的文件系统相同,可以在 .zfs/snapshot/1st 文件系统的根目录中获得捕获的快照。
结束语
将 ZFS 文件系统分配给已经创建的 zone 后,该(非全局)zone 上的管理器将能够创建文件、捕获快照、创建 clone 以及在该 zone 内执行管理员的任何任务。同时,所有的操作又是与全局 zone 和其他 zone 完全隔离的。
Solaris Containers 与 Solaris ZFS 的集成是 Solaris 10 OS 向客户提供的另一种创造利润的方法,它可以帮助客户巩固应用程序和更加轻松地管理应用程序所需的数据。
更多信息
Solaris How To 指南介绍了如何结合 Solaris Container 技术与 ZFS 文件系统实现更加高级的配置。欲了解更多关于 Solaris Containers 和 Solaris ZFS 的信息,请访问 。
使用手册 |
Solaris ZFS 管理指南 |
|
基于 Web 的培训 |
Solaris ZFS 学习中心(包括视频和演示) |
|
Solaris Containers 学习中心 |
|
Solaris Containers 入门 |
|
常见问题解答 |
ZFS 常见问题解答 |
|
特殊问题解答 |
|
社区资源 |
OpenSolaris ZFS 社区 |
|
Sun ZFS 博客 |
| | |