免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
打印 上一主题 下一主题

【Solaris 10专题】Solaris 10设备与文件系统管理 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-04-10 15:16 |只看该作者

创建和管理存储池

本节详细地描述了如何创建和管理存储池。

虚拟设备

在创建存储池之前,你必须先理解虚拟设备这一基本概念。每个存储池都是由一个或多个虚拟设备组成的,这些虚拟设备描述物理设备的分层特性和全部特性。

这些虚拟设备包括:
1.磁盘

存储池的块是物理存储的一部分。这些块设备最小是128MB。在典型情况下,这些块设备在系统/dev/dsk目录下。存储设备可能是一个整盘或一个盘片,推荐使用全盘,因为这样不再需要专门的格式化。ZFS格式化使用EFI label,format命令运行结果如下:

Current partition table (original):

Total disk sectors available: 71670953 + 16384 (reserved sectors)

Part Tag Flag First Sector Size Last Sector

0 usr wm 34 34.18GB 71670953

1 unassigned wm 0 0 0

2 unassigned wm 0 0 0

3 unassigned wm 0 0 0

4 unassigned wm 0 0 0

5 unassigned wm 0 0 0

6 unassigned wm 0 0 0

7 unassigned wm 0 0 0

8 reserved wm 71670954 8.00MB 71687337

当你使用全盘的时候,盘的名字必须为标准的Solaris名(/dev/dsk/cXtXdXsX)。某些第三方设备使用了不同的命名方式并且不放在/dev/dsk目录下。为了使用这些磁盘,你必须手动标记这些磁盘。磁盘可以使用EFI或Solaris VTOC label。如果设备名不是标准的或者一个磁盘必须由ZFS、UFS或swap分享,则需要使用盘片。磁盘可以使用全部路径来表示,也可以使用短的文件名来表示,比如可用的磁盘名:

c1t0d0

/dev/dsk/c1t0d0

c0t0d6s2

/dev/foo/disk

ZFS最好工作在全部的物理盘上。你应当避免使用volume manager构建逻辑设备和硬RAID。当ZFS功能应用在这些设备上时,它可能导致非最优的性能。

磁盘将鉴别它的路径和设备ID。这允许不更新任何zfs状态时重新设置系统设备。如果设备在控制器1和控制器2之间进行切换,ZFS通过设备ID发现磁盘被移走后将连接控制器2。设备ID是设备固件的惟一标识。即便有些固件在更新的时候改变标识,ZFS也能通过设备路径访问设备。如果路径和ID都改变了,就应该卸出后再装入这个设备。
2.文件

ZFS为了测试和做一些简单的实验,也允许在池中建立一些传统的文件系统。“任何文件都需要底层文件系统的连接”。如果你创建了ZFS存储池但建立了UFS的文件,就需要使用UFS来保障文件的正确性和同步了。

在试图尝试ZFS或没有足够的物理空间而做多层实验时,文件就变得非常有用。所有文件必须有完整的路径,最小必须有128MB。如果文件被删除或被改名,池必须要被卸出后重新装入。
3.镜像

镜像和RAID-Z:ZFS提供两个冗余方法。一个镜像至少需要两个磁盘,并最好在不同的控制器上。
RAID-Z

RAID-Z与RAID-5非常相似,除了全部条带的写以外。为了设置RAID-Z,你至少需要两块磁盘。除此之外,不需要其他的硬件。RAID-Z提供一个校验。如果你有3块盘,其中一块盘则将提供校验。

动态的条带
为了将每个虚拟设备都能添加到池中,ZFS动态条带数据可以访问所有可用设备。在数据写的时候就决定放置地点,所以不需要在分配时创建固定的条带。虚拟设备能增加到池中,ZFS可保证将数据分派到新的设备。

最终结果,存储池能包含多个顶级虚拟设备。每个虚拟设备都能镜像和RAID-Z。

如果你有四个盘,你就能进行下列的设置:

 四个盘都用来做动态条带。

 四个盘的RAID-Z设置。

 两两镜像。

如果在顶级虚拟设备中则最好都使用相同类型和级别的虚拟设备。ZFS支持不同的虚拟设备到一个存储池中,但这是不被推荐的。比如,你能创建一个存储池,池中有镜像和三方的RAID-Z设置,就不算好的设置(因为有RAID-Z)。

创建存储池

创建和删除池都很容易。但是要小心,防止使用的磁盘已被占用。
1.创建池

使用zpool create命令来创建池,这个命令将用到池的名字和虚拟设备的数量。

(1)创建基本池。

 例13-1 在c0t0d0和c1t0d0上创建名为tank的池。

# zpool create tank c0t0d0 c1t0d0

就像以前的描述一样,这些磁盘将在/dev/dsk目录下找到,磁盘数据是动态条带化的。

(2)创建镜像池。

可以使用mirror关键字来创建镜像。也可以同时创建多个镜像。例子13-2就创建了两组镜像。

 例13-2 创建两组镜像。

# zpool create tank mirror c0d0 c1d0 mirror c0d1 c1d1

现在新的顶级虚拟设备被指定了。以动态条带状连接两个镜像,就能适当复制镜像磁盘中的数据。

(3)创建RAID-Z池。

使用关键字raidz来创建RAID-Z存储池。RAID-Z和RAID-5类似。

 例13-3 创建RAID-Z存储池。

# zpool create tank raidz c0t0d0s0 c0t0d1s0 c0t0d2s0 c0t0d3s0 /dev/dsk/c0t0d4s0

在上面的例子中,磁盘必须被重新格式化。/dev/dsk/c0t0d4s0和c0t0d4s0是一样的。

注意:RAID-Z可以使用盘片来做,但不推荐使用,最好使用整个盘来做。上面的例子正好用盘片做的。
2.对池产生的错误进行处置

有几个原因池将不能被创建。有些原因很明显的,比如专门的设备不存在等。

(1)检查磁盘是否被使用。

在格式化之前,ZFS首先检查这个设备是否被ZFS或者操作系统的其他部分使用。如果被使用了则会报错:

# zpool create tank c0t0d0 c1t0d0

invalid vdev specification

use ’-f’ to override the following errors:

/dev/dsk/c0t0d0s0 is currently mounted on /

/dev/dsk/c0t0d0s1 is currently mounted on swap

/dev/dsk/c1t1d0s0 is part of active pool ’tank’

有的写错误可以被-f所纠正,也有的不能。下面这些是不能纠正的,必须由管理员手工进行纠正:

 磁盘或盘片所包含的文件系统当前正mount上,需要使用umount卸载。

 在/etc/vfstab上设置的文件系统的磁盘,但设置错误了,需要重新设置/etc/vfstab文件。

 磁盘现在被当做dump device,需要使用dumpadm命令去掉这个设置。

 磁盘是活动的ZFS存储池的一部分。需要使用zpool命令删除这个存储池。

