永发信息网

有没有详细介绍文件系统的书籍?

答案:3  悬赏:20  手机版
解决时间 2021-07-29 14:22
  • 提问者网友:雪舞兮
  • 2021-07-29 01:25

如题。需要详细介绍文件系统的书籍,可以是整本书中介绍过文件系统的书籍,不一定要整本书中都在讲文件系统。最好能详解ZFS。

最佳答案
  • 五星知识达人网友:拜訪者
  • 2021-07-29 02:02
这个文件系统LINUX的老大LINUS眼馋好久了,他想把ZFS移植到LINUX,取代EXT3,成为下一代LINUX内核默认的文件系统,好像两边的老大一直在讨论这个事情,也不知道现在商量得怎么样了,呵呵。

在具体解释之前,先说说传统文件系统和卷管理的一些缺点。

我们知道在NTFS和EXT3里面我们划分分区的时候,分区的大小在那个时候就定义好了,比如我们在windows下面把硬盘划了2个区,一个C盘,一个 D盘,我们在进行分区的时候就把C和D的大小都定义好了,比如C盘20个G,D盘20个G,以后随着我们不断的安装软件,下载电影,C盘的空间越来越小,终于有一天,C盘的空间只有1个G不到了,如果我们这个时候要安装个2个G的软件,这个软件只能安装到C盘,那我们的空间就不够了,但是这个时候我们的D 盘还有10个G的空间,这真是让人烦,明明我的硬盘还有剩余的空间,但是我的软件却安装不上了,有的朋友说这个不要紧,用PGMAGIC,重新划分空间,但是对于企业级的服务器,你敢这样用吗?这是问题之一。

在企业应用里面,还有一个比较常见的问题,比如我有个专门存储数据的硬盘,这个硬盘平时挂载在/data之下,随着企业的数据越来越多,这个盘迟早有装满的一天,这个时候我想加块硬盘,把这两块硬盘都挂载到/data之下,并且骗过操作系统,让操作系统认为在/data下面只有一块连续的硬盘,针对这种应用,卷管理应时而生,但是卷管理过程和命令常常比较复杂,让人觉得这个东西不是好弄的。这是问题之二。

针对这两个问题,企业级的文件系统ZFS诞生了,不得不说这又是SUN的一次杰作。

ZFS的设计思想认为我们对硬盘的访问为什么不能就像我们对内存的访问一样,我们的数据存储在内存中时,并不会说内存条上的那个CHIP满了我们的数据就不能放了,只要整个内存还有空间我们的数据就能够放入内存(和问题一对应)。如果我们的内存不够了,我们只需要加根内存条就能够使用了,操作系统并不会认为这根内存条和以前的内存条有什么不同。(对应问题二)。

好了,弄清楚了ZFS的设计思路,我们可以说些ZFS的细节。

ZFS是一个128位的文件系统,存储量级是Zetta级,1Z=1024的3次方个T,而一个T又等于1024个G,我们可以看出zfs是一个海量级的文件系统。有的朋友可能要说搞得那么大有什么用,我们先看看16位的文件系统是个什么情况,我们现在的高清电影一集就是4.3个G左右,在16位的文件系统里面能存得下吗?我们知道2的32次方才等于4G,也就是说要存放这样的高清电影,32位的文件是最低配置,否则如果单个文件就超过4G,那32位的文件系统是支持不了的。那对于我们的企业应用又如何呢?我们所使用的数据库在物理上都是对应的数据库文件,如果企业和科学研究的数据量很大,单个数据库文件的大小至少上百个G,所以我们知道ZFS的128设计的好处了,按照128位的宽度,用zfs存放整个地球的信息都是没有问题的。

在ZFS的架构里,最下面是存储池,所有的存储介质都放在这个存储介质里面,然后再在这个存储池上面布ZFS的文件系统,为了说明问题,让我们先看一个例子,大家如果能做一做,我相信不会浪费大家的时间。

先切换到root用户
#su

我们使用文件盘而不是实际的物理硬盘来建立存储池,当然使用物理盘也是一样的,我们先建立5个文件盘,每个文件盘100M
#mkfile 100M disk1 disk2 disk3 disk4 disk5

接着我们利用zpool create命令来使用这些文件盘建立存储池tank,注意了在ZFS里面是不需要对磁盘进行分区和格式化的,系统会为我们做这一切的工作,并且速度很快.
#zpool create tank `pwd`/disk1 `pwd`/disk2 (这里你可以只使用disk1,zpool create tank `pwd`/disk1,也可以5个磁盘全用,zpool create tank `pwd`/disk1......`pwd`/disk5)

在这个命令之后我们利用zpool list来查看
#zpool list
结果如下,可以看到ZFS的存储池tank已经建立好了
NAME SIZE USED AVAILBLE CAP HEALTH ALTROOT
tank 191M 95.5K 191M ...........

在我们创建ZFS存储池的时候,系统已经默认在这个存储池上面创建了一个ZFS系统,名字和存储池的名字一样,并且已经为我们挂载好了,方便吧,并且这种挂载是持久的,也就是说我们重启后,这种挂载关系还在,并不需要我们去修改vfstable之类的文件,我们用zfs list来查看
#zfs list
结果如下,其中根目录下的tank目录是系统自动为我们创建的,不需要我们手动
NAME USED AVAIL REFER MOUNTPOINT
TANK 108K 159M 18K /tank

接下来我们可以根据自己的需要在这个存储池上创建其他的ZFS文件系统。
#zfs create tank/test1 (tank是存储池的名字,表明我们要在tank这个存储池上建立test1这个ZFS文件系统)
相应的我们可以创建test2
#zfs create tank/test2
用zfs list来看下效果
NAME USED AVAIL REFER MOUNTPOINT
TANK 108K 159M 18K /tank
tank/test1 18K 159M 18K /tank/test1
tank/test2 18K 159M 18K /tank/test2
这里需要注意两点:一是/tank/test1这样的目录是系统自动为我们创建和挂载的,二是我们可以看到test1和test2他们的可用空间是一样的,都等于存储池的可用空间159M,这样就解决了我们前面提到的问题一,在ZFS里面分区的大小是自动扩展的,并不象windows和linux一样,需要事先确定。


我们也可以动态设置ZFS文件系统的挂载点,比如:
#zfs set mountpoint=/mnt tank/test1
#zfs list
NAME USED AVAIL REFER MOUNTPOINT
TANK 108K 159M 18K /tank
tank/test1 18K 159M 18K /mnt
tank/test2 18K 159M 18K /tank/test2
改变之后的挂载关系也是持久的,重启之后也会保持,不需要我们去改变vfstable之类的文件。

下面我们说说前面提到的第二个问题在ZFS里面的解决办法,如果disk1和disk2都被用完了,我想要加硬盘怎么办?这在ZFS里面很简单
#zpool add tank `pwd`/disk3 (将disk3加入到tank这个存储池里面)
#zpool list
NAME SIZE USED AVAILBLE CAP HEALTH ALTROOT
tank 286M 185K 286M ...........
我们可以看到存储池的可用空间已经变大,我们还可以详细看看
#zpool status
这个命令的输出比较长,我就不列出来了,在里面我们可以看到在存储池里面有disk1 disk2 disk3三个盘。
前面提到的问题二,我们看到在ZFS里面有了非常简洁的解决办法。

如果我要撤销ZFS的文件系统怎么办呢?2个命令就可以非常干净的把ZFS撤销掉
#zfs destroy tank/test1
#zfs destroy tank/test2
#zpool destroy tank
总的思路就是先撤销掉ZFS文件系统,用zfs destroy命令,然后撤销掉ZFS文件系统使用的存储池,用zpool destroy命令。
原文 http://bbs.chinaunix.net/viewthread.php?tid=1234907 ,可以下附件

该系列以前的文章:
OpenSolaris新特性解析之一: opensolaris之前身今世 http://bbs.chinaunix.net/viewthread.php?tid=1221539

这篇帖子我想介绍下ZFS,这个文件系统LINUX的老大LINUS眼馋好久了,他想把ZFS移植到LINUX,取代EXT3,成为下一代LINUX内核默认的文件系统,好像两边的老大一直在讨论这个事情,也不知道现在商量得怎么样了,呵呵。

