SMARTOS 总结
什么是ZFS文件系统,有什么特点?
动态文件系统(Dynamic File System),是第一个128位文件系统,基于存储池的,与典型的映射物理存储设备的传统文件系ZFS统不同,ZFS所有在存储池中的文件系统都可以使用存储池的资源,ZFS 完全抛弃了“卷管理”,不再创建虚拟的卷,而是把所有设备集中到一个存储池中来进行管理!“存储池”描述了存储的物理特征(设备的布局,数据的冗余等等),并扮演一个能够创建文件系统的专门存储空间。
使用一种写时拷贝事务模型技术。所有文件系统中的块指针都包括256位的能在读时被重新校验的关于目标块的校验和。含有活动数据的块从来不被覆盖;而是分配一个新块,并把修改过的数据写在新块上。所有与该块相关的元数据块都被重新读、分配和重写。为了减少该过程的开销,多次读写更新被归纳为一个事件组,并且在必要的时候使用日志来同步写操作。
利用写时拷贝使ZFS的快照和事物功能的实现变得更简单和自然,快照功能更灵活。缺点是,COW使碎片化问题更加严重,对于顺序写生成的大文件,如果以后随机的对其中的一部分进行了更改,那么这个文件在硬盘上的物理地址就变得不再连续,未来的顺序读会变得性能比较差。
创建一个池的例子
# zpool create tank mirror c1t0d0 c1t1d0
这是一个被镜像了的池,名叫“tank”。如果命令中的设备包含有其他的文件系统或者以别的形式被使用,那么命令不能执行。
要查看池是否成功创建,用 zpool list 命令,例如:
# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 80G 137K 80G 0% ONLINE -
创建一个文件系统
# zfs create tank/home
下一步,就可以创建各个文件系统,把它们都归组到 home 这个文件系统中。
创建一个文件系统
# zfs create tank/home
下一步,就可以创建各个文件系统,把它们都归组到 home 这个文件系统中。
同时可以设置home的特性,让组内的其他文件系统继承的它的这些特性。
当一个文件系统层次创建之后,可以为这个文件系统设置一些特性,这些特性将被所有的用户共享:
# zfs set mountpoint=/export/zfs tank/home
# zfs set sharenfs=on tank/home
# zfs set compression=on tank/home
# zfs get compression tank/home
NAME PROPERTY VALUE SOURCE
tank/home compression on local
[[email protected] ~]# mkdir /export/zfs
mkdir: Failed to make directory "/export/zfs"; No such file or directory
[[email protected] ~]# mkdir -p /export/zfs
[[email protected] ~]# zfs set mountpoint=/export/zfs zones/home
[[email protected] ~]# zfs set sharenfs=on zones/home
[[email protected] ~]# zfs set compression=on zones/home
[[email protected] ~]# zfs get compression zones/home
NAME PROPERTY VALUE SOURCE
zones/home compression on local
⒋创建单个的文件系统
注意:这些文件系统如果被创建好,他们的特性的改变将被限制在home级别,所有的特性能够在文件系统的使用过程中动态的改变。
# zfs create tank/home/bonwick
# zfs create tank/home/billm
bonwick、billm文件系统从父文件系统home中继承了特性,因此他们被自动的mount到/export/zfs/user 同时作为被共享的NFS。管理员根本不需要再手工去编辑 /etc/vfstab 或 /etc/dfs/dfstab 文件。
每个文件系统除了继承特性外,还可以有自己的特性,如果用户bonwick的磁盘空间要限制在10G。
# zfs set quota=10G tank/home/bonwick
⒌用 zfs list 命令查看可获得的文件系统的信息,类似于过去的 df -k 命令了,呵呵 .
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 92.0K 67.0G 9.5K /tank
tank/home 24.0K 67.0G 8K /export/zfs
tank/home/billm 8K 67.0G 8K /export/zfs/billm
tank/home/bonwick 8K 10.0G 8K /export/zfs/bonwick
传统的文件系统被限制在单个磁盘设备之内,它们的尺寸是不能超越单个磁盘设备。
传统文件系统需要驻留于单独设备或者需要一个卷管理系统去使用一个以上的设备,而ZFS建立在虚拟的,被称为“zpools”的存储池之上 (存储池最早在AdvFS实现,并且加到后来的Btrfs)。[1]
过去的文件系统是被影射到一个物理存储单元,如:分区;所有的ZFS文件系统共享池内的可获得的存储空间。
ZFS 文件系统不需要通过编辑/etc/vfstab 文件来维护。
ZFS已经抛弃了卷管理,逻辑卷可以不再使用。因为ZFS在使用和管理raw设备能够有更好的表现。
Components of a ZFS Storage Pool
组成ZFS存储池的元件有:磁盘、文件、虚拟设备,其中磁盘可以是整个硬盘(c1t0d0),也可以是单个slice(c0t0d0s7)。推荐使用整个硬盘,这样可以省去分区操作(format)。
RAID-Z 跟 RAID-5的区别
传统的raid-5都存在着“写漏洞”,就是说如果raid-5的stripe在正写数据时,如果这时候电源中断,那么奇偶校验数据将跟该部分数据不同步,因此前边的写无效;RAID-Z用了“variable-width RAID stripes”技术,因此所有的写都是full-stripe writes。之所以能实现这种技术,就是因为ZFS集成了文件系统和设备管理,使得文件系统的元数据有足够的信息来控制“variable-width RAID stripes”
⒈创建一个基本的存储池,方法很简单:
# zpool create tank c1t0d0 c1t1d0
这时可以在 /dev/dsk 目录下看到一个大的slice,数据动态的stripe跨过所有磁盘!
⒉创建一个镜像的存储池
也是很简单,只要在上边命令基础上增加“mirror”关键字就可以了,下边是创建一个两路(two-way)镜像的例子:
# zpool create tank mirror c1d0 c2d0 mirror c3d0 c4d0
⒊创建RAID-Z存储池
使用“raidz”关键字就可以了,例如:
# zpool create tank raidz c1t0d0 c2t0d0 c3t0d0 c4t0d0 /dev/dsk/c5t0d0
这里/dev/dsk/c5t0d0其实跟用c5t0d0是一样的,由此可以看出,在创建ZFS的时候,磁盘完全可以用物理设备名就可以,不需要指出全路径。
Zones是什么?如何管理
Solaris Zones 分区技术用于虚拟化操作系统服务,提供安全的隔离环境以便运行应用程序。区域就是在 Solaris 操作系统的某个实例中创建的一个虚拟的操作系统环境。创建区域时,便创建了一个应用程序执行环境,其中的进程与系统的其余部分相隔离。
这种隔离阻止了在一个区域中运行的进程监视或影响在其他区域中运行的进程。即使运行的进程具有超级用户凭证,也不能查看或影响其他区域中的活动。区域还提供了一个抽象层,用于分隔应用程序和部署这些应用程序的计算机的物理属性。这些属性的示例包括物理设备路径。
可以将一个非全局区域想象为一个盒子。一个或多个应用程序可在这个盒子中运行,而不与系统的其余部分交互。Solaris 区域使用灵活、软件自定义的边界将各软件应用程序或服务分隔开来。然后,便可分别管理在 Solaris 操作系统的同一实例中运行的应用程序。因此,为了符合配置要求,不同版本的同一应用程序可以在不同区域中运行。每个需要网络连接的区域都有一个或多个专用 IP 地址。指定给某区域的进程可以处理、监视指定给同一区域的其他进程,并可直接与这些进程进行通信。进程不能对指定给系统中其他区域的进程执行这些功能,也不能对未指定给区域的进程执行这些功能。指定给不同区域的进程只能通过网络 API 进行通信。每个 Solaris 系统都包含一个全局区域。全局区域具有双重功能。全局区域既是系统的缺省区域,也是用于在整个系统中实施管理控制的区域。如果全局管理员未创建任何非全局区域(简称为区域),则所有进程都在全局区域中运行。只能从全局区域配置、安装、管理或卸载非全局区域。只有全局区域才可从系统硬件进行引导。只能在全局区域中进行系统基础结构(如物理设备)的管理、路由或动态重新配置
区域功能总结
全局 由系统指定 ID 0
提供正在系统上运行的可引导的 Solaris 内核的单个实例
包含 Solaris 系统软件包的完整安装
可以包含其他软件包或未通过软件包安装的其他软件、目录、文件以及其他数据
提供一个完整一致的产品数据库,该数据库包含安装在全局区域中的所有软件组件的有关信息
仅存放特定于全局区域的配置信息,如全局区域主机名和文件系统表
是识别所有设备和所有文件系统的唯一区域
是识别非全局区域存在和配置的唯一区域
是可以从中配置、安装、管理或卸载非全局区域的唯一区域
非全局 引导区域时由系统指定区域 ID
共享从全局区域引导的 Solaris 内核下的操作
包含完整 Solaris 操作系统软件包中已安装的一部分
包含从全局区域共享的 Solaris 软件包
可以包含未从全局区域共享的其他已安装的软件包
可以包含在非全局区域上创建的,未通过软件包安装或者未从全局区域共享的其他软件、目录、文件以及其他数据
具有一个完整一致的产品数据库,该数据库包含安装在非全局区域中的所有软件组件的有关信息,无论这些组件存在于非全局 区域上还是从全局区域中只读共享
不识别其他任何区域的存在
无法安装、管理或卸载其他区域,包括其本身
仅具有特定于非全局区域的配置信息,例如非全局区域主机名和文件系统表
如何管理非全局区域
全局管理员拥有超级用户权限或承担主管理员角色。当全局管理员登录到全局区域时,可以将系统作为一个整体进行监视和控制。
区域管理员可以管理非全局区域。全局管理员为区域管理员指定区域管理配置文件。区域管理员的权限仅限于某个非全局区域。
如何创建非全局区域
全局管理员使用 zonecfg 命令,通过为区域虚拟平台和应用程序环境指定各种参数来配置区域。然后,全局管理员安装区域,使用区域管理命令 zoneadm 将软件包中的软件安装到为区域建立的文件系统分层结构。全局管理员可以使用 zlogin 命令登录到已安装的区域。首次登录时,会完成区域的内部配置。然后使用 zoneadm 命令引导区域
当前区域状态 适用的命令
已配置 zonecfg -z zonename verify
zonecfg -z zonename commit
zonecfg -z zonename delete
zoneadm -z zonename verify
zoneadm -z zonename install
未完成 zoneadm -z zonename uninstall
已安装 zoneadm -z zonename ready(可选)
zoneadm -z zonename boot
zoneadm -z zonename uninstall 从系统中卸载指定区域的配置。
zonecfg -z zonename 可用于添加或删除 fs、dataset、net、device、
rctl 或 attr 属性。无法更改 zonepath 和 inherit-pkg-dir 资源
就绪 zoneadm -z zonename boot
zoneadm halt 和系统重新引导使区域从就绪状态返回到已安装状态。
zonecfg -z zonename 可用于添加或删除 fs、dataset、net、device、
rctl 或 attr 属性。无法更改 zonepath 和 inherit-pkg-dir 资源。
正在运行 zlogin optionszonename
zoneadm -z zonename reboot
zoneadm -z zonename halt 使就绪区域返回到已安装状态。
zoneadm halt 和系统重新引导使区域从正在运行状态返回到已安装状态。
zonecfg -z zonename 可用于添加或删除 fs、dataset、net、device、
rctl 或 attr 属性。无法更改 zonepath 和 inherit-pkg-dir 资源。
非全局区域特征
区域提供的隔离几乎可细化到您所需的任何程度。区域不需要专用的 CPU、物理设备或部分物理内存。可以在单个域或系统中运行的多个区域之间复用这些资源,也可借助操作系统中可用的资源管理功能为每个区域分别分配这些资源。
每个区域都可提供一组自定义的服务。要执行基本进程隔离,一个进程只能看到同一区域中的各个进程,或向这些进程发送信号。通过为每个区域至少提供一个逻辑网络接口,可在不同区域间实现基本通信。在某个区域中运行的应用程序看不到其他区域的网络流量。
即使各个软件包的流使用同一物理接口,也会维护这种隔离。
每个区域都在文件系统分层结构中拥有一个位置。因为每个区域都只限于文件系统分层结构中的一个子树,所以在某一特定区域中运行的工作负荷不能访问在其他区域中运行的另一个工作负荷的盘上数据。
命名服务使用的文件驻留在区域本身的根文件系统视图中。因此,不同区域的命名服务之间相互分离并可单独配置。
非全局区域配置
预安装配置过程
在系统上安装和使用非全局区域之前,必须配置此区域。
zonecfg 命令用于创建配置,并确定指定的资源和属性是否在虚拟系统上有效。zonecfg 对给定配置执行的检查将检验以下内容:
■ 确保已指定区域路径
■ 确保已为每个资源指定所有必需的属性
在区域中挂载的文件系统
通常,在区域中挂载的文件系统包括:
■ 初始化虚拟平台时挂载的文件系统集合
■ 在应用程序环境本身中挂载的文件系统集合
例如,这可以包括以下文件系统:
■ 在区域的 /etc/vfstab 文件中指定的文件系统
■ AutoFS 挂载和 AutoFS 触发的挂载
■ 区域管理员明确执行的挂载
将对在应用程序环境中执行的挂载设定特定限制。这些限制可防止区域管理员拒绝为系统
的其余部分提供服务,或者对其他区域产生不良影响。
在区域中挂载特定的文件系统时存在安全限制。其他文件系统在区域中挂载时会显示出特
殊行为。
使用 zonecfg 命令
zonecfg(1M) 手册页中所述的 zonecfg 命令用于配置区域。zonecfg 命令可以在交互模式、
命令行模式或命令文件模式下使用。可以使用此命令执行以下操作:
■ 创建或删除(销毁)区域配置
■ 将资源添加到特定配置
■ 为添加到配置的资源设置属性
■ 从特定配置中删除资源
■ 查询或检验配置
■ 提交到配置
■ 恢复到先前配置
■ 从 zonecfg 会话中退出
zonecfg 提示符的格式如下:
zonecfg:zonename>
当您配置特定的资源类型(例如文件系统)时,此资源类型也包含在提示符中:
zonecfg:zonename:fs>
zonecfg 模式
范围的概念用于用户界面。范围可以为全局或资源特定。缺省范围为全局。
在全局范围中,add 子命令和 select 子命令用于选择特定的资源。然后范围更改为此资源类型。
■ 对于 add 子命令,end 或 cancel 子命令用于完成资源指定。
■ 对于 select 子命令,end 或 cancel 子命令用于完成资源修改。
然后范围恢复为全局。
某些子命令(例如 add、remove 和 set)在每个范围中都有不同的语义
zonecfg 交互模式
交互模式支持以下子命令。有关与子命令一起使用的语义和选项的详细信息,请参见选项
的 zonecfg(1M) 手册页。对于可能会导致破坏性操作或作业丢失的子命令,系统要求用户
在继续之前进行确认。您可以使用 -F(强制)选项,跳过此项确认操作。
help 列显一般帮助,或者显示有关给定资源的帮助。
zonecfg:my-zone:inherit-pkg-dir> help
create 开始为指定的新区域配置内存中的配置,以实现以下用途之一:
■ 将 Sun 缺省设置应用于新的配置。此方法为缺省方法。
■ 与 -t template 选项一起使用时,用于创建与指定模板相同的配置。区域名称
从模板名称更改为新区域名称。
■ 与 -F 选项一起使用时,用于覆写现有配置。
■ 与 -b 选项一起使用时,用于创建其中未设置任何内容的空配置。
export 采用可以在命令文件中使用的格式,在标准输出或指定输出文件中列显配置。
add 在全局范围中,将指定的资源类型添加到配置。
在资源范围中,添加具有给定名称和给定值的属性。
set 将给定属性名称设置为给定属性值。请注意,某些属性(例如 zonepath)为全
局属性,而其他属性则为资源特定的属性。因此,此命令适用于全局范围和资源
范围。
select 仅适用于全局范围。选择与给定属性名称-属性值对的修改条件相匹配的给定类
型资源。将范围更改为此资源类型。您必须为要唯一标识的资源指定足够数量的
属性名称-值对。
remove 在全局范围中,删除指定的资源类型。您必须为要唯一标识的资源类型指定足够
数量的属性名称-值对。
在资源范围中,从当前资源中删除指定的属性名称-属性值。
end 仅适用于资源范围。结束资源指定。
然后,zonecfg 命令将检验是否完全指定当前资源。
如果资源完全指定,则可以将其添加到内存中的配置,并且范围将恢复为全局。
如果未完全指定,则系统将显示一条描述需要执行何种操作的错误消息。
Cancel 仅适用于资源范围。结束资源指定并将范围重置为全局。系统不会保留任何未完全指定的资源。
Delete 销毁指定的配置。从内存和稳定存储器中删除配置。您必须将 -F(强制)选项与 delete 一起使用。
Info 显示有关当前配置或全局资源属性 zonepath、autoboot 和 pool 的信息。如果指定了资源类型,则仅显示有关此类型资源的信息。在资源范围中,此子命令仅应用于要添加或修改的资源。
Verify 检验当前配置是否正确。确保所有资源都指定了所有必需的属性。
Commit 将当前配置从内存提交到稳定存储器。在提交内存中的配置之前,可以使用
revert 子命令删除更改。必须提交配置以供 zoneadm 使用。完成 zonecfg 会话
时,便会自动尝试此操作。由于仅可提交正确的配置,因此,提交操作将自动进
行检验。
Revert 将配置恢复到上次提交时的状态。
Exit 退出 zonecfg 会话。 您可以将 -F(强制)选项与 exit 一起使用。
如果需要,会自动尝试 commit。请注意,也可以使用 EOF 字符退出会话。
资源和属性类型
资源和属性类型描述如下:
区域名称
区域名称用于标识配置实用程序的区域。以下规则适用于区域名称:
■ 每个区域必须具有唯一的名称。
■ 区域名称区分大小写。
■ 区域名称必须以字母数字字符开头。
名称可以包含字母数字字符、下划线 (_)、连字符 (-) 和句点 (.)。
■ 名称不能超过 64 个字符。
■ 名称 global 和所有以 SUNW 开头的名称均保留,不能使用。
zonepath
zonepath 属性是区域根目录的路径。每个区域都具有一个与全局区域
根目录相对的根目录路径。安装时,需要全局区域目录以提供限定的
可见性。它必须由 root 拥有,并且模式为 700。
非全局区域的根路径低一个级别。区域的根目录与全局区域中的根目
录 (/) 具有相同的拥有权和权限。区域目录必须由 root 拥有,并且模
式为 755。这些目录是使用正确的权限自动创建的,并且不需要区域管
理员进行检验。此分层结构可防止全局区域中的非特权用户遍历非全
局区域的文件系统。
路径 说明
/home/export/my-zone zonecfg zonepath
/home/export/my-zone/root 区域的根目录
/home/export/my-zone/dev 为区域创建的设备目录
autoboot
如果此属性设置为 true,则引导全局区域时会自动引导区域。请注
意,如果禁用区域服务 svc:/system/zones:default,则无论如何设置
此属性,区域都不会自动引导。您可以使用 svcadm(1M) 手册页中所述
的 svcadm 命令来启用区域服务:
global# svcadm enable zones
pool
此属性用于将区域与系统上的资源池关联。多个区域可以共享一个池
的资源。
fs
当区域从已安装状态转换为就绪状态时,每个区域都可以拥有已挂载的各种文件系统。文件系统资源指定文件系统挂载点的路径。
dataset
通过添加 ZFS 文件系统数据集资源,可以将存储管理委派给非全局区域。区域管理员可以在此数据集中创建和销毁文件系统,并可修改此
数据集的属性。区域管理员无法影响尚未添加到区域的数据集,也无法超过对指定给区域的数据集设置的任何顶层配额。
inherit-pkg-dir
不应在完全根区域中配置此资源。
在稀疏根区域中,inherit-pkg-dir 资源用于表示包含非全局区域与全局区域共享的软件包的目录。
非全局区域以只读模式继承传送到 inherit-pkg-dir 目录的软件包内容。区域的打包数据库将更新,以反映软件包。使用 zoneadm 安装区
域之后,便不能修改或删除这些资源。
注 – 配置中包含四种缺省 inherit-pkg-dir 资源。这些目录资源表示哪些目录应从全局区域中继承关联的软件包。资源通过只读回送文件系
统挂载来实现。
■/lib
■/platform
■/sbin
■/usr
net
网络接口资源是虚拟接口名称。当区域从已安装状态转换为就绪状态时,每个区域都可以具有应检测的网络接口。
device
设备资源是与设备匹配的说明符。当区域从已安装状态转换为就绪状态时,每个区域都具有应配置的设备。
rctl
rctl 资源用于区域范围的资源控制。当区域从已安装状态转换为就绪状态时,应启用这些控制。在此发行版中,执行的区域范围的资源控
制为 zone.cpu-shares 和 zone.max-lwps。
attr
此通用属性可用于用户注释或其他子系统。attr 的 name 属性必须以字母数字字符开头。name 属性可以包含字母数字字符、连字符 (-) 和句点
(.)。以 zone. 开头的属性名称将保留,以供系统使用。
Zpool和Zones区别
SMARTOS 如何创建KVM 虚拟主机,KVM主机存在哪里