使用下列设备的时候也会有警告,但使用-f参数能纠正:

 如果磁盘包含一个知道的文件系统,虽然它没有mount,但也不能使用。

 磁盘是卷的一部分。

 磁盘是作为live upgrade启动环境而存在的。

 卸出的ZFS池的一部分。在较少的情况下,这个存储池报告潜在的活动,因为磁盘可能是其他系统所使用的网络附加设备。要谨慎处理具有潜在活动的存储。

 例13-4 磁盘中包含文件系统,使用-f选项强行创建存储池。

# zpool create tank c0t0d0

invalid vdev specification

use ’-f’ to override the following errors:

/dev/dsk/c0t0d0s0 contains a ufs filesystem

# zpool create -f tank c0t0d0
3.模拟创建存储池

创建存储池可能会出现出乎意料的错误,因为格式化的磁盘有些潜在的有害活动。zfs create命令有个附加的选项-n,它能模拟创建存储池而不往磁盘中真正写数据。这个属性用来检测和报告错误。

 例13-5 模拟创建存储池。

# zpool create -n tank mirror c1t0d0 c1t1d1

would create ’tank’ with the following layout:

tank

mirror

c1t0d0

c1t1d0

使用这种方法,可以检测是否能安全创建存储池。
4.存储池的默认安装点

当池被创建后,root数据集默认的安装点就是/poolname。这个路径必须是不存在的或者是空的。(在某种情况中自己可创建。)创建不同的安装点使用命令zpool create’s –m。


 例13-6 创建安装点。

先不使用-m参数:

# zpool create home c0t0d0

default mountpoint ’/home’ exists and is not empty

use ’-m’ option to specify a different default

出现提示,要求使用-m参数。

# zpool create -m /export/zfs home c0t0d0

使用之后,成功创建。

删除存储池

当写在磁盘中的数据不再需要的时候,就可以使用zpool destroy命令删除存储池。

# zpool destroy tank

注意:存储池被删除后,数据也同时会丢失。

在有些时候,某些设备会有“潜在的活动“,如果使用一般的删除命令,就不能将存储池删除。这时,就需要使用-f参数了。

 例13-7 删除tank存储池。

# zpool destroy tank

cannot destroy ’tank’: pool is faulted

use ’-f’ to force destruction anyway

# zpool destroy -f tank

存储池的设备管理

一个存储池有很多的虚拟设备,而虚拟设备又是由物理设备所组成的。
1.在已有的存储池中增加设备

通过增加顶级虚拟设备,存储池的空间能被动态增加。新增的空间能被存储池中的所有数据集立即使用。使用zpool命令,能增加存储池中的虚拟设备。

 例13-8 增加tank存储池中的虚拟设备。

# zpool add tank mirror c0t0d0 c1t0d0 mirror c0t0d1 c1t0d1

这个命令的形式和zpool create命令的形式差不多。其实,也可以使用-n选项来模拟增加新的设备的情况。

 例13-9 模拟增加tank存储池中的虚拟设备。

# zpool add -n tank mirror c1t0d0 c1t0d1

would update ’tank’ to the following configuration:

mirror

c0t0d0

c0t0d0

mirror

c1t0d0

c1t0d1
2.存储池中设备的在线和离线

ZFS允许单个设备在线或离线。当一个硬件出现问题的时候,ZFS暂时还能进行读写操作。设备暂时不需要离线的目的是为了替换它们。如果在可能的情况下,ZFS将离线设备。设备离线后,ZFS将不再给离线的设备发送查询信息。
3.进行设备离线

使用zpool offline命令进行设备离线。设备具有专门的路径或名称。

# zpool offline tank c0t0d0

bringing device ’c0t0d0’ offline

你不能在使设备失败的情况下使设备离线。比如,你不能在RAID-Z中离线两个设备或不能离线顶级的虚拟设备。

离线的设备在查询的时候显示离线状态。

如果你真想通过离线设备而导致池的损坏,就使用-f选项。但这样可能导致I/O错误和系统崩溃。

离线设备在系统重新启动后仍保持离线状态。

 例13-10 使tank存储池中的设备离线。

# zpool offline tank c0t0d0

cannot offline /dev/dsk/c1t2d0: no valid replicas
4.恢复设备在线

使用zpool online命令恢复设备在线。

当设备在线后,写到存储池中的数据将被重新同步到新的设备中。需要注意的是,不能在设备在线的时候替换设备。

 例13-11 使tank存储池某个设备在线。

# zpool online tank c0t0d0

bringing device ’c0t0d0’ online
5.替换设备

使用zpool replace命令来替换存储池中的设备。

替换的设备必须和原来的设备一样大或大于原来的设备。如果比原来的大,池的大小就增加了。

 例13-12 替换存储池中的设备。

# zpool replace tank c0t0d0 c0t0d1

在上面的例子中,设备c0t0d0被c0t0d1所替换。

存储池状态查询

通过zpool命令,可以查询存储池中的信息。这些信息为三类:基本信息、I/O信息、健康信息。
1.基本信息

当没有其他参数的时候,zpool list列出所有信息。

 例13-13 列出所有存储池的信息。

# zpool list

NAME SIZE USED AVAIL CAP HEALTH ALTROOT

tank 80.0G 22.3G 47.7G 28% ONLINE -

dozer 1.2T 384G 816G 32% ONLINE -

下面对所有栏目进行详细解释:

 NAME:池的名字

 USED:所有数据集和内部元数据的使用数量。这个数值不同于文件系统级的报告的数量。

 SIZE:池的总共大小,等同于顶级的所有虚拟设备的总和。

 AVAILABLE:池中没有分配的空间总和。

 CAPACITY(CAP)使用的百分比

 HEALTH:池的当前的健康状态

 ALTROOT:改变池的根(root)

使用-o的属性显示个别的状态,比如,只列出池的名称和大小。

 例13-14 列出存储池的名称和大小。

# zpool list -o name,size

NAME SIZE

tank 80.0G

dozer 1.2T

在命令中使用-H参数能禁止出现台头。

 例13-15 只列出存储池的名字。

# zpool list -Ho name

tank

dozer
2.I/O状态

为了可以使用zpool iostat命令得到池或者虚拟设备的I/O统计信息。就像iostat命令一样,它能显示所有快照的统计信息和每隔一段时间的统计信息。下面的内容被报告。

 USED CAPACITY(使用容量):用户当前在池和设备中存储数据的数量。

 AVAILABLE CAPACITY(可用容量):可以使用的空间。

 READ OPERATIONS:读操作。

 WRITE OPERATIONS:写操作。

 READ BANDWIDTH:所有读操作的带宽。

 WRITE BANDWIDTH:所有写操作的带宽。

当不使用参数的时候,zpool iostat命令显示存储池的所有统计信息。

 例13-16 显示存储池的所有统计信息。

# zpool iostat

capacity operations bandwidth

pool used avail read write read write

---------- ----- ----- ----- ----- ----- -----

tank 100G 20.0G 1.2M 102K 1.2M 3.45K

dozer 12.3G 67.7G 132K 15.2K 32.1K 1.20K

如果池是空闲的,带宽的值就可能很小。

正确查看带宽的方法是每隔一段时间查一次。

 例13-17 每隔2秒钟显示一个tand池的统计信息。

