在 /etc/apt/sources.list 里添加 contrib 仓库之后,执行 apt install zfsutils-linux
进行安装。
安装过程会往内核里加入 ZFS 支持。
zpool create <pool_name> <pool_type> <device_name>
创建一个存储池。
zpool attach <pool_name> <device_in_pool> <device_name>
向池中添加一个设备使 /strip* 变成 mirror 。
zpool detach <pool_name> <pool_device_name>
让一个池中的设备脱离池。
zpool remove <pool_name> <pool_device_name>
从一个池中删除一个设备。
zpool offline <pool_name> <device_name>
让一个池中的设备离线。
zpool scrub <pool_name>
同步池中的数据后,检测池中数据的错误并修复。
zpool add <zpool_name> log <device>
给没有 SLOG 设备的池添加一个 SLOG 设备。
zpool attach <zpool_name> <log_device> <device>
向已有一个 SLOG 设备的池添加另一个 SLOG 设备使之互为镜像。
zpool add <zpool_name> log mirror <device_a> <device_b>
直接添加两个互为镜像的 SLOG 设备。
创建快照后,文件系统变成只读,只有文件块的引用改变后,zfs 才会使用硬盘空间记录被改变的文件块。
快照无法被直接使用,但可以被克隆、备份与回滚。
创建一个叫 datapool 的池:
# zpool create datapool mirror /dev/sdb /dev/sdc
# zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
datapool 1.98G 65K 1.98G - 0% 0% 1.00x ONLINE -
创建一个新的文件系统并挂载:
# zfs create datapool/docs -o mountpoint=/docs
# zfs list -r datapool
NAME USED AVAIL REFER MOUNTPOINT
datapool 93.5K 1.92G 19K /datapool
datapool/docs 19K 1.92G 19K /docs
快照名称格式为 <filesystem-name>@<snap-name>
或 <volume-name>@<snap-name>
。创建快照:
# zfs snapshot datapool/docs@version1
# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
datapool/docs@version1 0 - 19.5K -
datapool/docs 文件系统的一个名为 version1 的快照创建完成。
删除一个快照:
# zfs destroy datapool/docs@version1
# zfs list -t snapshot
no datasets available
模拟操作,先创建一个文件:
# echo "version 1" > /docs/data.txt
# cat /docs/data.txt
version 1
创建快照:
# zfs snapshot datapool/docs@version1
# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
datapool/docs@version1 9K - 19.5K -
改变 /docs/data.txt 的内容:
# echo "version 2" > /docs/data.txt
# cat /docs/data.txt
version 2
回滚到 version1 快照:
# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
datapool/docs@version1 9.50K - 19.5K -
# zfs rollback datapool/docs@version1
# cat /docs/data.txt
version 1
重命名快照:
# zfs rename datapool/docs@version1 datapool/docs@version2
# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
datapool/docs@version2 9.50K - 19.5K -
注意: 当一个 dataset 存在快照时,无法直接删除。但可使用 -r 参数强制删除。
# zfs destroy datapool/docs
cannot destroy 'datapool/docs': filesystem has children
use '-r' to destroy the following datasets:
datapool/docs@version2
# zfs destroy -r datapool/docs
# zfs list -t snapshot
no datasets available
克隆是一个可写卷或文件系统,其初始内容与被克隆的数据集相同。
克隆只能从快照中创建,在删除克隆以前,对应的快照无法删除。
创建一个克隆先要创建一个快照:
# zfs create datapool/docs -o mountpoint=/docs
# zfs list -r datapool
NAME USED AVAIL REFER MOUNTPOINT
datapool 93.5K 1.92G 19K /datapool
datapool/docs 19K 1.92G 19K /docs
# mkdir /docs/folder{1..5}
# ls /docs/
folder1 folder2 folder3 folder4 folder5
# zfs snapshot datapool/docs@today
# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
datapool/docs@today 0 - 19K -
从快照创建一个克隆:
# zfs clone datapool/docs@today datapool/pict
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
datapool 166K 1.92G 19K /datapool
datapool/docs 19K 1.92G 19K /docs
datapool/pict 1K 1.92G 19K /datapool/pict
在克隆线程结束以后,基于快照 datapool/docs@today 的数据已被克隆到 datapool/pict。此时 datapool/pict 与 datapool/docs 中的数据相同:
# ls /datapool/pict
folder1 folder2 folder3 folder4 folder5
在删除克隆以前,对应的快照无法删除:
# zfs destroy datapool/docs@today
cannot destroy 'datapool/docs@today': snapshot has dependent clones
use '-R' to destroy the following datasets:
datapool/pict
要先删快照:
# zfs destroy datapool/pict
再删克隆:
# zfs destroy datapool/docs@today
# zfs list -t snapshot
no datasets available
ZFS 池复制基于快照实现。快照可以随时被创建,数量不限。通过不断创建、传输和恢复快照,可以实现在一台或机器间同步池中数据。ZFS提供了一个内置的序列化功能,可以将数据以 stream 的形式发送到标准输出。
创建备份池:
# zpool create backuppool mirror sde sdf
# zpool list
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
backuppool 1.98G 50K 1.98G - 0% 0% 1.00x ONLINE -
datapool 1.98G 568K 1.98G - 0% 0% 1.00x ONLINE -
检查池信息:
# zpool status
pool: datapool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
datapool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
errors: No known data errors
pool: backuppool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
backuppool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0
errors: No known data errors
给要备份的 dataset 创建一个快照:
# zfs snapshot datapool/docs@today
# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
datapool/docs@today 0 - 19K -
# ls /docs/
folder1 folder2 folder3 folder4 folder5
复制开始:
# zfs send datapool/docs@today | zfs receive backuppool/backup
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
backuppool 83K 1.92G 19K /backuppool
backuppool/backup 19K 1.92G 19K /backuppool/backup
datapool 527K 1.92G 19K /datapool
datapool/docs 19K 1.92G 19K /docs
# ls /backuppool/backup
folder1 folder2 folder3 folder4 folder5
把数据复制到其它机器:
# zfs send datapool/docs@today | ssh otherserver zfs recv backuppool/backup