管理ZFS文件系统(part 2)
ZFS文件系统可以动态创建和销毁,无需分配或格式化任何底层磁盘空间。
查询ZFS文件系统信息
zfs list命令提供用于查看和查询数据集信息的可扩展机制。
列出基本ZFS信息
使用zfs list命令而不包含任何选项的话,可以列出基本的数据集信息。此命令显示系统上所有数据集的名称(name)、使用(used)、可用(available)、引用(referenced)和挂载点(mountpoint)特性的值。
例如:
$ zfs list
users 2.00G 64.9G 32K /users
users/home 2.00G 64.9G 35K /users/home
users/home/kaydo 548K 64.9G 548K /users/home/kaydo
users/home/mork 1.00G 64.9G 1.00G /users/home/mork
users/home/nneke 1.00G 64.9G 1.00G /users/home/nneke
如果在命令后面提供了数据集的名称,则显示指定的数据集的基本信息。另外,使用-r选项可以显示它的所有子数据集;使用-t all显示所有类型的数据集。
例如:
$ zfs list -t all -r users/home/mork
NAME USED AVAIL REFER MOUNTPOINT
users/home/mork 1.00G 64.9G 1.00G /users/home/mork
users/home/mork@yesterday 0 - 1.00G -
users/home/mork@today 0 - 1.00G -
可是在命令后面跟文件系统的挂载点,来显示指定数据集,例如:
$ zfs list /user/home/mork
NAME USED AVAIL REFER MOUNTPOINT
users/home/mork 1.00G 64.9G 1.00G /users/home/mork
下面的例子显示关于tank/home/gina的基本信息,包括它的所有子数据集:
$ zfs list -r users/home/gina
NAME USED AVAIL REFER MOUNTPOINT
users/home/gina 2.00G 62.9G 32K /users/home/gina
users/home/gina/projects 2.00G 62.9G 33K /users/home/gina/projects
users/home/gina/projects/fs1 1.00G 62.9G 1.00G /users/home/gina/projects/fs1
users/home/gina/projects/fs2 1.00G 62.9G 1.00G /users/home/gina/projects/fs2
关于zfs list命令的所有详细资料,可以参考zfs(8) list手册。
创建复杂的ZFS查询
使用-o、 -t、-H选项可以自定义输出结果。
-o选项后面跟属性名称(多个属性应使用逗号分隔),将列出对应属性的值。属性名称及说明参见ZFS属性介绍。
例:
$ zfs list -r -o name,share.nfs,mountpoint users/home
NAME NFS MOUNTPOINT
users/home on /users/home
users/home/kaydo on /users/home/kaydo
users/home/gina on /users/home/gina
users/home/gina/projects on /users/home/gina/projects
users/home/gina/projects/fs1 on /users/home/gina/projects/fs1
users/home/gina/projects/fs2 on /users/home/gina/projects/fs2
users/home/mork on /users/home/mork
users/home/nneke on /users/home/nneke
使用-t选项指定数据集的类型,可用类型有:
- filesystem
- share
- snapshot
- volume
同样的,-t选项后面可以跟多个类型,类型之间以逗号分隔。
例:
$ zfs list -r -t filesystem -o name,used users/home
NAME USED
users/home 4.00G
users/home/kaydo 548K
users/home/gina 2.00G
users/home/gina/projects 2.00G
users/home/gina/projects/fs1 1.00G
users/home/gina/projects/fs2 1.00G
users/home/mork 1.00G
users/home/nneke 1.00G
-H选项将在输出结果中不显示标题行,且所有空白将替换为制表符。当需要可解析的输出结果时可以用这个选项。
例:
$ zfs list -r -H -o name users/home
users/home
users/home/kaydo
users/home/gina
users/home/gina/projects
users/home/gina/projects/fs1
users/home/gina/projects/fs2
users/home/mork
users/home/nneke
列出残缺的ZFS数据集
当运行zfs receive启动的数据集传输中断时,会残留一个不完整的数据集。这些数据集的状态可能是接收状态,也可能是可恢复状态。-I选项后可跟all|resumabel|receiving参数。
$ zfs list -I all
NAME USED AVAIL REFER TYPE STATE
users/home/dst 189M 910G 189M volume resumable
也可以用以下命令仅显示可恢复数据集的名称:
$ zfs list -HI resumable
users/home/dst
使用zfs list命令创建可解析输出
-o和-p选项一起使用,可以创建精确的机器可解析数字输出。
例:
$ zfs list -o guid users/home
GUID
3.30E
$ zfs list -po guid users/home
GUID
3807001345661527925
top
管理ZFS属性
数据集的属性通过zfs命令的子命令set(设置)、inherit(继承)、get(查询)进行管理。
设置ZFS属性
使用zfs set命令可以修改数据集中任意可设置的属性。也可以在使用zfs create命令创建数据集时设置属性。
属性赋值的格式为:property=value。使用zfs set命令每次只能设置或修改一个属性。
例:
$ zfs set atime=off tank/home
创建文件系统时设置属性的命令为:
$ zfs create -o atime=off tank/home
可以使用后缀BKMGTPEZ(大小写均可)指定数值属性值。这些后缀后面可以跟b表示字节,也可以不跟。但B后面不能跟b,因为B已经表示字节了。
以下示例中的四条命令是等效的:
$ zfs set quota=20G users/home/mork
$ zfs set quota=20g users/home/mork
$ zfs set quota=20GB users/home/mork
$ zfs set quota=20gb users/home/mork
如果试图对一个已满的文件系统设置属性,会收到以下提示:
$ zfs set quota=20gb users/home/mork
cannot set property for '/users/home/mork': out of space
非数字属性的值区分大小写,必须使用小写字母。mountpoint属性除外,挂载点根据实际情况可以混合使用大小写字母。
关于zfs set命令的所有详细资料,可以参考zfs(8) set|get|inherit手册。
继承ZFS属性
zfs inherit命令用来清除子文件系统的属性值,使其从父文件系统中继承相关属性。
例:
$ zfs set compression=on tank/home/sueb
$ zfs get -r compression tank/home
NAME PROPERTY VALUE SOURCE
tank/home compression off default
tank/home/glori compression off default
tank/home/glori@today compression - -
tank/home/sueb compression on local
$ zfs inherit compression tank/home/sueb
$ zfs get -r compression tank/home
NAME PROPERTY VALUE SOURCE
tank/home compression off default
tank/home/glori compression off default
tank/home/glori@today compression - -
tank/home/sueb compression off default
inherit子命令可以使用-r选项递归应用到指定文件系统的子文件系统。
关于zfs inherit命令的所有详细资料,可以参考zfs(8) set|get|inherit手册。
查询ZFS属性
查询属性值的最简单方法是使用zfs list命令,但对于复杂的查询和脚本编写,使用zfs get命令可以自定义格式提供更详细的信息。
简单示例:
$ zfs get checksum tank/ws
NAME PROPERTY VALUE SOURCE
tank/ws checksum on default
上述示例中第四列SOURCE显示此属性值的来源。可能的值为:
- default
未对此数据集或其任何祖先显式设置此属性值。正在使用此属性的默认值。
- inherited from dataset-name
从dataset-name父数据集继承的属性值。
- local
使用zfs set命令为此数据集显式设置的属性值。
- temporay
此属性值是使用zfs mount -o命令选项设置的,仅在挂载期间有效。
- -(none)
由ZFS生成的只读属性
可以使用关键字all获取所有属性值。例如:
$ zfs get all tank/home
NAME PROPERTY VALUE SOURCE
tank/home aclinherit restricted default
tank/home aclmode discard default
tank/home atime on default
tank/home available 274G -
tank/home canmount on default
tank/home casesensitivity mixed -
tank/home checksum on default
tank/home compression off default
tank/home compressratio 1.00x -
tank/home copies 1 default
tank/home creation Tue Jul 30 10:08 2013 -
tank/home dedup off default
tank/home defaultgroupquota none -
tank/home defaultuserquota none -
tank/home devices on default
tank/home encryption off -
tank/home exec on default
tank/home keychangedate - default
tank/home keysource none default
tank/home keystatus none -
tank/home logbias latency default
tank/home mlslabel none -
tank/home mounted yes -
tank/home mountpoint /tank/home default
tank/home multilevel off -
tank/home nbmand off default
tank/home normalization none -
tank/home primarycache all default
tank/home quota none default
tank/home readonly off default
tank/home recordsize 128K default
tank/home referenced 31K -
tank/home refquota none default
tank/home refreservation none default
tank/home rekeydate - default
tank/home reservation none default
tank/home rstchown on default
tank/home secondarycache all default
tank/home setuid on default
tank/home shadow none -
tank/home share.* ... default
tank/home snapdir hidden default
tank/home sync standard default
tank/home type filesystem -
tank/home used 31K -
tank/home usedbychildren 0 -
tank/home usedbydataset 31K -
tank/home usedbyrefreservation 0 -
tank/home usedbysnapshots 0 -
tank/home utf8only off -
tank/home version 6 -
tank/home vscan off default
tank/home xattr on default
tank/home zoned off default
使用-s选项可以筛选指定源的属性。可以指定多个源,多个源之间以逗号分隔。有效的源类型包括local,default,inherited,temporary,none。
例如:
$ zfs get -s local all tank/ws
NAME PROPERTY VALUE SOURCE
tank/ws compression on local
以上任何选项都可以与-r选项结合使用,以递归的方式在指定文件系统的所有子系统上显示指定属性。例如:
$ zfs get -r -s temporary all tank/home
NAME PROPERTY VALUE SOURCE
tank/home atime off temporary
tank/home/sueb atime off temporary
tank/home/mork quota 20G temporary
如果zfs get命令不指定文件系统,则意味着命令对所有池或文件系统进行查询。例如:
$ zfs get -s local all
tank/home atime off local
tank/home/sueb atime off local
tank/home/mork quota 20G local
关于zfs get命令的所有详细资料,可以参考zfs(8) set|get|inherit手册。
在脚本中查询ZFS属性
zfs get命令支持-H和-o选项。使用-H选项可以省略标题信息并用Tab字符替换空格。统一的空白允许轻松解析数据。
-o选项通过以下方式自定义输出:
- name可以与以逗号分隔的属性列表一起使用
- 逗号分隔的文本字段包括name,value,property,source,后面跟空格和参数
$ zfs get -H -o value compression tank/home
on
-p选项将数字值报告为其精确值。例如,1MB将显示为1000000。
$ zfs get -H -o value -p used tank/home
182983742
-r选项可以跟以上任何选项组合,递归检索所有子系统的请求值。
$ zfs get -H -o name,value -r used export/home
top
挂载ZFS文件系统
管理ZFS挂载点
默认情况下,ZFS文件系统在创建的时候会自动挂载。也可以在zpool create命令中使用-m选项指定挂载点。
所有ZFS文件系统会在启动时通过服务管理设施(Service Management Facility,SMF)的svc://system/filesystem/local服务挂载。
文件系统挂载在/path下面,path是文件系统的名字。
可以使用zfs set命令设置挂载点属性以覆盖默认的挂载点。如果需要,ZFS自动创建指定的挂载点并自动挂载相关的文件系统。
ZFS文件系统在系统启动时自动挂载,不需要在/etc/vfstab文件中指定。
mountpoint属性会被继承。例如,如果pool/home的挂载点属性设置为/export/stuff,则pool/home/user继承挂载点属性值为/export/stuff/user
。
如果要放置挂载文件系统,可将其挂载点属性设置为none。此外,canmount属性可以用于控制文件系统是否可挂载。
通过使用zfs set将mountpoint属性设置为legacy,还可以通过遗留装载接口显式管理文件系统。这样做可以防止ZFS自动装载和管理文件系统。必须改用传统工具,包括mount和umount命令以及/etc/vfstab文件。
自动挂载点
- 将挂载点属性从legacy或none更改为指定路径时,ZFS自动挂载文件系统
- 如果ZFS正在管理文件系统,但该文件系统当前已挂载,并且挂载点属性已更改,则该文件系统将保持为未挂载状态
任何挂载点属性不是legacy的文件系统都由ZFS管理。下面例子中,文件系统创建时挂载点自动由ZFS管理:
$ zfs create pool/filesystem
$ zfs get mountpoint pool/filesystem
NAME PROPERTY VALUE SOURCE
pool/filesystem mountpoint /pool/filesystem default
$ zfs get mounted pool/filesystem
NAME PROPERTY VALUE SOURCE
pool/filesystem mounted yes -
可以明确设置挂载点属性,类似以下:
$ zfs set mountpoint=/mnt pool/filesystem
$ zfs get mountpoint pool/filesystem
NAME PROPERTY VALUE SOURCE
pool/filesystem mountpoint /mnt local
$ zfs get mounted pool/filesystem
NAME PROPERTY VALUE SOURCE
pool/filesystem mounted yes -
当挂载点属性改变,文件系统自动从旧挂载点卸载并挂载到新挂载点。挂载点目录将被创建。文件系统若在使用中,则ZFS不能卸载它,会有错误提示,并且需要强制手动卸载。
改变挂载点后,旧的挂载点目录不会被自动删除
传统挂载点
将挂载点属性设置为legacy后,可以使用传统工具管理ZFS文件系统。传统的文件系统必须使用mount和umount命令以及/etc/vfstab文件管理。
ZFS不会在系统启动时自动挂载传统文件系统,ZFS的mount和umount命令不处理这类文件系统。以下例子显示如何设置和管理传统模式的ZFS文件系统:
$ zfs set mountpoint=legacy tank/home/glori
$ mount -F zfs tank/home/eschrock /mnt
要想在系统启动时自动挂载传统文件系统,必须在/etc/vfstab文件中加入对应的条目。如下所示:
$device device mount FS fsck mount mount
#to mount to fsck point type pass at boot options
#
tank/home/glori - /mnt zfs - yes -
device to fsck和必须被设置为-,因为fsck命令不能处理ZFS文件系统。
挂载ZFS文件系统
只有需要更改挂载点时才使用zfs mount命令。或者明确挂载或卸载文件系统。
如果不带任何参数,zfs mount命令将显示目前已经挂载的受ZFS管理的文件系统。传统管理的挂载点不会显示。例如:
$ zfs mount | grep tank/home
zfs mount | grep tank/home
tank/home /tank/home
tank/home/sueb /tank/home/sueb
可以使用-a选项挂载所有受ZFS管理的文件系统。传统管理的文件系统不受影响。例如:
$ zfs mount -a
默认情况下,ZFS不允许挂载到非空目录,例如:
$ zfs mount tank/home/glori
cannot mount 'tank/home/glori': filesystem already mounted
传统挂载点必须由传统工具管理,使用ZFS工具会收到错误提示。例如:
$ zfs mount tank/home/bhall
cannot mount 'tank/home/bhall': legacy mountpoint
use mount(8) to mount this filesystem
$ mount -F zfs tank/home/bhallm
挂载文件系统时,它会根据与文件系统关联的属性使用一组挂载选项。ZFS属性和挂载选项之间的相关性如下:
- atime
atime/noatime
- devices
devices/nodevices
- exec
exec/noexec
- nbmand
nbmand/nonbmand
- readonly
ro/rw
- setuid
setuid/nosetuid
- xattr
xattr/noaxttr
挂载选项nosuid是nodevice,nosetuid的别名。
可以使用NFSv4镜像挂载功能帮助更好地管理NFS挂载ZFS家目录。
当文件系统创建在NFS服务器,NFS客户端可以在现有的父文件系统挂载中自动发现这些新创建的文件系统。
例如,服务器neo已经共享了tank文件系统,客户端zee挂载了它,在服务器上创建的/tank/baz会自动显示在客户端。
zee$ mount neo:/tank /mnt
zee$ ls /mnt
baa bar
neo$ zfs create tank/baz
zee% ls /mnt
baa bar baz
zee% ls /mnt/baz
file1 file2
使用临时挂载属性
如果通过在zfs mount命令中使用–o选项显式设置上一节中描述的任何装载选项,则会临时覆盖关联的属性值。zfs get命令将这些属性值报告为temporary,并在卸载文件系统时恢复为其原始值。如果在装入文件系统时更改了属性值,则更改将立即生效,并覆盖任何临时设置。
以下例子中,只读挂载选项临时设置到users/home/nneke文件系统上:
$ zfs mount -o ro users/home/nneke
临时修改已经挂载的文件系统的属性值,必须指定remount属性。以下例子临时将已经挂载的文件系统的atime属性的值修改为off:
$ zfs mount -o remount,noatime users/home/nneke
NAME PROPERTY VALUE SOURCE
users/home/nneke atime off temporary
$ zfs get atime users/home/perrin
关于zfs mount命令的所有详细资料,可以参考zfs(8) mount|umount手册。
卸载ZFS文件系统
使用zfs unmount命令卸载ZFS文件系统。后面可以跟挂载点或文件系统名称。
$ zfs unmount users/home/mork
$ zfs unmount /users/home/mork
如果文件系统正在被使用中,卸载会失败,可以使用-f选项强制卸载:
$ zfs unmount -f tank/home/glori
为了提供向后兼容,传统的umount命令可以用来卸载ZFS文件系统。例如:
$ umount /tank/home/glori
关于zfs unmount命令的所有详细资料,可以参考zfs(8) mount|umount手册。
top
2021/12/21