# zpool iostat tank 2

capacity operations bandwidth

pool used avail read write read write

---------- ----- ----- ----- ----- ----- -----

tank 100G 20.0G 1.2M 102K 1.2M 3.45K

tank 100G 20.0G 134 0 1.34K 0

tank 100G 20.0G 94 342 1.06K 4.1M

上面命令是每隔2秒钟显示一个tank池的统计信息。结束的时候使用Ctrl+C。也可以增加一个显示的数量,比如3次:zpool iostat 2 3。

使用zpool iostat –v命令也能显示虚拟设备的I/O统计信息。

 例13-18 显示虚拟设备的I/O统计信息。

# zpool iostat –v

capacity operations bandwidth

tank used avail read write read write

---------- ----- ----- ----- ----- ----- -----

mirror 20.4G 59.6G 0 22 0 6.00K

c0t0d0 - - 1 295 11.2K 148K

c1t1d0 - - 1 299 11.2K 148K

---------- ----- ----- ----- ----- ----- -----

total 24.5K 149M 0 22 0 6.00K

当查看虚拟设备的I/O统计的时候,需要注意到可用的顶级虚拟设备的使用空间。这个空间联系着一定数量的镜像和RAID-Z虚拟设备。
3.健康状态

ZFS提供了一个完整的方法来检查存储池和虚拟设备的健康状态。存储池的健康是由组成存储池的设备的健康状况决定的。这部分描述如何查询存储池的健康。

存储池中的每个设备都会进入下面的一个状态:

 ONLINE:一般工作状态,但有时也可能发生错误。

 DEGRADED:这个设备有失败的经历。但它现在仍然可以工作。这多发生在镜像和RAID-Z中的设备失败。这个失败是可以被容忍的,但更多的设备失败一旦出现就会不可恢复。

 FAULTED:这个虚拟设备已经完全不可用,比如ZFS已经完全没有能力发送和接受新的数据。如果顶级设备处于这个状态,整个存储池就会失败。

 OFFLINE:这个虚拟设备被管理员明确地离线。

所有顶级虚拟设备的健康状况决定着存储池的健康情况。如果所有虚拟设备都在线,那么存储池就在线;如果有任何一个设备被DEGRADED,存储池就被DEGRADED;如果顶级虚拟设备失败或者离线了,那么存储池就离线了。一个存储池失败的状态是完全失败,没有数据可以读写。在被降级状态的存储池仍然可以运行,但是你不能获得相映的数据复制级或吞吐能力。

使用zpool status命令简单快速查看池的基本健康状态。

# zpool status -x

all pools are healthy

使用带有-v选项的zpool status命令可以获得详细的健康状态。

 例13-19 查询tank存储池的健康状态。

# zpool status -v tank

pool: tank

state: DEGRADED

status: One or more devices could not be opened. Sufficient replicas exist

for the pool to continue functioning in a degraded state.

action: Attach the missing device and online it using ’zpool online’.

see: http://www.sun.com/msg/ZFS-8000-2Q

scrub: none requested

config:

NAME STATE READ WRITE CKSUM

tank DEGRADED 0 0 0

mirror DEGRADED 0 0 0

c0t0d0 FAULTED 0 0 0 cannot open

c0t0d1 ONLINE 0 0 0

上面显示有一个磁盘发生了错误。通过这些信息,你能知道哪些设备出了问题,并如何修复它们。

如果存储池健康状况出了问题,可以使用下列命令对所有存储池进行详细检测。

 例13-20 对系统中所有存储池进行健康查询。

# zpool status -x

pool: tank

state: DEGRADED

status: One or more devices has been taken offline by the administrator.

Sufficient replicas exist for the pool to continue functioning in a degraded state.

action: Online the device using ’zpool online’ or replace the device with ‘zpool replace’.

scrub: none requested

config:

NAME STATE READ WRITE CKSUM

tank DEGRADED 0 0 0

mirror DEGRADED 0 0 0

c0t0d0 OFFLINE 0 0 0

c1t0d0 ONLINE 0 0 0

READ和WRITE的栏显示了设备I/O错误的数量。CKSUM栏给出了设备中无法修补的错误的数量。如果存在潜在的设备失败,就需要修复。如果有非零错误在顶级虚拟设备中,则可能有部分数据不可用。

存储池的移植

当在不同计算机之间移动存储池时,必须从一个计算机上断开存储,并重新连接到另一个计算机上。这可以通过移动物理设备或多端口的设备比如SAN来完成。

ZFS提供了存储池的移植功能,即从一个计算机上卸下存储池,并且输入到另外的一个计算机上。
1.移植前的准备

在移植存储池之前者先应将它卸下,即不能被写了,离开了系统。

如果你没有正确卸下存储池就手工将其移到其他的计算机上并安装,磁盘将丢失最后几秒中传输的数据。而原来的计算机由于设备的消失而认为池失败了。目标计算机因为池没有正确地卸下而拒绝装载。
2.卸载存储池

使用zpool export来卸载存储池。例如:

# zpool export tank

这个命令将使tank池在系统中不可见了。因为它卸载了池中的文件系统。使用-f选项,可以卸载任何不能卸载的文件系统。例如:

# zpool export tank

cannot unmount ’/export/home/eschrock’: Device busy

# zpool export -f tank

如果设备一时不能卸载下来,磁盘就有可能不能被卸载干净。在系统中没有任何工作的设备,未被卸载的设备就是“潜在活动”的设备。如果在存储池中这些设备模仿卷而被使用,就不能被卸载,甚至使用-f参数也不行。如果卸载带有卷的池,首先应确保所有的卷都不处在活动状态。
3.装载可用的存储池

一个存储池可以从系统中被卸载并装载到另外的系统上。尽管ZFS在只有部分设备可用的情况下也仍然可以运行。但前提是存储池中故障设备都必须被离线或重新装载。重新装载的设备不需要使用相同的设备名。ZFS能发现设备的移动和设备名的更改,并自用调整设置。

为了发现可用的存储池,就可以使用zpool import命令。

 例13-21 发现系统中可用的存储池。

# zpool import

pool: tank

id: 3824973938571987430916523081746329

state: ONLINE

action: The pool can be imported using its name or numeric identifier. The pool may be active on on another system, but can be imported using the ’-f’ flag.

config:

mirror ONLINE

c0t0d0 ONLINE

c0t0d1 ONLINE

从上面的例子看出,tank池可以被装载到系统上。每个池通过名字和惟一的数字标识符进行识别。

如果有多个同名的池被装载,就可以用数字标识符来区分它们。这个命令还试图显示在池中多个设备的状态信息。

 例13-22 存储池在其他系统中使用过,并且没有干净的卸载,就会输出如下的信息。

# zpool import

pool: tank

id: 3824973938571987430916523081746329

state: DEGRADED

action: This pool appears to be in use or may not have been cleanly exported. Use the ’-f’ flag to import this

pool.

see: http://www.sun.com/msg/ZFS-XXXX-13

config:

mirror ONLINE

c0t0d0 ONLINE

c0t0d1 ONLINE

