免费注册 查看新帖 |

Chinaunix

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

【申请加精】来自UC的《Solaris 10红宝书》系列在线课程 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2008-04-14 13:51 |只看该作者
12.2.7 UFS文件系统的快照
在12.2.6节中我们介绍了UFS备份和恢复的方法,读者可能已经发现,使用ufsdump备份的时候总需要进入单用户模式,这对于时刻提供服务的主机来说是非常不方便的。下面我们介绍的文件系统快照(Snapshot)就能解决这个问题,它可以在多用户的情况下,让我们进行文件系统备份。

首先,我们来介绍一下快照是什么?

快照(Snapshot)是文件系统的暂存瞬间映像,主要用于备份操作。我们使用fssnap命令会创建一个虚拟设备和一个后备存储文件。这个虚拟设备不论看起来或实际运行都像真实的设备。后备存储文件是位映射文件,该文件中包含进行快照之前的数据的备份。

我们建立快照(Snapshot)就是为了在多用户的情况下备份这个虚拟设备,以便在故障发生之后进行系统恢复。

1.创建和删除UFS快照(Snapshot)
创建UFS快照(Snapshot)

在创建UFS快照(Snapshot)之前,我们必须注意几个问题:

 注意存放后备存储文件的空间要足够大。如果不够大,创建工作就会失败,查看日志就可以发现失败原因;

 最好有个专门的目录来存储后备存储文件;

 你不能在一个文件系统上做这个文件系统的部分目录的UFS快照(Snapshot)。

对于最后一点注意事项,需要解释一下。

如果硬盘空间分配如下:

# df -k /usr

Filesystem kbytes used avail capacity Mounted on

/dev/dsk/c0t0d0s0 3618177 2190002 1391994 62% /

说明/usr与/在一个硬盘分区。当你试图去建立/usr目录的快照时就会出现下列情况:

# fssnap -F ufs -o bs=/snaps/usr.back.file /usr

snapshot error: Invalid backing file path

这个信息告诉我们不能在同一个文件系统上建立这个文件系统的快照。

下面是我们创建UFS快照(Snapshot)的步骤:

(1)成为超级用户或授权角色用户;

(2)使用df-k命令确定有足够的备份空间;

(3)确保目录的后备存储文件名是惟一的;

(4)使用下面命令创建UFS快照(snapshot)。

# fssnap -F ufs -o bs=/backing-store-file /file-system

注意:后备存储文件的快照要位于不同的文件系统。

(5)使用下面的命令来验证快照是否成功创立。

# /usr/lib/fs/ufs/fssnap -i /file-system

 例12-5 创建UFS快照。

创建/usr目录快照:

# fssnap -F ufs -o bs=/var/tmp/usr.back.file /usr

/dev/fssnap/1

下面命令是限定后备存储文件的大小为500MB。

# fssnap -F ufs -o maxsize=500m,bs=/var/tmp/usr.back/usr

/dev/fssnap/1

使用下列命令来显示快照信息:

# /usr/lib/fs/ufs/fssnap -i

Snapshot number : 1

Block Device : /dev/fssnap/1

Raw Device : /dev/rfssnap/1

Mount point : /usr

Device state : idle

Backing store path : /var/tmp/ usr.back.file

Backing store size : 0 KB

Maximum backing store size : Unlimited

Snapshot create time : Thu Jul 01 14:50:38 2004

Copy-on-write granularity : 32 KB

删除UFS快照(Snapshot)

删除UFS快照有两种方法,如果在建立快照时使用了unlink参数,那么可以使用fssnap-d命令将快照和后备存储文件一同删除;如果建立快照时没有使用unlink参数,这个fssnap-d命令只能删除快照,至于后备存储文件还要用rm命令删除。

下面命令是使用unlink参数创建快照的方法:

#fssnap -F ufs -o bs=/var/usr.snap,unlink /usr

删除:

#fssnap -d /usr

Deleted snapshot 1.

如果没有使用unlink参数,接下来还有一步:

#rm usr.snap

2.备份和恢复UFS快照(Snapshot)
备份UFS快照(Snapshot)

创建完快照后,可以用任何标准的Solaris备份命令来备份这个快照。因为这个快照虽然是个只读的虚拟设备,但你可以像对待真正的设备一样备份它。

如果使用ufsdump来备份快照,我们既可以在创建完快照再备份,也可以在创建快照的同时来备份。

下面我们分别进行介绍。

先用ufsdump完全备份/dev/rfssnap/1虚拟设备:

# ufsdump 0ucf /dev/rmt/0 /dev/rfssnap/1

如果要在创建快照的同时备份虚拟设备:

#ufsdump 0ucf /var/usr_snap.dmp `fssnap -F ufs -o bs=/var/usr.snap,unlink /usr`

此外,其他标准的Solaris备份命令,比如tar也能备份,步骤如下:

(1)成为超级用户或授权角色用户。

(2)为快照创建挂接(mount)点,比如:

# mkdir /backups/home.bkup

(3)挂接快照:

# mount -F ufs -o ro /dev/fssnap/1 /backups/home.bkup

(4)进入快照的目录:

# cd /backups/home.bkup

(5)使用tar命令将快照内容备份到磁带上:

