- 论坛徽章:
- 0
|
第三章 使用ZFS进行快照或者克隆
3.1 快照 snapshot
快照是对于文件系统的记录,ZFS能够使用快照对文件系统进行备份。快照不能够被访问,但是可以通过对快照进行克隆、备份、回滚的操作。
3.1.1 创建和销毁快照
zfs snapshot命令用来创建文件系统的快照。快照的名称都有一个@符号。
# zfs snapshot yz/3@1
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 2.53G 198G 36.7K /yz
yz/3 2.53G 198G 2.53G /yz/3
yz/3@1 0 - 2.53G - 快照生成,而且不占空间
# cd /yz
# du -sh .
2.5G . 验证快照不占存储空间
# zfs destroy yz/3@1
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 2.53G 198G 36.7K /yz
yz/3 2.53G 198G 2.53G /yz/3
-r参数用来对文件系统及其子文件系统进行快照
# zfs snapshot yz/3@A
# zfs list -r
NAME USED AVAIL REFER MOUNTPOINT
yz 2.53G 198G 36.7K /yz
yz/3 2.53G 198G 2.53G /yz/3
yz/3@A 0 - 2.53G -
yz/3/1 36.7K 198G 36.7K /yz/3/1
# zfs snapshot -r yz/3@B
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 2.53G 198G 36.7K /yz
yz/3 2.53G 198G 2.53G /yz/3
yz/3@A 0 - 2.53G -
yz/3@B 0 - 2.53G -
yz/3/1 36.7K 198G 36.7K /yz/3/1
yz/3/1@B 0 - 36.7K -
包含快照的文件系统需要使用-r选项才能被destroy
# zfs destroy yz/3
cannot destroy 'yz/3': filesystem has children
use '-r' to destroy the following datasets:
yz/3/1@B
yz/3/1
yz/3@A
yz/3@B
3.1.2 快照的显示和重命名
显示和访问快照
使用zfs list –t snapshot显示所有的快照
# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
yz/2@A 0 - 2.53G -
yz/2@B 0 - 2.53G -
yz/2@AAA 0 - 2.53G -
yz/2/1@ABC 0 - 36.7K -
yz/2/1@AAA 0 - 36.7K -
重命名功能可以更好的管理快照
# zfs rename yz/3/1@B ABC
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 2.53G 198G 36.7K /yz
yz/3 2.53G 198G 2.53G /yz/3
yz/3@A 0 - 2.53G -
yz/3@B 0 - 2.53G -
yz/3/1 36.7K 198G 36.7K /yz/3/1
yz/3/1@ABC 0 - 36.7K -
《Solaris 10 ZFS管理指南》上面说可以使用-r参数,但是我使用08/07还不支持。
3.1.3 使用快照回滚
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 2.53G 198G 36.7K /yz
yz/2 2.53G 198G 2.53G /yz/2
# cd /yz/2
# ls
1 sadm
# rm -r sadm
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 2.54G 198G 36.7K /yz
yz/2 2.53G 198G 38.2K /yz/2 REFER为38.2K说明的确已经将目录删除
yz/2@A 0 - 2.53G -
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 2.54G 198G 36.7K /yz
# pwd
/yz/2
# du -sh .
4K .
# cd ..
# du -sh .
5K .
根文件系统仍然使用了2.54G说明数据被保留了
yz/2 2.53G 198G 38.2K /yz/2
yz/2@A 0 - 2.53G -
yz/2@B 0 - 2.53G -
下面进行回滚实验
# zfs rollback yz/2@A
cannot rollback to 'yz/2@A': more recent snapshots exist
use '-r' to force deletion of the following snapshots:
yz/2@B
yz/2@AAA
回滚不成功,系统提示使用-r参数来执行。这是因为快照yz/2@A是先于yz/2@B
和yz/2@AAA创建的,要还原到yz/2@A就必须使用-r选项,并且在执行该选项的时候系统会删除掉最近的两个快照。
# zfs rollback -r yz/2@A
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 2.53G 198G 36.7K /yz
yz/2 2.53G 198G 2.53G /yz/2
yz/2@A 0 - 2.53G -
yz/2/1 68.8K 198G 36.7K /yz/2/1
yz/2/1@ABC 0 - 36.7K -
yz/2/1@AAA 0 - 36.7K -
# du -sh .
2.5G .
说明恢复成功。
3.2 克隆
克隆的对象是快照,克隆本身不占空间,只有当发生数据生成或者删除的时候才会增加空间使用量。克隆可以被访问并修改。
3.2.1 创建clone
# zfs clone yz/2 yz/3
cannot open 'yz/2': operation not applicable to datasets of this type
# zfs clone yz/2@A yz/3
# zfs clone yz/2@A yz/3
/yz/2#zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 2.53G 198G 36.7K /yz
yz/2 2.53G 198G 2.53G /yz/2
yz/2@A 0 - 2.53G -
yz/2/1 68.8K 198G 36.7K /yz/2/1
yz/2/1@ABC 0 - 36.7K -
yz/2/1@AAA 0 - 36.7K -
yz/3 0 198G 2.53G /yz/3
/yz/2#du -sh *
2.5G 2
2.5G 3
du –sh .看到的/yz目录占用了5G多的空间,但是zfs list看到的只有2.53G。对于zfs文件系统来说,使用zfs list看到的使用要du –sh .科学。
# mkfile 512m sun
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 3.03G 197G 36.7K /yz
yz/2 2.53G 197G 2.53G /yz/2
yz/2@A 2.02M - 2.53G -
yz/2/1 68.8K 197G 36.7K /yz/2/1
yz/2/1@ABC 0 - 36.7K -
yz/2/1@AAA 0 - 36.7K -
yz/3 514M 197G 3.03G /yz/3
# zfs set quota=5G yz/3
clone可以被修改文件和属性。
3.2.2 删除clone
使用zfs destroy 命令删除clone
# zfs destroy yz/3
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 2.53G 198G 36.7K /yz
yz/2 2.53G 198G 2.53G /yz/2
yz/2@A 2.03M - 2.53G -
yz/2/1 68.8K 198G 36.7K /yz/2/1
yz/2/1@ABC 0 - 36.7K -
yz/2/1@AAA 0 - 36.7K -
3.2.3 使用clone来代替文件系统
尽管clone可以被访问被修改,但是clone并经不是一个独立的文件系统。他不过是一个可以被修改的快照而已。如果其强制删除,clone一样会丢失。
# zfs clone yz/2@A yz/4
# zfs destroy yz/2@A
cannot destroy 'yz/2@A': snapshot has dependent clones
use '-R' to destroy the following datasets:
# zfs destroy -R yz/2@A
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 2.53G 198G 36.7K /yz
yz/2 2.53G 198G 2.53G /yz/2
yz/2/1 36.7K 198G 36.7K /yz/2/1
这是 zfs list已经看不到yz/4这个文件系统了
yz/4但是clone在被手动promote之后可以成为独立的文件系统,并且其clone出的快照将被重命名被挂在promote后的文件系统名下。
# zfs snapshot yz/2@C
# zfs clone yz/2@C yz/C
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 2.53G 198G 36.7K /yz
yz/2 2.53G 198G 2.53G /yz/2
yz/2@C 0 - 2.53G -
yz/2/1 36.7K 198G 36.7K /yz/2/1
yz/C 0 198G 2.53G /yz/C
# zfs promote yz/C
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 2.53G 198G 36.7K /yz
yz/2 36.7K 198G 2.53G /yz/2
yz/2/1 36.7K 198G 36.7K /yz/2/1
yz/C 2.53G 198G 2.53G /yz/C
yz/C@C 0 - 2.53G -
对clone进行promote操作之后,它就变成了一个独立的文件系统,并且文件系统的使用量仍然没有上升。说明其中的数据还是在和原来的yz/2在共享。数据并没有被独立,相当于还是一个链接。我们可以通过inode来对其进行验证。
# ls -li
total 80
7 dr-xr-xr-x 4 root root 8 Oct 14 14:56 install
15 dr-xr-xr-x 1185 root root 1185 Oct 14 14:58 pkg
22763 dr-xr-xr-x 2 root root 2 Oct 14 14:58 security
22756 drwxr-xr-x 5 root root 5 Oct 14 14:58 spool
22764 drwxr-xr-x 5 root root 5 Oct 14 14:58 wbem
# pwd
/yz/2/sadm
# ls -li
total 80
7 dr-xr-xr-x 4 root root 8 Oct 14 14:56 install
15 dr-xr-xr-x 1185 root root 1185 Oct 14 14:58 pkg
22763 dr-xr-xr-x 2 root root 2 Oct 14 14:58 security
22756 drwxr-xr-x 5 root root 5 Oct 14 14:58 spool
22764 drwxr-xr-x 5 root root 5 Oct 14 14:58 wbem
# cd /yz/C/sadm
# ls -li
total 80
7 dr-xr-xr-x 4 root root 8 Oct 14 14:56 install
15 dr-xr-xr-x 1185 root root 1185 Oct 14 14:58 pkg
22763 dr-xr-xr-x 2 root root 2 Oct 14 14:58 security
22756 drwxr-xr-x 5 root root 5 Oct 14 14:58 spool
22764 drwxr-xr-x 5 root root 5 Oct 14 14:58 wbem
通过验证发现目录的inode号完全一致,说明的确是在调用相同的文件。
3.3 快照的保存和恢复
3.3.1 快照的保存
快照可以通过zfs send命令将快照转化成一个文件进行保存,并且可以通过增量保存来减少对存储空间的浪费。
做一个0级备份的实验,创建一个快照并zfs send。
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 2.53G 198G 36.7K /yz
yz/2 7.31M 198G 2.53G /yz/2
yz/2/1 36.7K 198G 36.7K /yz/2/1
yz/C 2.53G 198G 2.53G /yz/C
yz/C@C 56.1K - 2.53G -
# zfs send yz/C@C d
too many arguments
usage:
send [-i <snapshot>] <snapshot>
For the property list, run: zfs set|get
# zfs send yz/C@C
Error: Stream can not be written to a terminal.
You must redirect standard output.
# zfs send yz/C@C > /tmp/snapshotyzC@C
# ls -lh /tmp/snapshotyzC@C
-rw-r--r-- 1 root root 2.5G Oct 15 09:26 /tmp/snapshotyzC@C
可以看到快照文件和快照的大小是基本一致的,对于生成的快照文件也可以通过gzip来压缩。接下面做一个增量备份的实验。
# cd /yz/C
# ls
1 sadm
# mkfile 512m test 创建一个512m的文件来制造增量
# zfs snapshot yz/C@D
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 3.03G 197G 36.7K /yz
yz/C 3.03G 197G 3.03G /yz/C
yz/C@C 57.6K - 2.53G -
yz/C@D 0 - 3.03G -
# cp /tmp/snapshotyzC@C /tmp/snapshotyzC@C.bak
# zfs send -i yz/C@C yz/C@D>/tmp/snapshotyzC@C
# ls -lh /tmp/snapshotyzC@C
-rw-r--r-- 1 root root 513M Oct 15 09:35 /tmp/snapshotyzC@C
可以看到增量快照文件的大小和文件增量基本一致,下来验证两个快照文件如何以及是否能够成功恢复。
3.3.2 使用快照文件恢复文件系统
首先恢复最早的快照备份,然后再进行增量恢复。
# zfs destroy yz/C@D
# zfs destroy yz/C@C
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 3.03G 197G 36.7K /yz
yz/C 3.03G 197G 3.03G /yz/C
# zfs receive yz/C@C < /tmp/snapshotyzC@C.bak
cannot receive: destination 'yz/C' exists
Note:08年4月的《Solaris ZFS管理指南上有这样的命令,即将快照文件恢复成快照,但我的08/07的Solaris不支持。
# zfs receive yz/CC < /tmp/snapshotyzC@C.bak (2.53G)
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 5.55G 195G 36.7K /yz
yz/C 3.03G 195G 3.03G /yz/C
yz/CC 2.53G 195G 2.53G /yz/CC
yz/CC@C 0 - 2.53G -
# zfs receive yz/CC < /tmp/snapshotyzC@C (513M)
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 6.05G 194G 36.7K /yz
yz/C 3.03G 194G 3.03G /yz/C
yz/CC 3.03G 194G 3.03G /yz/CC
yz/CC@C 57.6K - 2.53G -
yz/CC@D 0 - 3.03G -
再到目录下看看恢复的文件是否一致。
# cd /yz/CC
# ls
1 sadm test
# du -sh .
3.0G .
# cd /yz/C
# du -sh .
3.0G .
# ls
1 sadm test
这样就成功的使用快照文件对文件系统进行了恢复。
附录:ZFS卷
使用zfs create命令可以创ZFS 卷。卷可以被操作系统当作普通的卷来使用,可以被newfs,可以被mount,并且ZFS只把它生出来不抚养他成人。
使用zfs create –V 参数创建ZFS 卷。
# zfs create -V 10Gb yz/vol1
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 15.6G 185G 36.7K /yz
yz/C 3.03G 185G 3.03G /yz/C
yz/D 2.53G 185G 2.53G /yz/D
yz/D@C 0 - 2.53G -
yz/vol1 33.7K 195G 33.7K -
卷的实际大小为10Gb,但是zfs list显示的大小却是195,感觉这里不理解为什么这么设置,也许Sun需要再下一个版本里对其进行更新。
# newfs /dev/zvol/rdsk/yz/vol1
/dev/zvol/rdsk/yz/vol1: Unable to find Media type. Proceeding with system determined parameters.
newfs: construct a new file system /dev/zvol/rdsk/yz/vol1: (y/n)? y
Warning: 4096 sector(s) in last cylinder unallocated
/dev/zvol/rdsk/yz/vol1: 20971520 sectors in 3414 cylinders of 48 tracks, 128 sectors
10240.0MB in 214 cyl groups (16 c/g, 48.00MB/g, 5824 i/g) 这里可以确定卷的大小的确是10Gb
super-block backups (for fsck -F ufs -o b=#) at:
32, 98464, 196896, 295328, 393760, 492192, 590624, 689056, 787488, 885920,
20055584, 20154016, 20252448, 20350880, 20449312, 20547744, 20646176,
20744608, 20843040, 20941472
# mount -F ufs /dev/zvol/dsk/yz/vol1 /mnt
# df -h
Filesystem size used avail capacity Mounted on
/dev/zvol/dsk/yz/vol1
9.8G 10M 9.7G 1% /mnt
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
yz 26.6G 174G 36.7K /yz
yz/C 3.03G 174G 3.03G /yz/C
yz/D 2.53G 174G 2.53G /yz/D
yz/D@C 0 - 2.53G -
yz/vol1 162M 184G 162M -
也可以把ZFS卷用作添加swap空间。
# zfs create -V 10gb yz/vol2
# swap -a /dev/zvol/dsk/yz/vol2
# swap -l
swapfile dev swaplo blocks free
/dev/dsk/c1t0d0s1 118,1 16 16780208 15508064
/dev/dsk/c1t1d0s1 118,9 16 16780208 15512912
/dev/zvol/dsk/yz/vol2 256,2 16 20971504 20971504
# swap -l
swapfile dev swaplo blocks free
/dev/dsk/c1t0d0s1 118,1 16 16780208 15508064
/dev/dsk/c1t1d0s1 118,9 16 16780208 15512912
/dev/zvol/dsk/yz/vol2 256,2 16 20971504 20971504
# swap -s
total: 7880360k bytes allocated + 665488k reserved = 8545848k used, 24986096k available
# swap -d /dev/zvol/dsk/yz/vol2
# swap -s
total: 7880368k bytes allocated + 665480k reserved = 8545848k used, 14500344k available
[ 本帖最后由 sunshiene 于 2008-10-15 10:24 编辑 ] |
|