与zpool status命令类似,zpool import命令要求管理人员查看在网站上的知识体系和最新的修复方法。用户也可以选择强制将存储池卸下。

 例13-23 如果存储池中有物理盘损坏的情况,则会输出如下的信息。

# zpool import

pool: tank

id: 3824973938571987430916523081746329

action: DEGRADED

desc: This pool can be imported despite missing some

devices. The fault tolerance of the pool may

be compromised.

see: http://www.sun.com/msg/ZFS-XXXX-12

config:

mirror DEGRADED

c0t0d0 ONLINE

c0t0d1 FAULTED

在上面的例子中,第二块盘坏了,因为有镜像,所以仍然能装载池。如果有多块盘被损坏的情况下,池就不能被装载了。

 例13-24 存储池被损坏时输出信息。

# zpool import

pool: dozer

id: 129384759861034862594739890875563

state: FAULTED

action: This pool cannot be imported because the necessary

devices are missing or damaged. Attach the

unavailable devices and try again.

see: http://www.sun.com/msg/ZFS-XXXX-11

config:

raidz FAULTED

c0t0d0 ONLINE

c0t0d1 FAULTED

c0t0d2 ONLINE

c0t0d3 FAULTED

有两块RAID-Z的磁盘坏了。这意味着没有足够的拷贝来重新构件池。ZFS不知道池的其他部分的设备信息,也就意味着这个存储池损坏了。
4.装载不在默认路径下的存储池设备

在默认情况下,zpool import命令只在/dev/dsk/目录中查找存储池设备。如果设备在其他目录,则可以使用-d选项指定路径来查找。

 例13-25 在/file路径下装载存储池设备。

(1)先创建一个由两个文件构成虚拟设备的存储池。

# zpool create dozer /file/a /file/b

(2)卸载后再装载,就找不要原来设备的路径。

# zpool export dozer

# zpool import

no pools available

(3)使用-d选项指明路径:

# zpool import -d /file

pool: dozer

id: 672153753596386982

state: ONLINE

action: The pool can be imported using its name or numeric identifier.

config:

dozer ONLINE

/file/a ONLINE

/file/b ONLINE

# zpool import -d /file dozer

论坛徽章:
0
12 [报告]
发表于 2008-04-10 15:46 |只看该作者

管理ZFS

本节详细地介绍如何管理ZFS,包括对文件系统的层次的概念、特性和安装点的管理,以及文件系统的共享。

ZFS文件系统是个建设在存储池上的轻量级的POSIX文件系统。它能在还没有分配的空间上轻易地建立和删除。因为文件系统是轻量级的,同时也是ZFS管理的核心,管理员就可以创建很多文件系统。

ZFS文件系统通过zfs命令进行管理。这个zfs命令提供一些子命令来执行一些文件系统的专门操作,比如快照、卷和克隆。

创建和删除文件系统

用zfs create命令来创建文件系统,用zfs destroy命令来删除文件系统。
1.创建文件系统

zfs create加被创建的文件系统的名字,即可创建文件系统。文件系统名字是从池名开始的路径名:pool_name/[filesystem_name/]filesystem_name。池名和初始化后的文件系统名是鉴别新的文件系统被创建后的层次位置。所有的中间层次的文件系统名必须已经在池中存在了。在路径中的最后的名字,是新的被创建的文件系统的名字。这个文件系统的名字必须符合命名规范。

 例13-26 在tank/home后创建一个名为bonwick的新的文件系统。

#zfs create tank/home/bonwick

当创建成功后,ZFS自动安装新的文件系统,并用默认路径名作为文件系统的名字。本例中,新的文件系统被mount到/tank/home/bonwick。
2.删除文件系统

使用zfs destroy命令删除文件系统。被删除的文件系统将自动地卸载和取消共享。

#zfs destroy tank/home/tabriz

如果文件系统忙,就不能被删除,可以使用参数-f强制删除,这时将导致强制卸载、取消共享和删除数据,可能会造成应用程序的不可预知的行为。

 例13-27 强制删除文件系统。

# zfs destroy tank/home/ahrens

cannot unmount ’tank/home/ahrens’: Device busy

# zfs destroy -f tank/home/ahrens

如果文件系统有子层,则zfs destroy命令将执行失败。如果要将强制递归所有子文件系统都删除,就依靠-r参数,但这样连快照也被删除了,使用的时候需要非常小心。

 例13-28 强制删除所有子文件系统。

# zfs destroy tank/ws

cannot destroy ’tank/ws’: filesystem has children

use ’-r’ to destroy the following datasets:

tank/ws/billm

tank/ws/bonwick

tank/ws/maybee

# zfs destroy -r tank/ws

如果文件系统有间接的依赖关系,则使用递归删除命令也要失败了。要想强制删除具有依赖关系的文件系统,请使用-R参数。

 例13-29 强制删除具有依赖关系的文件系统。

# zfs destroy -r tank/home/schrock

cannot destroy ’tank/home/schrock’: filesystem has dependant clones

use ’-R’ to destroy the following datasets:

tank/clones/schrock-clone

# zfs destroy -R tank/home/schrock
3.文件系统的改名

文件系统可以用zfs rename命令来改变文件系统的名字或文件系统在ZFS层中的位置。

 例13-30 改变文件系统的名字。

# zfs rename tank/home/kustarz tank/home/kustarz_old

 例13-31 改变文件系统的位置。

# zfs rename tank/home/maybe tank/ws/maybe

当改变文件系统的位置时,新的位置必须和原来的系统都在相同的存储池,并且有用来安装文件系统的足够空间。

如果新的位置没有足够的空间,可能导致达到限额,使得改变名字的失败。

在给文件系统改名的过程中,将试图卸载文件系统,然后再重新装载文件系统和子代文件系统。如果不能完成卸载文件系统的活动,改变名字就要失败。这时将需要手工强制卸载文件系统。

文件系统的属性

属性是用来控制文件系统行为的主要机制。除非特别指出,本节所讲的属性就指卷、快照和克隆等数据集的特性。

属性分为只读的统计属性和可调整的属性。很多可调整的属性是分层次的,比如设置了父级文件系统的属性,子级的文件系统也会具有这些属性。

所有层的属性中都有来源这一项。来源是指属性是如何获得的。它可能有下列的值。

 Local:本地来源是指使用zfs set命令设置的数据集属性。

 inherited from dataset-name:从dataset-name中继承的属性。

 default:这个属性既不是继承的也不是设置的,而是默认的。
1.只读的属性

在文件系统的属性中,只读的属性不能被设置,也不能被继承。有些属性是数据集的特殊类型。

 available:数据集中可以利用的空间。因为所有文件系统共用存储池,所以数据集可能被一些因素限制,比如池的物理的大小、限额、保留和存储池中其他数据的大小等。

 Creation:数据集被创建的日期和时间。

 Mounted:当前文件系统是被mount上的。

 Origin:只是对于clone的属性。Clone存在时,源不能被删除。

 Compressratio:压缩比例。

 Referenced:数据集所占有的空间大小,这个空间是不被数据池中其他数据集分享的。当快照或克隆被创建时,它们的初始大小与被创建的文件系统和快照的大小相同,并且内容相同。

 Type:数据集的数据类型为文件系统、卷或快照。

 Used:数据集中的数据所消耗的空间和数据集子级文件系统所消耗的空间。这个值是不包括保留的数值,但是包括它的子级文件系统保留的数值。父级文件系统所消耗的空间和取消子级文件系统后的自由空间都比现在的文件系统使用和保留的空间要大。当快照创建后,空间最初被快照和文件系统共享,当然可能还有以前的快照。
2.可变的属性

在文件系统的属性中,通过zfs set命令可以设定属性和属性值。除了限额和保留,设定的属性都是可以继承的。

有些设定的属性是数据集的专门类型。下面就写出各种专门的属性的类型,如果没有专门的提及,属性将应用到所有的数据集类型:文件系统、卷、克隆和快照。

 atime:是指当进行读操作的时候控制文件被更新时的时间,关闭这个属性可以在读文件时避免产生写的通信,并且使性能获得提高,尽管这样可能导致邮件和其他类似的工具出现混乱。

 checksum:用来校验数据的完整性。这个值是自动选择的算法。值为off将对用户数据关闭完全检测,这是不被推荐的。

 compression:控制这个数据集的压缩算法。值是自动选择的压缩算法。目前系统只有一个压缩算法lzjb。以后可能会增加压缩算法。

 devices:控制在文件系统内的设备节点是否能被打开。

 exec:控制程序和文件系统是否被允许运行。

 mountpoint:控制这个文件系统的安装点,当文件系统的安装点被改变后,文件系统和子层的安装点都被卸载。如果新的值为legacy,将保留卸载,否则,如果此属性的以前的值是legacy或none,系统将自动地重新安装到新的位置,或在改变属性之后被安装。另外,共享的文件系统将取消共享后,并共享到新的位置。

 quota:数据集和派生所消耗的空间综合的限制。这个限制包括所有的空间消耗,包括文件系统和快照。设置的限额不能超过其祖先的限额,但可以利用额外的限度。

 readonly:控制数据集是否可以被修改的开关。On表明可以被修改。

 recordsize:专门是用来建议在文件系统中文件的数据块的大小的。ZFS依据内部的优化算法自动调整块的大小。如果数据库需要非常大的文件但是使用很小的块,就不合适了。所以指定recordsize要大于或等于导致数据库高性能的数据块的大小。使用这个属性对于文件系统来说是非常有用的。这个数值必须要大于等于512字节或小于等于128KB。改变文件系统的recordsize后,只对在这之后创建的文件才起作用,存在的文件系统不受影响。

 reservation:保证数据集和派生的数据需要的最小空间的大小。当空间的大小低于这个数值时,数据集就占据这个空间作为保留。保留的理由是为了使用父数据集,并且依据父数据集的限额保留。

 sharenfs:控制是否进行NFS共享。

 setuid:设置setuid。

 snapdir:控制root用户是否可以看见zfs文件。

 volsize:卷的逻辑大小。默认情况下,创建卷的大小和保留的大小一致。任何改变volsize都将视同改变保留。比起数据的损坏大小来说,卷只包含很小的空间,依赖我们如何使用这个卷。当调整这个卷的时候我们需要小心行事。

尽管不推荐这样做,你也可以创建备用的卷,使用zfs create –V。备份卷和卷一样的定义,但它不等同于卷的大小。对于备份卷,改变volsize的大小不涉及保留的大小。

 volblocksize:卷的块设备的大小。当卷创建后,这个值就不能被改变。默认的块大小是8KB,任何从512KB到128KB都是可用的。

 zoned:指这个数据集是否被添加到非全局区域。如果是这样的话,安装点就不在全局区域。当区域第一次添加时,可以设置任何的文件系统。

查看文件系统信息

可使用zfs list命令来查看和询问数据集的信息。本节的主要内容是如何查询文件系统的信息。
1.列出文件系统的基本信息

可以使用zfs list命令查询文件系统的基本信息。它将显示所有数据集的名字及其的使用情况。

 例13-32 列出文件系统的基本信息。

# zfs list

NAME USED AVAIL REFER MOUNTPOINT

pool 84.0K 33.5G - /pool

pool/clone 0 33.5G 8.50K /pool/clone

pool/test 8K 33.5G 8K /test

pool/home 17.5K 33.5G 9.00K /pool/home

pool/home/marks 8.50K 33.5G 8.50K /pool/home/marks

pool/home/marks@snap 0 - 8.50K /pool/home/marks@snap

zfs list能显示专门的数据集。使用-r属性能递归显示所有依赖于这个数据集的信息。

 例13-33 显示某一文件系统下的所有数据集。

# zfs list -r tank/home/chua

NAME USED AVAIL REFER MOUNTPOINT

tank/home/chua 26.0K 4.81G 10.0K /tank/home/chua

tank/home/chua/projects 16K 4.81G 9.0K /tank/home/chua/projects

tank/home/chua/projects/fs1 8K 4.81G 8K /tank/home/chua/projects/fs1

tank/home/chua/projects/fs2 8K 4.81G 8K /tank/home/chua/projects/fs2
2.对文件系统进行复杂的查询

使用-o,-f,-H能进行复杂的查询。具体描述如下:

 -o选项能使定制的属性显示出来,也可以使用逗号来分割这些属性;

 -t选项能查询专门的数据集的属性;

数据集有以下这些类型。

 文件系统:显示文件系统和克隆数据集。

 卷:显示卷数据集。

 快照:显示快照数据集。

 -H选项是用来忽略zfs list命令的输出的头部信息。

 例13-34 显示文件系统特定的属性选项。

# zfs list -o name,sharenfs,mountpoint

NAME SHARENFS MOUNTPOINT

tank rw /export

tank/archives rw /export/archives

tank/archives/zfs rw /export/archives/zfs

tank/calendar off /var/spool/calendar

tank/cores rw /cores

tank/dumps rw /export/dumps

tank/home rw /export/home

tank/home/ahl rw /export/home/ahl

tank/home/ahrens rw /export/home/ahrens

tank/home/andrei rw /export/home/andrei

tank/home/barts rw /export/home/barts

tank/home/billm rw /export/home/billm

tank/home/bjw rw /export/home/bjw

tank/home/bmc rw /export/home/bmc

tank/home/bonwick rw /export/home/bonwick

 例13-35 显示特定的数据集的属性,显示这些属性时也可以用逗号来分割它们。

# zfs list -t filesystem -o name,used

NAME USED

pool 105K

pool/container 0

pool/home 26.0K

pool/home/tabriz 26.0K

pool/home/tabriz_clone 0

 例13-36 使用–H选项忽略头部的输出。

# zfs list -H -o name

pool

pool/container

pool/home

pool/home/tabriz

pool/home/tabriz@now

pool/home/tabriz/container

pool/home/tabriz/container/fs1

pool/home/tabriz/container/fs2

pool/home/tabriz_clone

管理属性

本节介绍管理数据集的属性。主要使用set、inherit和get等子命令来管理这些属性。
1.设置属性

zfs set命令可以设置或修改数据集的属性。

 例13-37 在/tank/home上设置atime属性为off。

# zfs set atime=off tank/home

设置数字属性的时候可以使用下面任何一种方式。

# zfs set quota=50G tank/home/marks

# zfs set quota=50g tank/home/marks

# zfs set quota=50GB tank/home/marks

# zfs set quota=50gb tank/home/marks
2.继承的属性

除了限额和保留的属性可以明确设定之外,其他属性都可以从父级继承过来。这个zfs inherit命令将清除所有自己设置的属性,并从上一级中继承属性。

 例13-38 继承属性。

(1)使用zfs set命令设置compression属性:

# zfs set compression=on tank/home/bonwick

# zfs get -r compression tank

NAME PROPERTY VALUE SOURCE

tank compression off default

tank/home compression off default

tank/home/bonwick compression on local

(2)使用inherit子命令继承父级的compression属性:

# zfs inherit compression tank/home/bonwick

(3)查看各级文件系统的compression属性:

# zfs get -r compression tank

NAME PROPERTY VALUE SOURCE

tank compression off default

tank/home compression off default

tank/home/bonwick compression off default

最后,我们看到tank/home/bonwick文件系统的compression的属性已经不是所设置的on属性了,而是从父级文件系统中继承了off属性。使用zfs inherit –r命令,-r参数能使所有子级的数据集继承属性。
3.查询属性

简单的查询方法是使用zfs list命令。但zfs get命令能得到更为详细的信息。

下面使用zfs get得到一个专门的属性。

 例13-39 查询tank/ws文件系统的checksum属性情况。

# zfs get checksum tank/ws

NAME PROPERTY VALUE SOURCE

tank/ws checksum on default

在上面例子的SOURCE属性中,指明了checksum属性是如何设置的。
default--这个从来没有被人为设置过,属性值是最初的默认值
inherited from dataset_name--属性是从名为dataset_name数据集中继承来的
local--属性是在本数据集中使用zfs set命令设置的
Temporary--属性是由zfs mount –o命令所设置的,它只有在mount上时才有效
-(none)--这是个只读的属性,它的值是由ZFS产生的

 例13-40 在名为pool数据集中,使用all选项可以找到所有数据集的属性。

# zfs get all pool

NAME PROPERTY VALUE SOURCE

pool type filesystem -

pool creation Sat Nov 12 11:41 2005 -

pool used 32K -

pool available 33.5G -

pool referenced 8K -

pool compressratio 1.00x -

pool mounted yes -

pool quota none default

pool reservation none default

pool recordsize 128K default

pool mountpoint /pool default

pool sharenfs off default

pool checksum on default

pool compression on local

pool atime on default

pool devices on default

pool exec on default

pool setuid on default

pool readonly off default

pool zoned off default

pool snapdir visible default

pool aclmode groupmask default

pool aclinherit secure default

在数据集中,使用-s选项能显示source的值。

 例13-41 在名为pool数据集中,使用-s选项显示source的值为local的属性。

# zfs get -s local all pool

NAME PROPERTY VALUE SOURCE

pool compression on local

 例13-42 使用-r选项能得到专门的数据集的所有子系统的属性。

# zfs get -r -s temporary all tank

NAME PROPERTY VALUE SOURCE

tank/home atime off temporary

tank/home/bonwick atime off temporary

tank/home/marks atime off temporary
4.使用脚本查询属性

zfs get有-H和-o的选项。这些选项是通过脚本设计的。-H是指忽略任何头部的信息。-o选项上用来定制输出。

 例13-43 得到compression的value值。

# zfs get -H -o value compression tank/home

on

 例13-44 使用-r选项可以查询递归子代的属性。

# zfs get -H -o name,value -r used export/home

export/home 5.57G

export/home/marks 1.43G

export/home/maybee 2.15G

安装和共享文件系统

本节描述如何在ZFS中安装和共享文件系统。
1.管理安装点

在默认情况下,所有ZFS文件系统在系统启动时被服务svs://system/filesystem/local所自动安装(mount)。ZFS文件系统被安装到一个目录(比如/tank)下,这个目录默认地也是文件系统的名字。

可以使用zfs set命令来改变默认安装点的属性。ZFS可以自动创建安装点,如果需要的话,可以使用zfs mount –a 命令安装文件系统,而不能使用/etc/vfstab。

mountpoint的属性也是可以继承的。比如,如果pool/home有个安装点在/export/stuff,这个pool/nome/user就继承了/export/stuff/user作为安装点。

我们也可以将mountpoint的属性设置为none来防止文件系统被安装上。

为了防止ZFS自动安装和管理文件系统,文件系统也能通过Legacy来设置安装点属性。Legacy工具包括mont和umount命令,并且/etc/vfstab文件必须被替换。

(1)自动安装点。

 如果mountpoint属性不是legacy或none,ZFS就能自动安装这个文件系统。

 如果ZFS管理文件系统,但当前是在卸载状态,这个时候安装点属性被改变,文件系统将保留着卸载状态。

根的数据集的默认安装点能在创建时使用zpool create’s –m指定目录。

任何创建的安装点都不是被继承的而是通过ZFS管理的。

 例13-45 pool/filesystem的自动安装点。

先创建pool/filesystem文件系统:

# zfs create pool/filesystem

得到安装点的属性值:

# zfs get mountpoint pool/filesystem

NAME PROPERTY VALUE SOURCE

pool/filesystem mountpoint /pool/filesystem default

最后,查看这个文件系统是否被自动安装上:

# zfs get mounted pool/filesystem

NAME PROPERTY VALUE SOURCE

pool/filesystem mounted yes –

当然,我们也可以通过自己的设置来设定安装点属性。

 例13-46 手工改变安装点。

改变安装点:

# zfs set mountpoint=/mnt pool/filesystem

查看安装点:

# zfs get mountpoint pool/filesystem

NAME PROPERTY VALUE SOURCE

pool/filesystem mountpoint /mnt local

查看是否已经安装:

# zfs get mounted pool/filesystem

NAME PROPERTY VALUE SOURCE

pool/filesystem mounted yes –

从上面的例子可以看出,当安装点属性被更改后,文件系统能自动从旧的安装点卸载并且重新安装到新的安装点,但安装点的目录是需要被创建的。如果文件系统处于活动状态时就不能被卸载,错误的报告就会产生,并且可能需要手工卸载了。

(2)遗留的(legacy)安装点。

可以使用legacy工具来设定安装点的属性。遗留的文件系统的管理必须通过mount 和umount命令和/etc/vfstab文件来管理。当系统启动的时候,ZFS不能自动安装遗留的文件系统,并且ZFS的安装和卸载工具也不能管理数据集的这种形态。下面这个例子显示如何设置管理在遗留模式下的ZFS数据集。

 例13-47 设置管理在遗留模式下的ZFS数据集。

# zfs set mountpoint=legacy tank/home/eschrock

# mount -F zfs tank/home/eschrock /mnt

在特殊的情况下,如果你要创建ZFS的/var和/usr文件系统,就需要指明遗留文件系统并且在/etc/vfstab文件中指明安装点。并且,在系统启动时,system/filesystem/local服务要进入维护模式。

要想自动安装遗留的文件系统,必须在/etc/vfstab文件中设置,下面就是个例子:

#device device mount FS fsck mount mount

#to mount to fsck point type pass at boot options

#

tank/home/eschrock - /mnt zfs - yes –

注意fsck pass的属性为“-”,这说明fsck命令不能在ZFS文件系统中应用。
2.安装文件系统

一般情况下,ZFS能在创建或启动的时候自动mount文件系统。只有在改变安装属性或安装和卸载文件系统时才需要使用zfs mount命令。

zfs mount命令不加变量将显示当前被ZFS管理的文件系统的安装点,但遗留的文件系统没有被列出。

 例13-48 显示存储池中文件系统的安装点。

# zfs mount

tank /tank

tank/home /tank/home

tank/home/bonwick /tank/home/bonwick

tank/ws /tank/ws

使用-a选项可以mount所有被ZFS管理的文件系统,但不能mount遗留的文件系统。

#zfs mount –a

在默认情况下,ZFS不允许在顶级非空的目录中安装文件系统。如果强制在顶级非空目录安装文件系统必须使用-O选项。

 例13-49 在顶级非空目录中安装文件系统。

# zfs mount tank/home/alt

cannot mount ’/export/home/alt’: directory is not empty

use legacy mountpoint to allow this behavior, or use the -O flag

# zfs mount -O tank/home/alt

遗留的文件系统必须通过遗留的工具来管理,试图使用ZFS管理将导致错误的发生。

 例13-50 安装遗留的文件系统。

# zfs mount pool/home/billm

cannot mount ’pool/home/billm’: legacy mountpoint

use mount(1M) to mount this filesystem

# mount -F zfs tank/home/billm

When a filesystem is mounted, it uses a set of mount options based on the property

values associated with the dataset. The correlation between properties and mount

options is as follows:

当文件系统被安装后,基于数据集的属性就会相应地产生安装属性
devices--devices/nodevices
exec--exec/noexec
readonly--ro/rw
setuid--setuid/nosetuid

3.临时安装属性

如果在mount时使用了-o选项,那么所关联的属性都将是临时的。当被卸载后都将恢复原状。如果临时改变了这些属性的值,改变将立即生效。

 例13-51 临时设置tank/home/perrin为只读属性。

# zfs mount -o ro tank/home/perrin

 例13-52 在重新安装文件系统的时候临时将atime的属性值设为off。

# zfs mount -o remount,noatime tank/home/perrin

# zfs get atime tank/home/perrin

NAME PROPERTY VALUE SOURCE

tank/home/perrin atime off temporary
4.卸载文件系统

卸载文件系统有两种方法,即使用zfs umount命令,后面接文件系统的名字,或者文件的安装点。

 例13-53 通过文件系统名来卸载文件系统。

# zfs unmount tank/home/tabriz

 例13-54 通过安装点来卸载文件系统。

# zfs unmount /export/home/tabriz

如果卸载失败后,可以使用-f选项来强制卸载,不过使用这个命令因可能导致应用程序不可知的后果,所以要格外小心。

# zfs unmount tank/home/eschrock

cannot unmount ’/export/home/eschrock’: Device busy

zfs unmount -f tank/home/eschrock

为了提供向后兼容,卸载文件系统的工具umount也可以卸载ZFS文件系统。

 例13-55 使用umount命令卸载文件系统。

# umount /export/home/bob
5.共享ZFS文件系统

通过设定sharefs属性,ZFS能自动共享文件系统。使用这个方法,管理员不需要修改/etc/dfs/dfstab文件。

(1)控制共享。

在默认情况下,文件系统是不共享的,共享新的文件系统,使用下列命令:

# zfs set sharenfs=on tank/home./eschrock

这个共享的属性是可以继承的。

# zfs set sharenfs=on tank/home

# zfs create tank/home/bricker

# zfs create tank/home/tabriz

# zfs set sharenfs=ro tank/home/tabriz

这两个文件系统都是共享读和写的,最后一行将tank/home/tabriz改为只读。

不共享一个文件系统:

# zfs unshare tank/home/tabriz

不共享所有的文件系统:

# zfs unshare –a

共享一个文件系统:

# zfs share tank/home/tabriz

共享所有的文件系统:

# zfs share –a

(2)遗留的共享。

如果sharenfs属性是off,ZFS不试图共享文件系统。这就允许管理者通过/etc/dfs/dfstab进行文件管理。

传统的share和unshare命令仍然能在ZFS文件系统中使用。这意味着可以选择不同的方法来管理文件系统的共享。

限额和保留

ZFS支持文件系统级的限额和保留。文件系统的属性提供使用quota来限制文件系统使用的限额,并同时通过保留来保证一定的空间是可以使用的。这些属性都能应用到所有的子数据集中。

如果在tank/home数据集中设置了限额,tank/home和它的子级都不能超过这个限额。类似地,如果tank/home是保留的,tank/home和所有子级都有保留。数据集使用的空间反映使用的属性。
1.设置限额

使用空间的限额可以被zfs set和zfs get命令设置。

 例13-56 在tank/home/bonwick设置10GB的限额。

# zfs set quota=10G tank/home/bonwick

# zfs get quota tank/home/bonwick

NAME PROPERTY VALUE SOURCE

tank/home/bonwick quota 10.0G local

使用zfs list查看结果:

# zfs list

NAME USED AVAIL REFER MOUNTPOINT

tank/home 16.5K 33.5G 8.50K /export/home

tank/home/bonwick 15.0K 10.0G 8.50K /export/home/bonwick

tank/home/bonwick/ws 6.50K 10.0G 8.50K /export/home/bonwick/ws

使用df命令查看结果:

# df -h /export/home/bonwick

Filesystem size used avail capacity Mounted on

tank/home/bonwick 10G 8K 10G 1% /export/home/bonwick

尽管tank/home有33.5GB的空间,但tank/home/bonwick被设定了10GB的限额。

在设定限额的时候,我们不能设定比当前使用空间还少的限额:

# zfs set quota=10G tank/home/bonwick

cannot set quota for ’tank/home/bonwick’: size is less than current used or

reserved space
2.设置保留空间

ZFS的保留空间是为了能从存储池中确保分配到可用的空间。因此,如果没有当前可以使用的空间,就不能设定保留空间。

ZFS保留空间可以通过zfs set和zfs get命令来完成分配。

 例13-57 设定保留空间。

# zfs set reservation=5G tank/home/moore

查看保留属性:

# zfs get reservation tank/home/moore

NAME PROPERTY VALUE SOURCE

tank/home/moore reservation 5.00G local

也可以使用zfs list查看保留空间:

# zfs list

NAME USED AVAIL REFER MOUNTPOINT

tank/home 5.00G 33.5G 8.50K /export/home

tank/home/moore 15.0K 10.0G 8.50K /export/home/moore

