ZFS 被 Sun 称为史上最后一个文件系统 , 说得一点都不夸张, 看来 ZFS 至少要比现有的其他文件系统领先五年。开发一个全新的文件系统非常耗时,ext4 从2006开始到现在都三年了而且还是在前人的基础上(ext3)开发的,最近 RedHat 发布的 RHEL 5.4 还只是把 ext4 列入 technical preview 的状态,默认的安装文件系统还是 ext3,可见要开发一个可靠的文件系统多么困难,ext4 仍然不够稳定,在系统崩溃时某些条件下可能会造成数据丢失现象。虽然 ZFS 是开放源代码的,由于版权是 CDDL 与 Linux kernel 的 GPL2 冲突,导致 ZFS 不能移植到 Linux 上,FreeBSD 上的 ZFS 移植不完整而且不是很稳定,如果想用 ZFS 的话,建议安装和使用 OpenSolaris .
准备工作
先创建6个普通文件充当6个硬盘,来看看 ZFS 是如何方便的添加、删除、镜像硬盘的:
# cd /var/tmp # mkfile 100m c0d0 c0d1 c0d2 c1d0 c1d1 c1d2
创建 pool
使用第1块硬盘(c0d0)创建一个 pool:
# zpool create mypool /var/tmp/c0d0 # zpool status pool: mypool state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM mypool ONLINE 0 0 0 /var/tmp/c0d0 ONLINE 0 0 0 errors: No known data errors
创建镜像
在 pool 里添加第2块硬盘(c0d1),并且做成第1块硬盘(c0d0)的镜像:
# zpool attach mypool /var/tmp/c0d0 /var/tmp/c0d1 # zpool status pool: mypool state: ONLINE scrub: resilver completed after 0h0m with 0 errors on Sun Nov 1 15:08:42 2009 config: NAME STATE READ WRITE CKSUM mypool ONLINE 0 0 0 mirror ONLINE 0 0 0 /var/tmp/c0d0 ONLINE 0 0 0 /var/tmp/c0d1 ONLINE 0 0 0 73K resilvered errors: No known data errors
替换硬盘
假设上面第2块硬盘(c0d1)坏了,想用另一块硬盘(c1d0)替换:
# zpool replace mypool /var/tmp/c0d1 /var/tmp/c1d0 # zpool status pool: mypool state: ONLINE scrub: resilver completed after 0h0m with 0 errors on Sun Nov 1 15:11:33 2009 config: NAME STATE READ WRITE CKSUM mypool ONLINE 0 0 0 mirror ONLINE 0 0 0 /var/tmp/c0d0 ONLINE 0 0 0 /var/tmp/c1d0 ONLINE 0 0 0 83.5K resilvered errors: No known data errors
增加硬盘
如果发现上面两块硬盘不够用了,想在 pool 里增加第3块硬盘(c0d1)只需要简单的 zpool add,这时候需要用到 -f 强制选项,因为 pool 里硬盘类型是 mirror 的,而想要增加的硬盘是 file 的,类型不同所以报错,需要强制执行:
# zpool add mypool /var/tmp/c0d1 invalid vdev specification use '-f' to override the following errors: mismatched replication level: pool uses mirror and new vdev is file # zpool add -f mypool /var/tmp/c0d1 # zpool status pool: mypool state: ONLINE scrub: resilver completed after 0h0m with 0 errors on Sun Nov 1 15:11:33 2009 config: NAME STATE READ WRITE CKSUM mypool ONLINE 0 0 0 mirror ONLINE 0 0 0 /var/tmp/c0d0 ONLINE 0 0 0 /var/tmp/c1d0 ONLINE 0 0 0 83.5K resilvered /var/tmp/c0d1 ONLINE 0 0 0 errors: No known data errors
现在用第4块硬盘(c1d1)对第3块硬盘(c0d1)做一个镜像;然后加上第5块硬盘(c0d2)和第6块硬盘(c1d0),其中第6块是第5块的镜像:
# zpool attach mypool /var/tmp/c0d1 /var/tmp/c1d1 # zpool add mypool mirror /var/tmp/c0d2 /var/tmp/c1d2
完成上面的操作以后就会得到类似下面这样的结构,很清晰易懂,c0d0 和 c1d0 是镜像,c0d1 和 c1d1 是镜像,c0d2 和 c1d2 是镜像:
# zpool status pool: mypool state: ONLINE scrub: resilver completed after 0h0m with 0 errors on Sun Nov 1 15:24:51 2009 config: NAME STATE READ WRITE CKSUM mypool ONLINE 0 0 0 mirror ONLINE 0 0 0 /var/tmp/c0d0 ONLINE 0 0 0 /var/tmp/c1d0 ONLINE 0 0 0 mirror ONLINE 0 0 0 /var/tmp/c0d1 ONLINE 0 0 0 /var/tmp/c1d1 ONLINE 0 0 0 14.5K resilvered mirror ONLINE 0 0 0 /var/tmp/c0d2 ONLINE 0 0 0 /var/tmp/c1d2 ONLINE 0 0 0 errors: No known data errors
是不是要比 RAID + LVM + EXT3 简单多了?
校验 pool
最好经常时不时的用 zpool scrub 检查一下 pool 和 checksums:
# zpool scrub mypool
删除 pool
# zpool destroy mypool # rm /var/tmp/c[01]d[012]