在具体解释之前,先说说传统文件系统和卷管理的一些缺点。

我们知道在NTFS和EXT3里面我们划分分区的时候,分区的大小在那个时候就定义好了,比如我们在windows下面把硬盘划了2个区,一个C盘,一个 D盘,我们在进行分区的时候就把C和D的大小都定义好了,比如C盘20个G,D盘20个G,以后随着我们不断的安装软件,下载电影,C盘的空间越来越小,终于有一天,C盘的空间只有1个G不到了,如果我们这个时候要安装个2个G的软件,这个软件只能安装到C盘,那我们的空间就不够了,但是这个时候我们的D 盘还有10个G的空间,这真是让人烦,明明我的硬盘还有剩余的空间,但是我的软件却安装不上了,有的朋友说这个不要紧,用PGMAGIC,重新划分空间,但是对于企业级的服务器,你敢这样用吗?这是问题之一。

在企业应用里面,还有一个比较常见的问题,比如我有个专门存储数据的硬盘,这个硬盘平时挂载在/data之下,随着企业的数据越来越多,这个盘迟早有装满的一天,这个时候我想加块硬盘,把这两块硬盘都挂载到/data之下,并且骗过操作系统,让操作系统认为在/data下面只有一块连续的硬盘,针对这种应用,卷管理应时而生,但是卷管理过程和命令常常比较复杂,让人觉得这个东西不是好弄的。这是问题之二。

针对这两个问题,企业级的文件系统ZFS诞生了,不得不说这又是SUN的一次杰作。

ZFS的设计思想认为我们对硬盘的访问为什么不能就像我们对内存的访问一样,我们的数据存储在内存中时,并不会说内存条上的那个CHIP满了我们的数据就不能放了,只要整个内存还有空间我们的数据就能够放入内存(和问题一对应)。如果我们的内存不够了,我们只需要加根内存条就能够使用了,操作系统并不会认为这根内存条和以前的内存条有什么不同。(对应问题二)。

好了,弄清楚了ZFS的设计思路,我们可以说些ZFS的细节。

ZFS是一个128位的文件系统,存储量级是Zetta级,1Z=1024的3次方个T,而一个T又等于1024个G,我们可以看出zfs是一个海量级的文件系统。有的朋友可能要说搞得那么大有什么用,我们先看看16位的文件系统是个什么情况,我们现在的高清电影一集就是4.3个G左右,在16位的文件系统里面能存得下吗?我们知道2的32次方才等于4G,也就是说要存放这样的高清电影,32位的文件是最低配置,否则如果单个文件就超过4G,那32位的文件系统是支持不了的。那对于我们的企业应用又如何呢?我们所使用的数据库在物理上都是对应的数据库文件,如果企业和科学研究的数据量很大,单个数据库文件的大小至少上百个G,所以我们知道ZFS的128设计的好处了,按照128位的宽度,用zfs存放整个地球的信息都是没有问题的。

在ZFS的架构里,最下面是存储池,所有的存储介质都放在这个存储介质里面,然后再在这个存储池上面布ZFS的文件系统,为了说明问题,让我们先看一个例子,大家如果能做一做,我相信不会浪费大家的时间。

先切换到root用户
#su

我们使用文件盘而不是实际的物理硬盘来建立存储池,当然使用物理盘也是一样的,我们先建立5个文件盘,每个文件盘100M
#mkfile 100M disk1 disk2 disk3 disk4 disk5

接着我们利用zpool create命令来使用这些文件盘建立存储池tank,注意了在ZFS里面是不需要对磁盘进行分区和格式化的,系统会为我们做这一切的工作,并且速度很快.
#zpool create tank `pwd`/disk1 `pwd`/disk2 (这里你可以只使用disk1,zpool create tank `pwd`/disk1,也可以5个磁盘全用,zpool create tank `pwd`/disk1......`pwd`/disk5)

在这个命令之后我们利用zpool list来查看
#zpool list
结果如下,可以看到ZFS的存储池tank已经建立好了
NAME SIZE USED AVAILBLE CAP HEALTH ALTROOT
tank 191M 95.5K 191M ...........

在我们创建ZFS存储池的时候,系统已经默认在这个存储池上面创建了一个ZFS系统,名字和存储池的名字一样,并且已经为我们挂载好了,方便吧,并且这种挂载是持久的,也就是说我们重启后,这种挂载关系还在,并不需要我们去修改vfstable之类的文件,我们用zfs list来查看
#zfs list
结果如下,其中根目录下的tank目录是系统自动为我们创建的,不需要我们手动
NAME USED AVAIL REFER MOUNTPOINT
TANK 108K 159M 18K /tank

接下来我们可以根据自己的需要在这个存储池上创建其他的ZFS文件系统。
#zfs create tank/test1 (tank是存储池的名字,表明我们要在tank这个存储池上建立test1这个ZFS文件系统)
相应的我们可以创建test2
#zfs create tank/test2
用zfs list来看下效果
NAME USED AVAIL REFER MOUNTPOINT
TANK 108K 159M 18K /tank
tank/test1 18K 159M 18K /tank/test1
tank/test2 18K 159M 18K /tank/test2
这里需要注意两点:一是/tank/test1这样的目录是系统自动为我们创建和挂载的,二是我们可以看到test1和test2他们的可用空间是一样的,都等于存储池的可用空间159M,这样就解决了我们前面提到的问题一,在ZFS里面分区的大小是自动扩展的,并不象windows和linux一样,需要事先确定。


我们也可以动态设置ZFS文件系统的挂载点,比如:
#zfs set mountpoint=/mnt tank/test1
#zfs list
NAME USED AVAIL REFER MOUNTPOINT
TANK 108K 159M 18K /tank
tank/test1 18K 159M 18K /mnt
tank/test2 18K 159M 18K /tank/test2
改变之后的挂载关系也是持久的,重启之后也会保持,不需要我们去改变vfstable之类的文件。

下面我们说说前面提到的第二个问题在ZFS里面的解决办法,如果disk1和disk2都被用完了,我想要加硬盘怎么办?这在ZFS里面很简单
#zpool add tank `pwd`/disk3 (将disk3加入到tank这个存储池里面)
#zpool list
NAME SIZE USED AVAILBLE CAP HEALTH ALTROOT
tank 286M 185K 286M ...........
我们可以看到存储池的可用空间已经变大,我们还可以详细看看
#zpool status
这个命令的输出比较长,我就不列出来了,在里面我们可以看到在存储池里面有disk1 disk2 disk3三个盘。
前面提到的问题二,我们看到在ZFS里面有了非常简洁的解决办法。

如果我要撤销ZFS的文件系统怎么办呢?2个命令就可以非常干净的把ZFS撤销掉
#zfs destroy tank/test1
#zfs destroy tank/test2
#zpool destroy tank
总的思路就是先撤销掉ZFS文件系统,用zfs destroy命令,然后撤销掉ZFS文件系统使用的存储池,用zpool destroy命令。

ZFS的用法就介绍到这里,更多的用法如何配置raid之类的,可以下载附件,总的来讲ZFS的使用是非常简单的。

最后想介绍下ZFS系统的一些设计原理,1是自我恢复,2是事务性的操作。这部分光说不容易说清楚,上几个图。

先看图1,ZFS里面我们的每一个文件的内容,ZFS都会帮我们存放一个校验和,这个校验和存放在这个文件的父目录的文件节点里,再看图2,
在传统的mirror设置里面,如果有一个盘里面的数据是坏的,系统并不能够检查出来,如果运气不好,应用程序可能会在存放坏数据的那个盘里面去读,这样读出来的就是坏数据,并且可能导致应用程序和OS的崩溃。我们再看图3,在ZFS里面如果遇到这样的情况,校验和会告诉系统说目前读到的数据是坏数据,这时系统会自动到另外一个盘里面去拿数据,并且在把另一个盘里面的数据向上传给应用程序的同时,会用好数据覆盖掉mirror盘里面的坏数据。这就是自我恢复。

关于事务性的操作,我们可以看图4,ZFS里面所有的操作都是事务性的,要么全做,要么不做,这就保证了我们文件系统的完整性。比如我们要修改图4里面左下方的两个文件,系统会在修改之前,先将这两个文件做拷贝,这就是copy on write,拷贝出来后,在拷贝的附件里面做我们的修改,只有等修改完成后,才会将这两个文件的父目录做一个拷贝,然后在拷贝里面作出修改,将文件指针指向最新的两个文件,这样的过程依次上推,直到根目录,根目录不会做拷贝的动作,直接是一个原子操作,将文件指针指向最新的节点,完成所有的修改操作。大家可以看到在这个过程中的任何一部掉电都不会影响到我们系统的文件完整性。

这部分就基本上更新完成了,后面我会写这个系列的第三部OpenSolaris新特性解析之三:SMF  
ZFS的用法就介绍到这里,更多的用法如何配置raid之类的,可以下载附件,总的来讲ZFS的使用是非常简单的。

最后想介绍下ZFS系统的一些设计原理,1是自我恢复,2是事务性的操作。这部分光说不容易说清楚,上几个图。

先看图1,ZFS里面我们的每一个文件的内容,ZFS都会帮我们存放一个校验和,这个校验和存放在这个文件的父目录的文件节点里,再看图2,
在传统的mirror设置里面,如果有一个盘里面的数据是坏的,系统并不能够检查出来,如果运气不好,应用程序可能会在存放坏数据的那个盘里面去读,这样读出来的就是坏数据,并且可能导致应用程序和OS的崩溃。我们再看图3,在ZFS里面如果遇到这样的情况,校验和会告诉系统说目前读到的数据是坏数据,这时系统会自动到另外一个盘里面去拿数据,并且在把另一个盘里面的数据向上传给应用程序的同时,会用好数据覆盖掉mirror盘里面的坏数据。这就是自我恢复。

关于事务性的操作,我们可以看图4,ZFS里面所有的操作都是事务性的,要么全做,要么不做,这就保证了我们文件系统的完整性。比如我们要修改图4里面左下方的两个文件,系统会在修改之前,先将这两个文件做拷贝,这就是copy on write,拷贝出来后,在拷贝的附件里面做我们的修改,只有等修改完成后,才会将这两个文件的父目录做一个拷贝,然后在拷贝里面作出修改,将文件指针指向最新的两个文件,这样的过程依次上推,直到根目录,根目录不会做拷贝的动作,直接是一个原子操作,将文件指针指向最新的节点,完成所有的修改操作。大家可以看到在这个过程中的任何一部掉电都不会影响到我们系统的文件完整性。
全部回答
  • 1楼网友:有你哪都是故乡
  • 2021-07-29 03:41

http://baike.baidu.com/view/959414.htm

  • 2楼网友:封刀令
  • 2021-07-29 03:14

其实你想知道什么

想弄明白什么

可以直接在网上搜下

资料很全

想要专业性的书籍大概免费的很少

比如你想了解