# tar cvf /dev/rmt/0 .

恢复UFS快照(Snapshot)

恢复快照和恢复其他的备份文件没有本质区别,请参见12.2.6节中所述,这里不再重复。

12.2.8 多TB UFS文件系统介绍
以前,UFS文件系统在64位系统和32位系统上的大小仅限于约1 TB (1TB=1000G)。

现在,Solaris 10在运行64位Solaris内核的系统上支持多TB UFS文件系统。系统命令和公用程序也已更新为支持多TB UFS文件系统。但需要注意的是,只有UFS文件运行64位内核的系统才支持多TB UFS文件系统。

开始时你可以创建一个小于1 TB的UFS文件系统,然后可以使用newfs -T命令来指定该文件系统以后可增大为一个多TB文件系统。此命令设置索引节点和碎片密度为多TB 文件系统进行相应的伸缩。

多TB UFS文件系统的功能包括:

 可以创建一个容量最大为16 TB的UFS文件系统。

 可以创建一个容量小于16 TB的文件系统,该文件系统以后最大可以增加到16 TB。

 可以在物理磁盘和Solaris卷管理器的逻辑卷上创建多TB文件系统。

 在容量超过1 TByte的文件系统上将默认启用UFS日志记录功能。多TB文件系统将受益于启用UFS日志记录功能而带来的性能提高。多TB文件系统还将受益于日志记录功能的可用性,因为在启用日志记录功能时,fsck命令可能无须运行。

多TB UFS文件系统的局限性包括:

在32位操作系统中,多TB UFS文件不被支持。

 无法在运行32位Solaris内核的系统上安装容量超过1 TB的文件系统。

 无法在运行64位Solaris内核的系统上从一个容量超过1 TB的文件系统进行引导。该局限性使你无法将root (/)文件系统放置在一个多TB文件系统上。

 这些系统不支持大小超过1 TB的单个文件。

 每TB UFS文件系统的最大文件数是1百万。比如4个TB的文件系统,就最多有4百万个文件数。此限制用于节省使用fsck命令检查文件系统所花费的时间。

 在多TB UFS文件系统上设置的最高限额是块大小为1024字节的2 TB。

 使用fssnap命令可以创建多TB UFS文件系统的快照。

1.创建多TB UFS快照
在12.2.7节中介绍过UFS快照,UFS快照的大小是有限制的,每个文件不能大于512 GB。在多TB UFS系统中创建UFS快照,其大小限额也和普通UFS系统一样不能大于512 GB。

需要指出的是,在建立多TB UFS快照时,不论你指定后备存储文件名与否,都将产生多个小于512 GB的文件,而且文件名的后缀为.2,.3等。

 例12-6 建立大小为1.6 TB的后备存储文件。

# fssnap -F ufs -o bs=/var/tmp /data2

/dev/fssnap/0

# /usr/lib/fs/ufs/fssnap -i

Snapshot number : 0

Block Device : /dev/fssnap/0

Raw Device : /dev/rfssnap/0

Mount point : /data2

Device state : idle

Backing store path : /var/tmp/snapshot0

Backing store size : 0 KB

Maximum backing store size : Unlimited

Snapshot create time : Fri Sep 10 13:13:02 2004

Copy-on-write granularity : 32 KB

# ls /var/tmp

snapshot0 snapshot0.2 snapshot0.3 snapshot0.4

本例中,我们没有指定后备存储文件名,系统自己指定了文件名,并将其分为四个文件,这四个文件都是/dada2目录的快照。

2.如何创建多TB UFS文件系统
创建多TB UFS文件系统步骤:

(1)成为超级用户;

(2)在逻辑卷上创建多TB UFS文件系统。

下面是创建1.8T的文件系统。

# newfs /dev/md/rdsk/d99

newfs: construct a new file system /dev/md/rdsk/d99: (y/n)? y

/dev/md/rdsk/d99: 3859402752 sectors in 628158 cylinders of 48 tracks,

128 sectors

1884474.0MB in 4393 cyl groups (143 c/g, 429.00MB/g, 448 i/g)

