本节详细地描述了如何创建和管理存储池。
虚拟设备
在创建存储池之前,你必须先理解虚拟设备这一基本概念。每个存储池都是由一个或多个虚拟设备组成的,这些虚拟设备描述物理设备的分层特性和全部特性。
这些虚拟设备包括:
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