ZFS文件系统 查得(你还可以继续深入的去查……不好意思,或者我说的与你的意思拧了,^_^建议而已):

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

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

  什么是ZFS

  ZFS 文件系统是一个革命性的全新的文件系统,它从根本上改变了文件系统的管理方式,这个文件系统的特色和其带来的好处至今没有其他文件系统可以与之媲美,ZFS 被设计成强大的、可升级并易于管理的。

  ZFS 用“存储池”的概念来管理物理存储空间。过去,文件系统都是构建在物理设备之上的。为了管理这些物理设备,并为数据提供冗余,“卷管理”的概念提供了一个单设备的映像。但是这种设计增加了复杂性,同时根本没法使文件系统向更高层次发展,因为文件系统不能跨越数据的物理位置。

  ZFS 完全抛弃了“卷管理”,不再创建虚拟的卷,而是把所有设备集中到一个存储池中来进行管理!“存储池”描述了存储的物理特征(设备的布局,数据的冗余等等),并扮演一个能够创建文件系统的专门存储空间。从此,文件系统不再局限于单独的物理设备,而且文件系统还允许物理设备把他们自带的那些文件系统共享到这个“池”中。你也不再需要预先规划好文件系统的大小,因为文件系统可以在“池”的空间内自动的增大。当增加新的存贮介质时,所有“池”中的所有文件系统能立即使用新增的空间,而不需要而外的操作。在很多情况下,存储池扮演了一个虚拟内存。

  创建一个池的例子

  # zpool create tank mirror c1t0d0 c1t1d0

  这是一个被镜像了的池,名叫“tank”。如果命令中的设备包含有其他的文件系统或者以别的形式被使用,那么命令不能执行。

  要查看池是否成功创建,用 zpool list 命令,例如:

  # zpool list

  NAME SIZE USED AVAIL CAP HEALTH ALTROOT

  tank 80G 137K 80G 0% ONLINE -

  ZFS 文件系统的层次

  不管层次如何,根总是池的名字。

  1、为每个用户及项目创建一个文件系统是个不错的办法!

  2、ZFS可以为文件系统分组,属于同一组的文件系统具有相似的性质,这有点像用户组的概念!相似的文件系统能够使用一个共同的名字。

  3、大多数文件系统的特性都被用简单的方式进行控制,这些特征控制了各种行为,包括文件系统被mount在哪里,怎么被共享,是否被压缩,是否有限额

  创建一个文件系统

  # zfs create tank/home

  下一步,就可以创建各个文件系统,把它们都归组到 home 这个文件系统中。

  同时可以设置home的特性,让组内的其他文件系统继承的它的这些特性。

  当一个文件系统层次创建之后,可以为这个文件系统设置一些特性,这些特性将被所有的用户共享:

  # zfs set mountpoint=/export/zfs tank/home

  # zfs set sharenfs=on tank/home

  # zfs set compression=on tank/home

  # zfs get compression tank/home

  NAME PROPERTY VALUE SOURCE

  tank/home compression on local

  4、创建单个的文件系统

  注意:这些文件系统如果被创建好,他们的特性的改变将被限制在home级别,所有的特性能够在文件系统的使用过程中动态的改变。

  # zfs create tank/home/bonwick

  # zfs create tank/home/billm

  bonwick、billm文件系统从父文件系统home中继承了特性,因此他们被自动的mount到/export/zfs/user 同时作为被共享的NFS。管理员根本不需要再手工去编辑 /etc/vfstab 或 /etc/dfs/dfstab 文件。

  每个文件系统除了继承特性外,还可以有自己的特性,如果用户bonwick的磁盘空间要限制在10G。

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

  5、用 zfs list 命令查看可获得的文件系统的信息,类似于过去的 df -k 命令了,呵呵 .

  # zfs list

  NAME USED AVAIL REFER MOUNTPOINT

  tank 92.0K 67.0G 9.5K /tank

  tank/home 24.0K 67.0G 8K /export/zfs

  tank/home/billm 8K 67.0G 8K /export/zfs/billm

  tank/home/bonwick 8K 10.0G 8K /export/zfs/bonwick

  ZFS和传统文件系统的区别

  1、传统的文件系统被限制在单个磁盘设备之内,它们的尺寸是不能超越单个磁盘设备。

  2、过去的文件系统是被影射到一个物理存储单元,如:分区;所有的ZFS文件系统共享池内的可获得的存储空间。

  3、ZFS 文件系统不需要通过编辑/etc/vfstab 文件来维护。

  ZFS已经抛弃了卷管理,逻辑卷可以不再使用。因为ZFS在使用和管理raw设备能够有更好的表现。

  Components of a ZFS Storage Pool

  组成ZFS存储池的元件有:磁盘、文件、虚拟设备,其中磁盘可以是整个硬盘(c1t0d0),也可以是单个slice(c0t0d0s7)。推荐使用整个硬盘,这样可以省去分区操作(format)。

  RAID-Z 跟 RAID-5的区别

  传统的raid-5都存在着“写漏洞”,就是说如果raid-5的stripe在正写数据时,如果这时候电源中断,那么奇偶校验数据将跟该部分数据不同步,因此前边的写无效;RAID-Z用了“variable-width RAID stripes”技术,因此所有的写都是full-stripe writes。之所以能实现这种技术,就是因为ZFS集成了文件系统和设备管理,使得文件系统的元数据有足够的信息来控制“variable-width RAID stripes”

  理论上说,创建RAID-Z需要至少三块磁盘,这跟raid-5差不多。例如:

  raidz c1t0d0 c2t0d0 c3t0d0

  还可以更加复杂一点,例如:

  raidz c1t0d0 c2t0d0 c3t0d0 c4t0d0 c5t0d0 c6t0d0 c7t0d0 raidz c8t0d0 c9t0d0 c10t0d0 c11t0d0 c12t0d0 c13t0d0 c14t0d0

  上边这个例子创建了14个磁盘的RAID-Z , 这14个盘被分成了两组,但下边这句话有点不大明白:

  RAID-Z configurations with single-digit groupings of disks should perform better.

  RAID-Z具有自动修复数据的功能

  当有损坏的数据块被检测到,ZFS不但能从备份中找到相同的正确的数据,而且还能自动的用正确数据修复损坏的数据。

  创建ZFS存储池

  1、创建一个基本的存储池,方法很简单:

  # zpool create tank c1t0d0 c1t1d0

  这时可以在 /dev/dsk 目录下看到一个大的slice,数据动态的stripe跨过所有磁盘!

  2、创建一个镜像的存储池

  也是很简单,只要在上边命令基础上增加“mirror”关键字就可以了,下边是创建一个两路(two-way)镜像的例子:

  # zpool create tank mirror c1d0 c2d0 mirror c3d0 c4d0

  3、创建RAID-Z存储池

  使用“raidz”关键字就可以了,例如:

  # zpool create tank raidz c1t0d0 c2t0d0 c3t0d0 c4t0d0 /dev/dsk/c5t0d0

  这里/dev/dsk/c5t0d0其实跟用c5t0d0是一样的,由此可以看出,在创建ZFS的时候,磁盘完全可以用物理设备名就可以,不需要指出全路径。

  这句话不大明白:However, the disks must be preformatted to have an appropriately sized slice zero.

  4、检测正在使用的设备

  在格式化设备之前,ZFS首先决定磁盘是否已经在用或者是否装有操作系统,如果磁盘在用了,那么将会出现下边的错误提示:

  # zpool create tank c1t0d0 c1t1d0

  invalid vdev specification

  use ’-f’ to override the following errors:

  /dev/dsk/c1t0d0s0 is currentlymounted on /

  /dev/dsk/c1t0d0s1 is currentlymounted on swap

  /dev/dsk/c1t1d0s0 is part of active ZFS pool ’zeepool’

  Please see zpool(1M)

  有些错误可以用 -f 选项来强制覆盖,但是大多错误是不能的。下边给出不能用-f覆盖的错误情况,这时只能手工纠正错误:

  Mounted file system The disk or one of its slices contains a file system that is currently mounted. To correct this error, use the umount command.

  File system in /etc/vfstab The disk contains a file system that is listed in the /etc/vfstab file,but the file system is not currently mounted.To correct this error,remove or comment out the line in the /etc/vfstab file.

  Dedicated dump device The disk is in use as the dedicated dump device for the system. To correct this error, use the dumpadm command.

  Part of a ZFS pool The disk or file is part of an active ZFS storage pool. To correct this error, use the zpool command to destroy the pool.

  5、创建存储池时默认的mount点

  在创建存储池时,如果mount点所在目录不存在,系统会自动创建,如果存在,根数据集(root dataset)会自动mount到这个目录上。

  To create a pool with a different default mount point, use the -m option of the zpool create command:

  # zpool create home c1t0d0

  default mountpoint ’/home’ exists and is not empty

  use ’-m’ option to specifya different default

  # zpool create -m /export/zfs home c1t0d0

  This command creates a new pool home and the home dataset with a mount point of /export/zfs.

  6、删除存储池

  Pools are destroyed by using the zpool destroy command. This command destroys the pool even if it contains mounted datasets.

  # zpool destroy tank

  用ZFS存储池管理设备

  1、增加设备到存储池

  用户可以通过增加一个新的顶级虚拟设备的方法动态给存储池增加空间,这个空间立即对空间中的所有数据集(dataset)有效。要增加一个虚拟设备到池中,用“zpool add”命令,例如:

  # zpool add zeepool mirror c2t1d0 c2t2d0

  该命令也可以用 -n选项进行预览,例如:

  # zpool add -n zeepool mirror c3t1d0 c3t2d0

  would update ’zeepool’ to the following configuration:

  zeepool

  mirror

  c1t0d0

  c1t1d0

  mirror

  c2t1d0

  c2t2d0

  mirror

  c3t1d0

  c3t2d0

  2、增加和减少一路镜像

  用“zpool attach”命令增加一路镜像,例如:

  # zpool attach zeepool c1t1d0 c2t1d0

  在这个例子中,假设 zeepool 是第一点里的那个zeepool(已经是两路镜像),那么这个命令将把zeepool升级成三路镜像。

  用“zpool detach”命令来分离一路镜像

  # zpool detach zeepool c2t1d0

  如果池中不存在镜像,这个才操作将被拒绝。错误提示如下边这个例子:

  # zpool detach newpool c1t2d0 cannot detach c1t2d0: onlyapplicable to mirror and replacing vdevs

  3、管理设备的“上线”和“下线”

  ZFS允许个别的设备处于offline或者online状态。当硬件不可靠或者还没有完全不能用的时候,ZFS会继续向设备读写数据,但不过是临时这么做,因为设备还能将就使用。一旦设备不能使用,就要指示ZFS忽略该设备,并让这个坏掉的设备下线。ZFS不会向offline的设备发送任何请求。

  注意:如果只是为了更换设备(被换设备并没有出问题),不需要把他们offline。如果offline设备,然后换了一个新设备上去,再把新设备online,这么做会出错!

  用“zpool offline”命令让设备下线。例如:

  # zpool offline tank c1t0d0

  bringing device c1t0d0 offline

  下边这句话没怎么看懂:

  You cannot take a pool offline to the point where it becomes faulted. For example, you cannot take offline two devices out of a RAID-Z configuration, nor can you take offline a top-level virtual device.

  # zpool offline tank c1t0d0

  cannot offline c1t0d0: no valid replicas

  默认情况下,offline设备将永久保持offline状态,直到系统重新启动。

  要临时offline一个设备,用-t选项,例如:

  # zpool offline -t tank c1t0d0

  bringing device ’c1t0d0’ offline

  用“zpool onine”命令使设备上线

  # zpool online tank c1t0d0

  bringing device c1t0d0 online

  注意:如果只是为了更换设备(被换设备并没有出问题),不需要把他们offline。如果offline设备,然后换了一个新设备上去,再把新设备online,这么做会出错!在这个问题上文档是这么说的:(但愿我没理解错)

  Note that you cannot use device onlining to replace a disk. If you offline a

  device, replace the drive, and try to bring it online, it remains in the faulted state.

  4、清扫存储池设备

  如果设备因为出现错误,被offline了,可以用“zpool clear”命令清扫错误。

  如果没有特别指定,zpool clear命令清扫池里所有设备。例如:

  # zpool clear tank

  如果要清扫指定设备,例如:

  # zpool clear tank c1t0d0

  5、替换存储池里的设备

  用“zpool replace”命令替换池中设备,例如:

  # zpool replace tank c1t1d0 c1t2d0

  c1t1d0 被 c1t2d0 替换

  注意:如果是mirror或者RAID-Z,替换设备的容量必须大于或等于所有设备最小容量!

  查询ZFS存储池的状态

  1、ZFS存储池的基本信息

  用“zpool list”命令查看存储池的基本信息,例如:

  # 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: The name of the pool.

  SIZE: The total size of the pool, equal to the sum of the size of all top-level virtual

  devices.

  USED: The amount of space allocated by all datasets and internal metadata. Note that

  this amount is different from the amount of space as reported at the file system level.

  AVAILABLE: The amount of unallocated space in the pool.

  CAPACITY (CAP): The amount of space used, expressed as a percentage of total space.

  HEALTH: The current health status of the pool.

  ALTROOT: The alternate root of the pool, if any.

  可以通过指定名字来查看某一个池的状态,例如:

  # zpool list tank

  NAME SIZE USED AVAIL CAP HEALTH ALTROOT

  tank 80.0G 22.3G 47.7G 28% ONLINE -

  

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