super-block backups (for fsck -F ufs -o b=#) at:

32, 878752, 1757472, 2636192, 3514912, 4393632, 5272352, 6151072, 702...

Initializing cylinder groups:

........................................................................

super-block backups for last 10 cylinder groups at:

3850872736, 3851751456, 3852630176, 3853508896, 3854387616, 3855266336,

3856145056, 3857023776, 3857902496, 3858781216,

#

(3)校验新的文件系统。

# fsck /dev/md/rdsk/d99

** /dev/md/rdsk/d99

** Last Mounted on

** Phase 1 - Check Blocks and Sizes

** Phase 2 - Check Pathnames

** Phase 3 - Check Connectivity

** Phase 4 - Check Reference Counts

** Phase 5 - Check Cyl groups

2 files, 2 used, 241173122 free (0 frags, 241173122 blocks, 0.0%

fragmentation)

#

(4)Mount新的文件系统。

# mount /dev/md/dsk/d99 /bigdir

# df -h /bigdir

Filesystem size used avail capacity Mounted on

/dev/md/dsk/d99 1.8T 64M 1.8T 1% /bigdir

论坛徽章:
0
42 [报告]
发表于 2008-04-14 13:51 |只看该作者
12.3 网络文件系统(NFS)介绍   
12.3.1 NFS文件系统介绍
我们称NFS文件系统为网络文件系统,因为它允许客户端通过网络连接来挂接其他系统的磁盘卷。在这里,提供共享磁盘的主机为服务器,挂接服务器磁盘的主机是客户机。客户机可以像对待本地文件系统一样在服务器的共享磁盘上进行诸如修改、删除和创建文件。它很像Windows中的共享文件夹,也有读者觉得NFS和Samba比较相似,因为它们都支持系统间透明文件系统的共享。但是,由于NFS有专门的Solaris内核的支持,因而它有更高的数据吞吐能力。

NFS文件系统是一个基于远程过程调用(RPC)的分布式文件系统结构。NFS利用了远程调用(RPC)技术,该技术使得系统可以很方便地实现对服务器系统过程的远程执行请求。目前,RPC已经得到很多操作系统的支持,包括Solaris,Linux,以及Microsoft Windows。RPC的目的就是对通过网络进行过程的具体连接细节和方法进行抽象。这样,客户端和服务器就无须配备专门的网络代码,就可以进行网络文件的共享了。

在Solaris 2.5以前的版本中,运行的是NFS2。由于它的数据传输采用了不太可靠的UDP协议,所以效果较差。而NFS 3是基于TCP协议的,数据传输比UDP协议更可靠。并且,NFS 3允许NFS服务通过缓存来加快磁盘的读写速度。此外,Solaris 2.6以后还提供了一种新型的NFS支持,这就是WebNFS。作为传统Internet文件共享技术(如FTP)的一种替代技术,WebNFS允许文件系统通过Internet实现共享。另据实验表明,Sun的WebNFS比传统的Web服务器具有更大的带宽,这意味着WebNFS很有可能在将来取代超文本传输协议(HTTP)而成为Web数据传输的标准。

在Solaris 10中,默认安装NFS 4,它比起NFS 3主要有以下改进:

 在NFS V4协议中,文件加锁的实现和以前的NFS协议有很大的不同。为文件加锁的RPC操作从分离的协议移到了核心协议之中,而rpc.lockd,rpc.statd和rpc.mountd在NFS V4中将不再被使用,但它们仍然存在于Solaris 10系统之中,以便支持NFS 3。

 NFS 4.0版的Solaris实现与Kerberos V5完全集成,又称做SEAM,可以提供验证、完整性和保密性。

 使用NFS版本4后,文件将不再在前台文件系统中进行高速缓存。后台文件系统将提供所有文件访问权。并且,由于前台文件系统中没有高速缓存任何文件,因此特定于CacheFS的安装选项(该选项影响前台文件系统)将被忽略。特定于CacheFS的安装选项不适用于后台文件系统。

12.3.2 NFS服务器的设置
要想使NFS服务器能够工作,只需要做两个方面的工作,首先是设定共享的目录,其次是启动NFS服务器。

1.设定、检查和取消共享的目录
设定共享的目录

使用share可以实现文件系统和目录的共享。例如,如果我们希望将host1上的/var/mail目录共享给host2,则在host1上可以使用下列命令:

host1#share -F nfs -o rw=host2 /var/mail

在该例中,“-F nfs”代表“NFS的文件系统”。如果我们还想将该目录共享给host3和host4,可以使用下面的命令:

host1#share -F nfs -o rw=host2:host3:host4 /var/mail

“rw”是“读写”的意思,如果我们只共享一个CD-ROM,则只须共享它的只读权限:

host1#share -F nfs -o ro /cdrom

NFS还有一个真正的特点,就是在将自己的目录共享给客户机时,还能挂接上客户机共享的目录。比如,host1将自己的/var.mail目录共享给了host2,host3和host4,如果此时host2也有共享目录/usr/local/且允许host1挂接,那么host1就可以将/usr/local/挂接到本地。

再举一个share命令的例子,将host1的目录/exprot/home/games共享:

host1# share -F nfs -o ro=@192.168.0.0/16:host2 ,root=host3 /export/home/games

结果表明:192.168.0.0这个B类网的机器和host2主机有读的权限;host3主机的root用户可以对共享资源有超级用户访问权限。但需要说明的是,即使host3主机的root用户可以对共享资源有超级用户访问权限,对共享目录/exprot/home/games也是只读,因为服务器本地权限大于任何share的权限。

Share命令是NFS服务器上的一个重要的命令,该命令还有以下参数。

# share:显示所有可以安装的资源,不管它是否已经被安装。

# share [ -F filesystem ] [ -o options ] [-d description ] pathname-to-resource:指定共享文件。

-F file system type:指定被共享的文件系统类型。

-o options:指定客户对资源访问的类型。

-d description:共享资源的简单描述。当你share命令不带任何参数运行,它就会被显示。

pathname-to-resource:在服务器上共享的资源名字。

-o:指定了允许客户访问共享资源的用户权限。具体如下。

 rw:表示用户可读/写,是默认值。

 rw=client1:client2指定客户端用户可以有读/写权限。可以有很多用户,用冒号分隔。

 ro:表示只读。

 ro=client1:client2 指定用户client1和client2只读。client1可以是用户名,也可以是IP地址,或者一个网段。例如:ro=@192.168.0.0/16。

root=client:client2 指定client1和client2上的root用户对共享资源有超级用户的权限。但是,它们的优先级小于nfs服务器的本地权限。

在终端上运行share命令可以立即生效,但系统重新启动后就会消失。如果将share命令写到/etc/dfs/dfstab配置文件中文件中的话,就可以在启动NFS服务的时候自动加载。写在dfstab配置文件中的格式上面介绍的终端命令行输入是一样的。此外,还可以使用下面两个命令手工加载和卸载。

# shareall:共享所有列在/etc/dfs/dfstab中的共享资源。

# unshareall:取消所有列在/etc/dfs/dfstab中的共享资源。

检查共享目录的设置

# dfshares

用以查看服务器的共享资源。

例如:

host1#share –F nfs –o rw=host2 /var/mail

host1# dfshares

RESOURCE SERVER ACCESS TRANSPORT

Host1:/var/mail host1 - -

详细解释如下:

resource:可被远程调用的资源的主机和路径名。

Server:指定资源的系统名称。

Access:服务器指定的权限,默认是rw,显示为“-”。

Transport:指定共享资源的端口。

# dfmounts命令

显示服务器上查看共享资源被利用的状况。

host1# dfmounts

RESOURCE SERVER PATHNAME CLIENTS

- host1 /var/mail host2, host3, host4

详细解释如下:

resource:共享资料名称。

server pathname:共享资料目录。

Client:连接的客户端。

取消目录的共享

# unshare [ -F nfs ] path-to-resource

-F nfs:指定系统类型,默认。

path-to-resource:指定共享路径。

例如:

# unshare /export/home/games

取消/export/home/games目录共享了。

2.启动和关闭NFS服务器
启动关闭系统默认版本NFS服务器。

启动:# svcadm enable network/nfs/server

关闭:# svcadm disable network/nfs/server

启动和关闭以前版本的NFS服务器。

在/etc/default/nfs配置文件中可以更改默认启动NFS服务器的版本。主要是更改以下两个参数:

NFS_SERVER_VERSMAX=value

NFS_SERVER_VERSMIN=value

如将使用NFS版本3,就将value值改为3。然后再使用svcadm启动服务器。

12.3.3 NFS客户端的设置
要使NFS客户端正常工作,首先须查看客户端的NFS服务是否启动,然后查看NFS服务器的共享目录情况,如果共享目录正常,就可以mount服务器的目录到本地。

1.查看客户端的NFS服务
查看客户端的NFS服务,使用下面命令:

#svcs |grep nfs

如果要启动系统默认版本NFS客户端服务:

# svcadm enable network/nfs/server

关闭服务使用:

# svcadm disable network/nfs/server

如果要启动非系统默认版本的NFS客户端服务,也需要更改/etc/default/nfs配置文件,主要是下面两个参数:

NFS_CLIENT_VERSMAX=value

NFS_CLIENT_VERSMIN=value

例如,如果使用NFS版本3,就将value值改为3。然后在使用svcadm启动客户端服务。

2.检测nfs服务器的共享目录
检查nfs服务器的共享目录就使用下面的命令:

# showmount [ -ade ] <hostname>

-a:显示已经已经使用的目录和来自哪个nfs服务器。

-d:显示已经被远程安装的目录。

-e:显示可以被安装的目录。一般用-e来查看远程主机的共享目录。

3.将共享目录mount到本地
# mount [ -F nfs ] [ -o options ] path-to-resource path-to-local-mount-point

-F nfs:指定共享文件系统,默认的。没必要指定。

-o options:指定选项,如权限。默认rw,可读/写。也可以ro-只读。

path-to-rescource:指定nfs服务器的主机名和共享资源路径。

path-to-local-mount-point:指定共享资源在本地的mount点。

例如:

host2# mkdir /games

host2# mount host1:/export/home/games /games

共享远程主机host1的/export/home/games目录,默认可读写,挂接在本地的/games目录上。

取消共享

# umount [-F nfs] remote-path-to-resource path-to-local-mount-point

-F nfs:默认的文件系统。

remote-path-to-resource:远程主机和共享目录路径,主机和共享目录路径用冒号分隔。

path-to-local-mount-point:本地主机挂点。

例如:

host2# umount host1:/export/home/games /games

取消远程主机host1上的/exprot/home/games这个目录的在本地/games上的共享。

12.3.4 NFS的性能管理
NFS的性能由下列多种因素决定:

 服务器的CPU的速度和个数;

 服务器的物理内存和虚拟内存大小;

 服务器的磁盘速度;

 服务器的系统负载大小;

 网络带宽;

 同时提供服务的客户机的数量;

 域名查询速度。

无论在客户机还是服务器上,我们都可以通过运行nfsstat命令来持续收集性能的统计数据。下面的命令是在服务器端运行的,我们可以看到成功调用和失败调用的数值。

#nfsstat-s

server nfs:

calls badcalls

575637355 3433



使用nfsstat-z命令,可以使上面统计的数据归零。


12.3.5 NFS配置文件介绍
在Solaris 10中,有一些NFS的配置文件,对我们理解和调试出更有效的NFS服务有很大的帮助。下面简单介绍一些比较常用的文件,如表12-5所示。

表12-5 NFS配置文件

文件名
功 能

/etc/default/nfs
列出有关lockd和nfsd进程的设置信息

/etc/default/nfslogd
列出nfslogd进程配置信息

/etc/dfs/dfstab
列出本地资源被共享的信息

/etc/dfs/fstypes
列出远程文件系统的类型

/etc/rmtab
列出被远程客户机mount上的目录

/etc/dfs/sharetab
列出本地和远程主机被共享的资源


12.3.6 NFS文件系统自动挂接
用户使用NFS服务时,使用完远程资源后经常会忘记卸载(umount),这就造成了网络资源的浪费。如果服务器发生了崩溃,还会在客户机上留下一些挂起的进程。自动挂接器(automounter)可以帮助我们解决这个问题,它安装在NFS服务的客户机上,当用户访问远程文件系统时才自动挂接该NFS文件系统,并在文件连续5分钟不使用的情况下自动卸载该NFS文件系统。

这样看起来自动挂接器就像NFS服务的一种延伸,不过在Solaris系统中,它有一个专门的服务名称叫“autofs”。

在介绍autofs服务之前,我们必须先了解“自动挂接器映像”。

1.自动挂接器映像
什么是自动挂接器映像?其实就是本地文件系统目录与远程文件系统目录的对应关系。比如,在本地键入“/staff”目录,系统就会自动将它与远程主机上的“/export/home”目录对应起来。这是个一一对应的关系。如何建立这个对应关系,以及如何管理它,我们下面将会详细进行介绍。

间接映像

间接映像是自动挂接器最常用的一种映像。间接映像文件通常保存在/etc目录下,它的存在形式通常是auto_directory。其中,“directory”是间接映像所负责挂接目录的前缀(不带斜线)。比如,负责挂接远程系统/home目录的间接映像名通常为auto_home。这个auto_home文件就位于客户机的/etc目录下,它的内容是:

host2# /etc/auto_home – home directory map for automounter

user1 host1:/export/home/user1

user2 host1:/export/home/user2

user3 host3:/export/home/user3

间接映像可以确定/home目录是自动控制的。比如本例中,user1,user2和user3分别对应的本地目录是home/user1,home/user2和home/user3。前两项要求自动挂接器分别从服务器host1上挂接/export/home/user1目录和/export/home/user2目录。最后一项则说明/user3目录应该到host3上去挂接。

直接映像

直接映像文件也是在/etc目录下。与间接映像不同的是,它的名称是固定的,叫auto_direct文件名。下面以一个/etc/auto_direct文件内容为例。

host2# /etc/auto_direct -Direct Automount map

/opt/user1 host1:/export/home/user1

/usr/user2 host1:/export/home/user2

/user3 host3:/export/home/user3

当用户访问客户机本地目录/opt/user1,/usr/user2时,所对应的目录分别是host1主机上的/export/home/user1和/export/home/user2。当用户访问客户机本地目录/user3时,对应的是host3主机上的/export/home/user3目录。

主控映像

主控映像就是当autofs服务启动后,通过主控映像控制文件来决定到哪里去找直接映像和间接映像。无论是直接映像还是间接映像,都是通过主控映像文件与autofs服务建立联系的。主控映像文件在/etc目录下,名为auto_master。下面是一个主控文件的内容:

#Master map for automounter

/home auto_home

/- auto_direct

其中,/home为间接映像的目录名。/-表示为直接映像。

设置完这些控制文件后,我们再启动autofs服务,就可以实现NFS的自动挂接了。

2.自动挂接器的启动与停止
启动autofs服务:

# svcadm enable system/filesystem/autofs

关闭autofs服务:

# svcadm disable system/filesystem/autofs

论坛徽章:
0
43 [报告]
发表于 2008-04-14 13:52 |只看该作者
12.4 虚拟文件系统   
12.4.1 虚拟文件系统
虚拟文件系统是虚拟的或基于存储器的文件系统,它提供访问特殊的核心信息和功能,有的虚拟文件系统并不需要文件系统盘空间,有的虚拟文件系统可以使用物理盘中的交换区,例如,临时文件系统。

12.4.2 临时文件系统(tmpfs)
临时文件系统(tmpfs)利用本地内存进行读写,所以访问tmpfs文件系统的文件比访问ufs文件系统中的文件要快得多,临时文件系统中的文件不是永久的,当文件系统被卸载(umount)、系统关机或重新启动时,它们就会自动消失。

与ufs类型的/tmp文件系统一样,可以将文件拷贝或移动到tmpfs类的/tmp文件系统中,或是从其中拷出,移到其他的目录中。

使用tmpfs文件系统节省了本地盘或网络读写临时文件的开销,提高了系统性能。例如,编译程序时生成很多临时文件,当使用这些文件时,操作系统就会产生大量的磁盘或网络的输入和输出请求,利用临时文件系统事先保存这些临时文件,可以明显地加快文件的创建、存取和删除的速度。

tmpfs文件系统利用交换区作为临时存储区,如果带有tmpfs文件系统的系统没有足够的交换区,可能会产生下面两个问题:

 像一般的文件一样,tmpfs文件系统没有可用空间;

 由于tmpfs申请分配交换区存放数据(如果必要的话),有些程序就可能会因为没有足够的交换区而不能执行。

12.4.3 虚拟内存文件系统(Swapfs)
虚拟内存(Swap)通常是在系统物理内存不足的情况下,利用磁盘块来模拟物理内存。当系统的物理内存不足的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有任何操作的程序,这些被释放的空间的数据大多时候被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。

Solaris在虚拟内存(Swap)的基础上,建立了虚拟Swap概念。虚拟Swap空间包含两个部分:部分物理内存和传统上的Swap分区。经过适当的配置,可以使系统需要Swap空间时,先使用内存部分的Swap空间,如果内存部分的Swap空间不够,再使用磁盘部分的Swap空间。这样,也许你硬盘上的Swap空间很少使用了,甚至根本不需要Swap分区。

虚拟Swap空间与TMPFS文件系统的关系

虚拟Swap空间与/tmp目录(TMPFS)有相当大的关系。Sun在实现/tmp目录时,充分考虑了应用程序运行的效率。许多应用程序,特别是数据库服务都会频繁使用/tmp目录作为临时数据保存区,而Solaris将/tmp目录下的文件都放在内存中而不是硬盘里,这样会大大提高应用程序的效率。但是/tmp目录的空间也是虚拟Swap空间的一部分。所以要小心监视系统的/tmp目录的使用情况。




Swap的配置对性能的影响

太多的Swap空间会浪费磁盘的空间,而太少的Swap空间,系统则会发生错误。如果系统的物理内存用光了,你的系统就会跑得慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。我们应该根据应用的实际情况来设定Swap空间的大小,但在一般的情况下,Swap空间应该设定为物理内存的2倍。

有关Swap空间操作的系统命令

查看当前swap空间的使用状况:

# swap -s

total: 65896k bytes allocated  56840k reserved  122736k used, 1069456k available

增加Swap空间步骤:

(1)成为超级用户或授权角色用户。

(2)创建Swap文件。

#mkfile 100m swapfile1

其中,100m为设定交换空间的大小。

(3)激活Swap文件。

#/usr/sbin/swap-a /path/filename

Swap文件必须以绝对路径来指定。

(4)效验Swap文件是否有效,使用/usr/sbin/swap -l命令检查。

(5)现在新加的Swap文件已经起作用了,但为了系统重新启动以后,swap仍然可用,要在/etc/vfstab文件中加入Swap设定,如:

/path/filename - - Swap - no -

删除多余的Swap空间步骤:

(1)成为超级用户或授权角色用户。

(2)使用swap -d 命令删除swap空间。

#/usr/sbin/swap -d /path/filename

(3)编辑/etc/ufstab文件,去掉此Swap(交换)文件的实体。

(4)最后删除做Swap空间的文件。

12.4.4 进程文件系统(procfs)
进程文件系统(procfs)驻留在内存中,/proc目录中有一活动进程号的清单,ps等命令会用到/proc目录中的信息,调试器或其他开发工具也可能通过文件系统调用来访问这些过程的地址和空间,下面例子列出了/proc目录中的一部分内容。

gtxa%ls -l /proc

total 144944

-rw-------1root root 0 Dec 19 15:45 00000

-rw-------1root root 196608 Dec 19 15:45 00001

-rw-------1root root 0 Dec 19 15:45 00002

-rw-------1root root 1028096 Dec 19 15:46 00073

-rw-------1root root 1445888 Dec 19 15:46 00091

-rw-------1root root 1142784 Dec 19 15:46 00093

-rw-------1root root 1142784 Dec 19 15:46 00095



-rw-------1ignatz staff 1576960 Dec 19 15:50 00226

-rw-------1ignatz staff 192512 Dec 19 15:51 00236

-rw-------1ignatz staff 1269760 Dec 19 15:52 00240

-rw-------1ignatz staff 6090752 Dec 19 15:52 00241

-rw-------1ignatz staff 188416 Dec 19 15:52 00247

-rw-------1ignatz staff 2744320 Dec 19 15:52 00256

注意:千万不要删除proc目录中的文件,希望你不要用删除/proc目录中进程的方法来杀掉进程。记住/proc目录不占用磁盘空间,所以没有必要删除/proc目录下的文件,/proc目录不需要任何系统管理。

12.4.5 循环文件系统(lofs)
用循环文件系统(lofs)可创建一个新的虚拟的原文件系统,然后用另一个路径名来存取文件,例如,可对/tmp/newroot目录进行循环安装(loopback mount),整个文件系统包括任何从nfs服务器上安装的文件系统,看起来就像在/tmp/newroot下被复制了,全部文件可以用以/开始的路径进行存取。或者用以/tmp/newroot开始的路径名进行存取,两者都一样,直到另一文件安装到/tmp/newroot或其子目录中。

12.4.6 其他一些虚拟文件系统介绍
下面列出了虚拟文件系统的其他类型,请读者注意,我们并不需要对这些文件系统进行管理。

 fifofs(先进先出文件系统)命名管道文件,用于进程对数据的公共访问。

 fdfs(文件描述符文件系统)提供用文件名打开文件,这是通过文件描述符来实现的。

 namefsSTREAMS使用它在文件顶端对文件描述符动态安装。

 specfs(特别文件系统)提供对特别的设备和块设备的访问。

论坛徽章:
0
44 [报告]
发表于 2008-04-14 13:53 |只看该作者
第13章 ZFS文件系统   
ZFS是Solaris 10操作系统中的全新动态文件系统,它的出现,将让人对文件系统的印象焕然一新。ZFS可用于Solaris 10操作系统所支持的所有平台,并且所有现有应用程序都可与它配合运行。本章介绍ZFS文件系统的特性。

论坛徽章:
0
45 [报告]
发表于 2008-04-14 13:53 |只看该作者
13.1 ZFS文件系统概述   
ZFS文件系统提供了无限制的存储性能,可验证的数据完整性,以及几近零的管理,从而在文件系统中取得了前所未有的突破。

13.1.1 什么是ZFS文件系统
ZFS文件系统的英文名称为Zettabyte File System,也叫动态文件系统(Dynamic File System),是第一个128位文件系统。

在历史上,文件系统就只包含一个设备,所以文件的大小就是设备的大小。由于文件系统有大小的限制,创建一个完整的文件系统是费时且困难的,只能由传统的卷管理产品来帮助我们管理这个过程。

因为ZFS文件系统不包括专门设备,所以它能像创建目录一样容易和快速。它也能与相关联的存储池一样自动增长。

在传统文件系统的/export/home目录下,有多个用户的主目录,它是一个单一的文件系统。ZFS提供文件系统的分层特性,所以它很容易管理多个文件系统,你可以为每个用户创建一个ZFS文件系统来替换单一文件系统。

ZFS是基于存储池的,与典型的影射物理存储设备的传统文件系统不同,ZFS所有在存储池中的文件系统都可以使用存储池的资源。

在ZFS文件系统中,有时我们发现,尽管一个文件系统处于未激活状态,但通过一些诸如df类的工具可改变可用的空间。这是因为相同存储池中的其他文件系统也能使用或释放空间。需要注意的是,可以使用quotas来限制文件系统的最大值,也可以对一个文件系统设定一定的保留空间。用户使用ZFS的方式与使用NFS网络共享类似:多个共享目录mount到一个目录上;而多个文件系统也可以共享一个存储池。

ZFS是事务处理型文件系统。在其他很多文件系统中,事务处理提交给磁盘是不同步的,在没有提交给磁盘之前,有个术语叫“未定的改变”。而“未定的改变”是不计入磁盘的空间、可用空间和涉及空间的。而即便使用fsync(3c)或O_SYNC也不能保障空间的使用信息被立即更新。

13.1.2 ZFS文件系统的特性
ZFS文件系统有以下几个方面的特性。

1.存储池
文件系统历来被构建在一个物理盘上。为了使用多个物理盘并提供数据的冗余,引入了卷管理的概念。只有通过卷管理软件建立的虚拟卷,才能使文件系统可以跨过多个物理硬盘。即使这样,文件系统也没有被修改为直接构建在多个物理盘上。

ZFS和卷管理软件非常不同,它不再创建虚拟卷,而是使用存储池来管理物理的存储,将所有存储设备都放到存储池中。存储池具有存储的特性,并且可以创建文件系统。一个文件系统不能独占设备,而必须和存储池中的所有文件系统共享设备。我们不需要设定文件系统的大小,它是随着存储池空间的增长而自动增长的。当存储池增大后,池中的所有文件系统都能立即使用增加的空间。在很多方面,存储时就像一个虚拟的内存系统。当系统内存增加后,操作系统不能强制调用内存属于哪个进程使用,所有的进程都能使用增加的内存。

2.事务处理
ZFS是事务处理型文件系统,意味着文件系统状态总是和硬盘保持一致。传统文件系统先将数据写到缓存,然后再写到最终的磁盘目录。这个时候如果电源关闭,磁盘中的数据块就会出现不一致。我们以前使用fsck(1M)命令来从头到尾地检测文件系统的状态,并试图修复。这将导致很大的管理工作量,并且也不能保证解决所有问题。在Solaris 10中,文件系统引入了一个概念,即“日志”,它能记录文件系统的活动状态,并能在系统灾难过后重新处理事件。但这也导致了系统的额外开销和新的管理问题。

ZFS事物型文件系统的数据管理模式是“copy on write”,数据永远保持一致。这意味着文件系统在系统突然断电的时候不会再崩溃,也不再需要使用fsck(1M)命令。

3.数据的检查和修复
在ZFS文件系统中,可以使用用户自己选择的算法来检测所有的数据和元数据。传统的文件系统提供了以每个数据块为基础的检测,这在传统文件系统的设计和卷的管理层面上是没有必要的,因为有几个确定的错误模式无法纠正。比如:如果数据块写得正确而位置不对,就可能导致通过检测的数据实际上是不正确的后果。

ZFS文件系统的检测存储了解决诸如此类的失败检测方法,所有被检测的数据都在文件系统层被修复。

另外,ZFS文件系统还提供自我修复数据的能力。ZFS支持存储池的数据冗余,比如镜像和RAID-Z。当发现错误的数据,只需要从正确的拷贝中取出正确的数据进行修复就可以了。

ZFS使用了64位的校验和保护所有数据,可探测并挽救无记载数据崩溃。

4.空前的可扩展性
作为世界上首款128位文件系统,ZFS提供的性能可达32位或64位系统的160亿平方倍。

5.简单的管理模式
ZFS文件系统是分层的。通过文件系统的分层,可以对层的属性、mount点和NFS共享等进行管理。管理员可以对文件系统设定保留和限额、压缩及mount点,还可以容易地创建多个系统快照,或者对单个文件系统进行备份或恢复操作。

6.使用快照和克隆
ZFS文件系统的快照可避免删除数据时出现意外丢失,也可以通过适当的权限把文件系统中的所有文件移动到远程系统,以节省本地ZFS系统空间。生成ZFS的快照是非常容易的。

7.安装文件系统
ZFS结构简单,管理容易。传统文件系统必须在/etc/vfstab文件中添加一行记录。而ZFS文件系统依靠数据集能自动安装和卸载,不再需要编辑/etc/vfstab。

8.卷管理
ZFS不再需要单独的卷管理。但它可以创建包含逻辑卷的存储池,当然这是不被推荐的。ZFS最好使用物理卷设备,使用逻辑卷设备可能会影响性能和可靠性。

13.1.3 ZFS的相关技术术语
在ZFS文档中经常出现的技术术语如下所示。

 checksum:使用加密算法对文件系统数据块进行校验。

 dataset:一些诸如克隆、文件系统、快照和卷等ZFS实体的通用名称。

 Filesystem:包含着标准的POSIX文件系统的数据集。

 Mirror:存储两个或多个磁盘数据拷贝的虚拟设备。如果一个磁盘出现故障,其他数据盘可以提供相同的数据。

 pool:具有分层属性和物理特性的逻辑设备组。数据集被分配到池中。

 RAID-Z:类似RAID-5,是个存储数据及在多个磁盘上进行校验的虚拟设备。

 Snapshot:在某个时间,文件系统或卷的映像。快照是文件系统或卷的只读的拷贝。快照的创建快速而且容易。不过,快照的建立需要消耗存储池的空间。

 clone:和快照一样,是文件系统最初的内容。

 virtual device:在池中的逻辑设备,它可能是物理设备、文件或者一些外设。

 Volume:为了支持传统文件系统而模拟物理设备的数据集。

每个数据集在ZFS命名空间中都有惟一的名称。数据集的名称有下面形式:

pool/path[@snapshot]

 pool:包含数据集的存储池的名称。

 path:数据集的路径。

 snapshot:(可选的)数据集的快照。

论坛徽章:
0
46 [报告]
发表于 2008-04-14 13:54 |只看该作者
13.2 创建和管理存储池   
本节详细地描述了如何创建和管理存储池。

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

这些虚拟设备包括:

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块盘,其中一块盘则将提供校验。

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

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

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

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

 四个盘的RAID-Z设置。

 两两镜像。

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

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

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

使用之后,成功创建。

13.2.4 删除存储池
当写在磁盘中的数据不再需要的时候,就可以使用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

13.2.5 存储池的设备管理
一个存储池有很多的虚拟设备,而虚拟设备又是由物理设备所组成的。

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所替换。

13.2.6 存储池状态查询
通过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栏给出了设备中无法修补的错误的数量。如果存在潜在的设备失败,就需要修复。如果有非零错误在顶级虚拟设备中,则可能有部分数据不可用。

论坛徽章:
0
47 [报告]
发表于 2008-04-14 13:55 |只看该作者
13.2.7 存储池的移植
当在不同计算机之间移动存储池时,必须从一个计算机上断开存储,并重新连接到另一个计算机上。这可以通过移动物理设备或多端口的设备比如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
48 [报告]
发表于 2008-04-14 13:55 |只看该作者
13.3 管理ZFS   
本节详细地介绍如何管理ZFS,包括对文件系统的层次的概念、特性和安装点的管理,以及文件系统的共享。

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

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

13.3.1 创建和删除文件系统
用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

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

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

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

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

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

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

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

13.3.3 查看文件系统信息
可使用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

13.3.4 管理属性
本节介绍管理数据集的属性。主要使用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属性是如何设置的。属性的来源如表13-1所示。

表13-1 属性的来源


描 述

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

论坛徽章:
0
49 [报告]
发表于 2008-04-14 13:56 |只看该作者
13.3.5 安装和共享文件系统
本节描述如何在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:

当文件系统被安装后,基于数据集的属性就会相应地产生安装属性,表13-2就是数据集属性和安装属性的对应表。

表13-2 数据集属性和安装属性的对应表

属 性
安装属性

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文件系统中使用。这意味着可以选择不同的方法来管理文件系统的共享。

13.3.6 限额和保留
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

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

13.3.7 文件系统的备份和恢复
通过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
50 [报告]
发表于 2008-04-14 13:57 |只看该作者
13.4 ZFS文件系统的快照和克隆   
本节介绍如何创建、管理快照和克隆。

13.4.1 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命令能使快照放弃所有的改变,恢复到建立快照的最初状态。如果有些最近的快照的话,使用&shy;-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

13.4.2 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP