管理ZFS文件系统(part 2)

ZFS文件系统可以动态创建和销毁,无需分配或格式化任何底层磁盘空间。
  1. 查询ZFS文件系统信息
  2. 管理ZFS属性
  3. 挂载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选项指定数据集的类型,可用类型有: 同样的,-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显示此属性值的来源。可能的值为: 可以使用关键字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选项通过以下方式自定义输出:
$ 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的文件系统都由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文件系统。传统的文件系统必须使用mountumount命令以及/etc/vfstab文件管理。
ZFS不会在系统启动时自动挂载传统文件系统,ZFS的mountumount命令不处理这类文件系统。以下例子显示如何设置和管理传统模式的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属性和挂载选项之间的相关性如下: 挂载选项nosuidnodevice,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