从上面可以看出,尽管tank/home和子系统使用的空间可能比5GB小,但tank/home仍然显示使用了5GB,说明这是为tank/home/moore保留的。

子级文件系统的保留空间计入父级文件系统的使用空间。

 例13-58 保留空间不能大于限额。

# zfs set quota=5G pool/filesystem

# zfs set reservation=10G pool/filesysetm/user1

cannot set reservation for ’pool/filesystem/user1’: size is greater than available space

上面的例子说明:保留空间不能大于限额。


 例13-59 保留空间不是累计的。

# zfs set reservation=10G tank/home/moore

# zfs set reservation=5G tank/home/moore

# zfs get reservation tank/home/moore

NAME PROPERTY VALUE SOURCE

tank/home/moore reservation 5.00G local

上面的例子说明:保留空间不是累计的,是被替换的。

文件系统的备份和恢复

通过zfs backup或zfs restore命令,可以备份ZFS文件系统的快照或原始文件系统。

ZFS备份和恢复解决方案提供了以下内容:

 创建ZFS快照或增量的快照。

 通过移动备份后,进行数据恢复。
1.备份ZFS快照

下面的命令使用zfs backup命令备份快照。

 例13-60 备份快照。

# zfs backup tank/dana@111505 > /dev/rmt/0

 例13-61 增量备份。

# zfs backup -i tank/dana@111505 tank/dana@now > /dev/rmt/0
2.恢复ZFS快照

 例13-62 恢复ZFS快照。

备份ZFS快照:

# zfs backup tank/gozer@111105 > /dev/rmt/0

然后,将备份恢复成另外的tank/gozer2@today名字:

# zfs restore tank/gozer2@today < /dev/rmt/0

第三,将原来的文件系统改为tank/gozer.old,再将tank/gozer2@today恢复成原来文件系统的名字:

# zfs rename tank/gozer tank/gozer.old

# zfs rename tank/gozer2 tank/gozer

论坛徽章:
0
13 [报告]
发表于 2008-04-10 16:33 |只看该作者

ZFS文件系统的快照和克隆

本节介绍如何创建、管理快照和克隆。

ZFS文件系统的快照

快照是文件系统和卷的只读的拷贝。
1.创建和删除ZFS快照

我们使用zfs snapshot命令来创建快照,这个命令只有一个变量就是快照的名字。快照名字如下所示:

filesystem@snapname

volume@snapname

 例13-63 创建名为Friday的快照。

# zfs snapshot tank/home/ahrens@Friday

快照不能被修改属性,也不能使数据集的属性应用到快照上。

 例13-64 不能给快照设置属性。

# zfs set compression=on pool/home/ahrens@tuesday

cannot set compression property for ’pool/home/ahrens@tuesday’: snapshot

properties cannot be modified

请使用zfs destroy命令删除快照。

 例13-65 删除快照。

# zfs destroy tank/home/ahrens@Friday

在快照存在的情况下,数据集不能被删除。

 例13-66 删除存在快照的数据集。

# zfs destroy pool/home/ahrens

cannot destroy ’pool/home/ahrens’: filesystem has children

use ’-r’ to destroy the following datasets:

pool/home/ahrens@tuesday

pool/home/ahrens@wednesday

pool/home/ahrens@Thursday

另外,如果存在快照的克隆,也不能删除数据集。

可以使用zfs rename命令,给快照改名字。

 例13-67 将cindys快照的名字改为today。

# zfs rename tank/home/cindys@111205 pool/home/cindys@today

下面给快照改名字的操作是不被支持的。

 例13-68 给快照改名字的错误操作。

# zfs rename tank/home/cindys@111205 pool/home/cindys@saturday

cannot rename to ’pool/home/cindys@today’: snapshots must be part of same

dataset

上面的例子说明,给快照改名字的时候不能改变快照的数据集。
2.显示和访问ZFS快照

我们可以在文件系统的目录中找到文件系统的快照。比如,文件系统tank/home/ahrens安装在/home/ahrens目录,而tank/home/ahrens@friday的快照就在相应的/home/ahrens/.zfs /snapshot/目录中。可以使用ls命令进行查看:

# ls /home/ahrens/.zfs/snapshot

tuesday wednesday thursday Friday

到目前为止,.zfs/snapshot/目录还只能被本地或NFS的第4版所访问。其他的NFS版本目前还不支持。

快照也可以使用下面的方法进行显示:

# zfs list -t snapshot

NAME USED AVAIL REFER MOUNTPOINT

pool/home/ahrens@tuesday 13.3M - 2.13G -
3.恢复到最初的快照

使用zfs rollback命令能使快照放弃所有的改变,恢复到建立快照的最初状态。如果有些最近的快照的话,使用­-r选项能强制删除这些快照,而恢复到最初的快照。

 例13-69 恢复pool/home/ahrens文件系统的星期二的快照。

# zfs rollback pool/home/ahrens@tuesday

cannot rollback to ’pool/home/ahrens@tuesday’: more recent snapshots exist

use ’-r’ to force deletion of the following snapshots:

pool/home/ahrens@wednesday

pool/home/ahrens@thursday

# zfs rollback -r pool/home/ahrens@tuesday

ZFS文件系统的克隆

克隆是一种与文件系统或卷的内容相同,但另外的一个数据集的形态。与快照一样,创建克隆是很快的,而且不需要消耗空间的。

可以创建快照的克隆,这样克隆就依赖快照的存在而存在。你不能在有这个快照的克隆的情况下删除此快照。
1.创建克隆

使用zfs clone命令来创建克隆。克隆是新的文件系统或卷,它将被放入ZFS文件系统的层中。

 例13-70 创建和pool/ws/gate@yesterday快照内容相同的名为pool/home/ahrens/ bug123的克隆。

# zfs clone pool/ws/gate@yesterday pool/home/ahrens/bug123
2.删除克隆

可以使用zfs destroy命令来删除克隆,在生成克隆的快照删除前,必须首先要删除克隆。

 例13-71 删除克隆。

# zfs destroy pool/home/ahrens/bug123

论坛徽章:
0
14 [报告]
发表于 2008-04-10 17:16 |只看该作者
很好很详细,蝴蝶辛苦了!

论坛徽章:
0
15 [报告]
发表于 2008-04-21 17:04 |只看该作者
要学习的东西还很多啊。

论坛徽章:
0
16 [报告]
发表于 2008-08-03 09:35 |只看该作者
很好很详细,蝴蝶辛苦了!
非常感谢

[ 本帖最后由 vansnvas 于 2008-8-3 09:37 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2008-10-18 09:55 |只看该作者
先留个名,慢慢再看。

论坛徽章:
0
18 [报告]
发表于 2008-10-21 13:49 |只看该作者
很好很详细,蝴蝶辛苦了!

论坛徽章:
0
19 [报告]
发表于 2008-10-21 18:04 |只看该作者
好长,也好强,楼主辛苦了,留个MARK以后慢慢学习。

论坛徽章:
0
20 [报告]
发表于 2010-11-28 10:11 |只看该作者
内容真全,我自己copy下来了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP