分类: 服务器与存储
2010-09-12 22:12:53
第一次关注ZFS,当时还做了一些记录。而第一次见到FUSE,则是在看到ZFS后的13天后,这两者都让我很兴奋,前者宣告这是世界上最后一个文件系统,可以丢弃我一直都认为是鸡肋的fsck。而后者提供了一种崭新的思路。文件系统不在定位在kernel层次,可扩展性增加了很多,看看那些应用:sshfs,gmailfs,bluetoothfs,似乎什么都可以统一到文件系统上来。
而前几天,我终于看到了FUSE和ZFS的接合体–zfs-fuse。非常兴奋,立刻下载了所需的代码。
只是这几天一直瞎忙,直到今天才粗略看了一下,很酷,今天只是玩了玩,当时看到的那个zfs flash动画里的演示。接下来,我准备用户实际工作中,在上面放一些平常的数据,看是否真的不需要fsck。
下面是我的记录,和大家共享:
从官方站点下载了zfs-fuse,当然前提是你得先下载编译fuse,fuse的安装编译这里不说了。以前的帖子说过了。
#tar -vxzf zfs-fuse-0.4.0_beta1.tgz
#cd zfs-fuse-0.4.0_beta1
进到这里,发现和以前下载的源代码有点不一样,没有看到熟悉的configure或Makefile文件。cd src后,也没有看到。
奇怪了,那怎么编译呀。
只好回到顶层目录,看INSTALL文件,这才知道,他使用了scons工具。这是第一次看到这个编译构建工具,不过也来不及去研究他了,从官方站点下载scons,tar,make,make install,搞定。
#cd src
#scons
#scons install
哈哈,fuse-zfs的编译安装算搞定了。
接着就是玩玩了,我没有多余的设备了,这里我测试了两种方式,一种是文件镜像,一种创建一个mdp0设备。有关创建,希望这篇有关虚拟磁盘能给你提供帮助。
在运行下面的所有命令之前,记得先运行zfs的daemon程序
#zfs-fuse &
首先创建一个pool。
[root@mlsx ~]# zpool create tank mdp0
[root@mlsx ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/hda5 6938770 3784878 2795645 58% /
tank 6031811 25 6031786 1% /tank
立刻创建一个tank的存储词,并自动挂载到/tank目录下,用zpool list命令可以看到稍微详细的内容。
[root@mlsx ~]# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 5.84G 89K 5.84G 0% ONLINE -
这仅仅是创建了存储池,接下来即使创建zfs文件系统了
[root@mlsx ~]# zfs create tank/wgzhao
[root@mlsx ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/hda5 6.7G 3.7G 2.7G 58% /
tank 5.8G 25K 5.8G 1% /tank
tank/wgzhao 5.8G 1.5K 5.8G 1% /tank/wgzhao
[root@mlsx ~]# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 5.84G 125K 5.84G 0% ONLINE -
[root@mlsx ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 116K 5.75G 25.5K /tank
tank/wgzhao 24.5K 5.75G 24.5K /tank/wgzhao
上面的步骤就创建了一个名为wgzhao的zfs文件系统,并自动挂载到/tank/wgzhao目录下。其大小就是当前存储池tank的大小。现在你可以写入一些数据到这个目录下。
[root@mlsx ~]# cp -a /boot/grub/* /tank/wgzhao/
[root@mlsx ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 498K 5.75G 25.5K /tank
tank/wgzhao 406K 5.75G 406K /tank/wgzhao
也可以很轻松的给wgzhao设置配额
[root@mlsx ~]# zfs set quota=2G tank/wgzhao
[root@mlsx ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 498K 5.75G 25.5K /tank
tank/wgzhao 406K 2.00G 406K /tank/wgzhao
上面的命令就是把wgzhao设置为2G大小。
我们可以继续创建文件系统
[root@mlsx ~]# zfs create tank/
[root@mlsx ~]# zfs create tank/wgzhao/prj1
[root@mlsx ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 536K 5.75G 27.5K /tank
tank/lancy 24.5K 5.75G 24.5K /tank/lancy
tank/wgzhao 408K 2.00G 406K /tank/wgzhao
tank/wgzhao/prj1 1.50K 2.00G 1.50K /tank/wgzhao/prj1
创建的lancy系统,其使用的空间大小仍然是存储池的大小,wgzhao下面的prj1继承了上层的属性。
这是zfs的很重要的概念,文件系统是可以分层的。
而目前的ext3似乎还做不到这点吧。
我们也可以对某个文件系统创建快照
[root@mlsx ~]# zfs snapshot tank/wgzhao@mlsx
[root@mlsx ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 560K 5.75G 27.5K /tank
tank/lancy 24.5K 5.75G 24.5K /tank/lancy
tank/wgzhao 432K 2.00G 407K /tank/wgzhao
tank/wgzhao@mlsx 0 - 407K -
tank/wgzhao/prj1 24.5K 2.00G 24.5K /tank/wgzhao/prj1
创建快照的方式是在需要创建快照的文件系统后面增加@name这样的方式。
快照可以导入,导出,克隆。
存储池也可以像LVM那样导入(import),导出(export)。
[root@mlsx ~]# zpool export tank
[root@mlsx ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/hda5 6938770 3784847 2795676 58% /
[root@mlsx ~]# zpool list
no pools available
导出时,会自动强制卸载文件系统,并在存储池中不在可见。
我们再导入试试:
[root@mlsx ~]# zpool import -a
[root@mlsx ~]# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 5.84G 563K 5.84G 0% ONLINE -
[root@mlsx ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/hda5 6.7G 3.7G 2.7G 58% /
tank 5.8G 28K 5.8G 1% /tank
tank/lancy 5.8G 25K 5.8G 1% /tank/lancy
tank/wgzhao 2.0G 407K 2.0G 1% /tank/wgzhao
tank/wgzhao/prj1 2.0G 25K 2.0G 1% /tank/wgzhao/prj1
导入时加-a的参数表示导入后激活。
我们也可以采取镜像文件来创建存储池,但是有些命令就需要增加一些参数了。
[root@mlsx ~]# zpool create morpheus /tmp/hdb.img /tmp/hdc.img
[root@mlsx ~]# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
morpheus 390M 89K 390M 0% ONLINE -
tank 5.84G 563K 5.84G 0% ONLINE -
[root@mlsx ~]# zpool status morpheus
pool: morpheus
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
morpheus ONLINE 0 0 0
/tmp/hdb.img ONLINE 0 0 0
/tmp/hdc.img ONLINE 0 0 0
errors: No known data errors
在导入的时候,于使用设备不同,因为不加参数的时候,它默认从/dev下面搜寻设备,如果你的介质不在/dev下面,那就需要给出路径参数
[root@mlsx ~]# zpool export morpheus
[root@mlsx ~]# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 5.84G 563K 5.84G 0% ONLINE -
[root@mlsx ~]# zpool import
no pools available to import
[root@mlsx ~]# zpool import -d /tmp -a
pool: morpheus
id: 535297632074934303
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
morpheus ONLINE
/tmp/hdb.img ONLINE
/tmp/hdc.img ONLINE
[root@mlsx ~]# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
morpheus 390M 89K 390M 0% ONLINE -
tank 5.84G 563K 5.84G 0% ONLINE -
销毁一个存储池也简单
[root@mlsx ~]# zpool destroy morpheus
[root@mlsx ~]# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 5.84G 563K 5.84G 0% ONLINE -
这种销毁方式并不是真的销毁,我们可以很简单的恢复
[root@mlsx ~]# zpool import -D -d /tmp -a
pool: morpheus
id: 535297632074934303
state: ONLINE (DESTROYED)
action: The pool can be imported using its name or numeric identifier.
The pool was destroyed, but can be imported using the ‘-Df’ flags.
config:
morpheus ONLINE
/tmp/hdb.img ONLINE
/tmp/hdc.img ONLINE
[root@mlsx ~]# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
morpheus 390M 89K 390M 0% ONLINE -
tank 5.84G 563K 5.84G 0% ONLINE -
同时我们可以创建镜像存储池
[root@mlsx ~]# zpool create tank mirror /tmp/hdb.img /tmp/hdc.img
[root@mlsx ~]# zpool status -v tank
pool: tank
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror ONLINE 0 0 0
/tmp/hdb.img ONLINE 0 0 0
/tmp/hdc.img ONLINE 0 0 0
errors: No known data errors
因为有了镜像存储池,我们就可以让某一个存储池offline
[root@mlsx ~]# zpool offline tank /tmp/hdb.img
Bringing device /tmp/hdb.img offline
[root@mlsx ~]# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 195M 92K 195M 0% DEGRADED -
[root@mlsx ~]# zpool offline tank /tmp/hdc.img
cannot offline /tmp/hdc.img: no valid replicas
[root@mlsx ~]# zpool online tank /tmp/hdb.img
Bringing device /tmp/hdb.img online
最后一个介质是无法offline的
如果存储池的一个设备有问题,我们可以在线替换
[root@mlsx ~]# zpool replace tank /tmp/hdb.img mdp0
[root@mlsx ~]# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 195M 91K 195M 0% ONLINE -
[root@mlsx ~]# zpool status -v tank
pool: tank
state: ONLINE
scrub: resilver completed with 0 errors on Tue Jun 19 19:04:29 2007
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror ONLINE 0 0 0
mdp0 ONLINE 0 0 0
/tmp/hdc.img ONLINE 0 0 0
errors: No known data errors
不过像上面的替换是不划算的,因为hdb.img,hdc.img组成了镜像,因此新加入的mpd0只能之用hdc.img同样的空间–200M,虽然mdp0有6G空间。
我们也可以在创建存储池后,陆续添加磁盘设备,以增加可用空间。
[root@mlsx ~]# zpool create tank /tmp/hdb.img
[root@mlsx ~]# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 195M 89K 195M 0% ONLINE -
[root@mlsx ~]# zpool add tank /tmp/hdc.img
[root@mlsx ~]# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 390M 91K 390M 0% ONLINE -
[root@mlsx ~]# zpool add tank mdp0
invalid vdev specification
use ‘-f’ to override the following errors:
mismatched replication level: pool uses file and new vdev is disk
因为/dev/mdp0是实际设备,而hdb.img,hdc.img是文件镜像,因此默认是不允许这样添加的。但是霸王硬上弓也不是不可以
[root@mlsx ~]# zpool add tank mdp0 -f
[root@mlsx ~]# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
tank 6.22G 95K 6.22G 0% ONLINE -
只是不知道这样的读写效率会如何?
zfs没有了fsck,但是也可用做数据完整性检查,最简单的方式是运行zpool scrub
[root@mlsx ~]# zpool scrub tank
[root@mlsx ~]# zpool status -v tank
pool: tank
state: ONLINE
scrub: scrub completed with 0 errors on Tue Jun 19 19:13:22 2007
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
/tmp/hdb.img ONLINE 0 0 0
/tmp/hdc.img ONLINE 0 0 0
mdp0 ONLINE 0 0 0
errors: No known data errors
status能显示scrub的结果。
对于zfs为什么不需要fsck程序,其官方管理文档中有一段解释,摘录如下:
对于ZFS,不存在与fsck 等效的实用程序。此实用程序一直以来用于两个目的:数据修复和数据验证。
数据修复
对于传统的文件系统,写入数据的方法本身容易出现导致数据不一致的意外故障。由于传统的文件系统不是事务性的,因此可能会出现未引用的块、错误的链接计数或其他不一致的数据结构。添加日志记录确实解决了其中的一些问题,但是在无法回滚日志时可能会带来其他问题。对于ZFS,这些问题都不存在。磁盘上存在不一致数据的唯一原因是出现硬盘故障(在这种情况下,应该已复制池)或ZFS 软件中存在错误。
假定fsck 实用程序设计用于修复特定于单独文件系统的已知异常,为没有已知反常的文件系统编写这样的实用程序就是不可能的。将来的经验可能证明某些数据损坏问题是足够常见、足够简单的,以致于可以开发修复实用程序,但是使用复制的池始终可以避免这些问题。
如果未复制池,则数据损坏造成无法访问某些或所有数据的可能性将始终存在。
数据验证
除了数据修复外,fsck 实用程序还验证磁盘上的数据是否没有问题。过去,此任务是通过取消挂载文件系统再运行fsck 实用程序执行的,在该过程中可能会使系统进入单用户模式。此情况导致的停机时间的长短与所检查文件系统的大小成比例。ZFS 提供了一种对所有数据执行常规检查的机制,而不是要求显式实用程序执行必要的检查。此功能称为清理,在内存和其他系统中经常将它用作一种在错误导致硬盘或软件故障之前检测和防止错误的方法。
fuse-zfs还有一些功能并没有在当前这个版本上实现。另外zfs还有许多高级功能,比如数据同步,远程快照复制等。今天没有时间继续玩这个了。
先到这里吧。
接下来就想把这个文件系统用于我日常的办公中。不过我现在剩下的空间只有从LVM中去划一部分了。这样一来,我为了写一个文件,代价可不小,先透过zfs,然后是fuse,然后是lvm,然后才是disk。想想效率应该不会怎么样。
应该考虑一个单独的分区来测试。
期待我重装系统吧。
最后送给大家一个大礼包
,省去大家寻找的时间了。
原文链接: