19.2. 快速入门

这里有一个启动机制,可让FreeBSD在系统初始化时挂载 ZFS 存储池。要开启这个功能,可加入此行到/etc/rc.conf

zfs_enable="YES"

然后启动服务:

# service zfs start

SCSI 本节的例子会假设有三个SCSI磁盘,名称分别为 SCSI da0da1,和 da2SATA 磁盘 ada

19.2.1. 单磁盘存储池

使用一个磁盘建立一个简单,无备份的存储池:

# zpool create example /dev/da0

要检查这个存储池,可以通过 df 命令:

# df
Filesystem  1K-blocks    Used    Avail Capacity  Mounted on
/dev/ad0s1a   2026030  235230  1628718    13%    /
devfs               1       1        0   100%    /dev
/dev/ad0s1d  54098308 1032846 48737598     2%    /usr
example      17547136       0 17547136     0%    /example

df 的输出结果显示,example 存储池已创建并挂载,它现在是一个可以被读写的文件系统。用户可以在上面写入和读取文件:

# cd /example
# ls
# touch testfile
# ls -al
total 4
drwxr-xr-x   2 root  wheel    3 Aug 29 23:15 .
drwxr-xr-x  21 root  wheel  512 Aug 29 23:12 ..
-rw-r--r--   1 root  wheel    0 Aug 29 23:15 testfile

但这个存储池并没有使用任何 ZFS 的先进特性。若要在这个存储池上开启压缩功能,执行:

# zfs create example/compressed
# zfs set compression=gzip example/compressed

现在我们已经在 example/compressed 数据集上启用 ZFS 的压缩功能。 可以试着复制大文件到 /example/compressed

可以使用以下命令关闭压缩功能:

# zfs set compression=off example/compressed

要卸载当前文件系统,可使用 zfs umount 命令,可用 df 确认操作是否完成:

# zfs umount example/compressed
# df
Filesystem  1K-blocks    Used    Avail Capacity  Mounted on
/dev/ad0s1a   2026030  235232  1628716    13%    /
devfs               1       1        0   100%    /dev
/dev/ad0s1d  54098308 1032864 48737580     2%    /usr
example      17547008       0 17547008     0%    /example

若要再次挂载文件系统,可使用zfs mount命令,然后用df验证操作是否完成:

# zfs mount example/compressed
# df
Filesystem         1K-blocks    Used    Avail Capacity  Mounted on
/dev/ad0s1a          2026030  235234  1628714    13%    /
devfs                      1       1        0   100%    /dev
/dev/ad0s1d         54098308 1032864 48737580     2%    /usr
example             17547008       0 17547008     0%    /example
example/compressed  17547008       0 17547008     0%    /example/compressed

存储池和文件系统也可以通过 mount 命令查询:

# mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1d on /usr (ufs, local, soft-updates)
example on /example (zfs, local)
example/compressed on /example/compressed (zfs, local)

在创建文件系统创建以后 ZFS 可以像其他的文件系统一样使用且可以在它上面启用其他特性。例如创建一个新的,用于存储重要文件的,名为 data的文件系统。所以,每个数据块需要保留两个备份:

# zfs create example/data
# zfs set copies=2 example/data

现在可以用 df 查看磁盘占用:

# df
Filesystem         1K-blocks    Used    Avail Capacity  Mounted on
/dev/ad0s1a          2026030  235234  1628714    13%    /
devfs                      1       1        0   100%    /dev
/dev/ad0s1d         54098308 1032864 48737580     2%    /usr
example             17547008       0 17547008     0%    /example
example/compressed  17547008       0 17547008     0%    /example/compressed
example/data        17547008       0 17547008     0%    /example/data

注意:在存储池中的每个卷有相同的可用空间,卷只使用他们需要的空间(在同一个存储池中),这也是我们在范例中用 df 的原因。ZFS 消除了诸如卷和分区之类的概念,并允许多个文件系统占用相同的存储池。

当我们不再需要时可以删除卷和存储池:

# zfs destroy example/compressed
# zfs destroy example/data
# zpool destroy example

19.2.2. RAID-Z

在日常使用中我们使用 RAID 技术来避免因磁盘损坏而导致数据丢失。ZFS 在存储池设计中使用了类似的技术,名为 RAID-ZRAID-Z 存储池需至少需要三个硬盘。RAID-Z 相比镜像(Mirror)模式有更多的可用空间。

下面这个例子创建了一个 RAID-Z 存储池,并指定要加入这个存储池的硬盘:

# zpool create storage raidz da0 da1 da2

注意:

Sun™ 建议单个 RAID-Z-存储池使用的硬盘数量在3到9之间。若要使用更多的硬盘。可以考虑分成更小的 RAID-Z 群组。 如果只有两个磁盘可考虑组成 ZFS 镜像。请参考 zpool(8) 以获取更多信息。

在先前的例子中已经创建了 storage 存储池(zpool)现在这个例子在该存储池中创建了一个名为 home的文件系统:

# zfs create storage/home

可以启用压缩功能和保留文件副本功能:

# zfs set copies=2 storage/home
# zfs set compression=gzip storage/home

要让这个空间作为使用者的新 home 目录位置,需要复制使用者数据到这个目录并建立适合的符号链接(Symbolic link):

# cp -rp /home/* /storage/home
# rm -rf /home /usr/home
# ln -s /storage/home /home
# ln -s /storage/home /usr/home

现在用户的数据会储存在新建立的 /storage/home。 可以加入新用户并登入该使用者来测试。

试着建立文件系统快照(Snapshot),稍后可用来还原(Rollback):

# zfs snapshot storage/home@08-30-08

只可以对整个卷进行快照,无法对个别目录使用快照。

@ 字符用来区分文件系统(file system)或磁盘区(卷)名称,若有重要的目录意外被删除,文件系统系统可以备份然后还原到先前目录还存在时的快照:

# zfs rollback storage/home@08-30-08

要列出所有可用的快照,在文件系统的 zfs/snapshot 目录下执行 ls。例如插线先前的快照:

# ls /storage/home/.zfs/snapshot

也可以写一个脚本对用户的文件进行定期快照,但随着时间推移可能消耗大量的磁盘空间。先前的快照可以使用以下指令删除:

# zfs destroy storage/home@08-30-08

在测试之后,便可让 /storage/home 成为真正的 /home。使用命令:

# zfs set mountpoint=/home storage/home

执行 dfmount 来确认文件系统是否被挂载于 /home

# mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1d on /usr (ufs, local, soft-updates)
storage on /storage (zfs, local)
storage/home on /home (zfs, local)
# df
Filesystem   1K-blocks    Used    Avail Capacity  Mounted on
/dev/ad0s1a    2026030  235240  1628708    13%    /
devfs                1       1        0   100%    /dev
/dev/ad0s1d   54098308 1032826 48737618     2%    /usr
storage       26320512       0 26320512     0%    /storage
storage/home  26320512       0 26320512     0%    /home

这个动作完成 RAID-Z 最后的设置。 有关已建立的文件系统每日状态更新可以做为 periodic(8) 的一部份在每天晚上执行。加入此行到 /etc/periodic.conf

daily_status_zfs_enable="YES"

19.2.3. 还原RAID-Z

每个软 RAID 都有监控其状态(state)的方式,而 RAID-Z 设备的状态可以使用这个命令来查看:

# zpool status -x

如果所有的存储池都在线(Online)且正常运行, 则显示下列信息:

all pools are healthy

如果发生问题,可能磁盘处于离线(Offline)状态,则此时存储池的状态将可能是:

  pool: storage
 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
	storage     DEGRADED     0     0     0
	  raidz1    DEGRADED     0     0     0
	    da0     ONLINE       0     0     0
	    da1     OFFLINE      0     0     0
	    da2     ONLINE       0     0     0

errors: No known data errors

这表示设备在之前已经被管理人员用以下命令下线:

# zpool offline storage da1

现在系统可以关机然后更换 da1,当系统回复上线,就可以替换掉存储池中故障的磁盘:

# zpool replace storage da1

到此可以再次检查状态,这时不需要使用 -x 来显示所有的存储池:

# zpool status storage
 pool: storage
 state: ONLINE
 scrub: resilver completed with 0 errors on Sat Aug 30 19:44:11 2008
config:

	NAME        STATE     READ WRITE CKSUM
	storage     ONLINE       0     0     0
	  raidz1    ONLINE       0     0     0
	    da0     ONLINE       0     0     0
	    da1     ONLINE       0     0     0
	    da2     ONLINE       0     0     0

errors: No known data errors

在这个例子中,所有磁盘均正常工作。

19.2.4. 数据校验

ZFS 使用校验码(checksums)来验证存储数据的完整性。校验码在文件创建时一起生成。

警告:

校验码(Checksum)可以关闭,但 不建议,校验码只会占用非常少的存储空间来确保数据的完整性。若关闭校验码会使许多 ZFS 功能无法正常工作。关闭校验功能不会使性能有明显的提升。

检验校验码这个动作即所谓的清理(scrubbing),可以使用以下命令来检验 storage 存储池的数据完整性:

# zpool scrub storage

完成清理所需要的时间视数据量的大小而定。较大的数据量将使用更多的时间完成校验,清理会对 I/O 有非常密集的操作且同时只能进行一个清理操作。在清理完成后,可以使用status 来查看状态:

# zpool status storage
 pool: storage
 state: ONLINE
 scrub: scrub completed with 0 errors on Sat Jan 26 19:57:37 2013
config:

	NAME        STATE     READ WRITE CKSUM
	storage     ONLINE       0     0     0
	  raidz1    ONLINE       0     0     0
	    da0     ONLINE       0     0     0
	    da1     ONLINE       0     0     0
	    da2     ONLINE       0     0     0

errors: No known data errors

查询结果会显示上次清理时间来协助判断是否还需要清理,定期清理可以确保数据完整性。

请参考 zfs(8)zpool(8) 来获取 ZFS 更多操作。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.