ZFS 的简单使用

ZFS 被 Sun 称为史上最后一个文件系统,说得一点都不夸张,在 VPSee 看来 ZFS 至少要比现有的其他文件系统领先五年。开发一个全新的文件系统非常耗时,ext4 从2006开始到现在都三年了而且还是在前人的基础上(ext3)开发的,最近 RedHat 发布的 RHEL 5.4 还只是把 ext4 列入 technical preview 的状态,默认的安装文件系统还是 ext3,可见要开发一个可靠的文件系统多么困难,ext4 仍然不够稳定,在系统崩溃时某些条件下可能会造成数据丢失现象。虽然 ZFS 是开放源代码的,由于版权是 CDDL 与 Linux kernel 的 GPL2 冲突,导致 ZFS 不能移植到 Linux 上,FreeBSD 上的 ZFS 移植不完整而且不是很稳定,如果想用 ZFS 的话,建议安装和使用 OpenSolaris,以下操作在 OpenSolaris 2009.06 上执行。

准备工作

先创建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]

评论 (7 Comments)

  1. 请问一下,
    你挂载zfs了吗?
    root@kevin-VirtualBox:/# zfs get mountpoint
    NAME PROPERTY VALUE SOURCE
    mypool mountpoint legacy local
    mypool1 mountpoint /mnt local
    root@kevin-VirtualBox:/# zfs mount
    root@kevin-VirtualBox:/# zfs mount -a
    root@kevin-VirtualBox:/# zfs list
    NAME USED AVAIL REFER MOUNTPOINT
    mypool 336K 63.2M 19K legacy
    mypool1 91K 1.95G 19K /mnt
    root@kevin-VirtualBox:/# zfs get mounted
    NAME PROPERTY VALUE SOURCE
    mypool mounted no –
    mypool1 mounted no –

    还是没挂载上,他也没报错….

  2. 你用的是 OpenSolaris 吧?不需要自己挂载。当创建一个 ZFS 文件系统或启动系统的时候,ZFS 会自动挂载文件系统。zfs mount 只用在需要修改 mount 参数或者明确要求 mount/unmount 文件系统的时候。

  3. 我不是阿 我用的ubuntu, 我知道能自动挂载.
    昨天后来查到 linux对zfs的支持 还不能挂载
    还要建卷 把卷当disk 然后分区… 才能用…

  4. 嗯,现在还不能在 Linux 里直接挂在 ZFS,因为没有 Linux 内核没有提供 ZFS POSIX,所以用户层工具比如 mount 不能完成挂载。

  5. @vpsee
    你创建pool的时候不需要指明是mirror、raidz、raidz2吗?默认是mirror?
    另外,你说的第6块是第5块的镜像,是不是类似于raid中的raid1功能,即便坏了第5块,第6块仍然可以使用,但如果坏的是第5和第6,那这两块硬盘的数据就全部丢失了?
    那整个pool是否有用?

  6. NAME STATE READ WRITE CKSUM
    pool1 ONLINE 0 0 0
    raidz1-0 ONLINE 0 0 0
    ada1 ONLINE 0 0 0
    ada2 ONLINE 0 0 0
    ada3 ONLINE 0 0 0
    ada4 ONLINE 0 0 0

    如果像这样的,第4块硬盘ada4完蛋了,那整个pool就挂了……

  7. ada4 是后来add 上去的,没有在 raidz里

发表评论