管理ZFS文件系统(part 4)

ZFS文件系统可以动态创建和销毁,无需分配或格式化任何底层磁盘空间。
  1. 设置ZFS配额
  2. 在ZFS文件系统上设置预留
  3. 设置I/O带宽限制(FreeBSD无此功能)
  4. 压缩ZFS文件系统
  5. 加密ZFS文件系统
  6. 迁移ZFS文件系统
  7. 升级ZFS文件系统

设置ZFS配额

使用quota属性可以设置文件系统可以使用的磁盘空间量限制。此外,还以使用reservation属性来保证文件系统有指定数量的磁盘空间可用。
这两个属性都应用于设置它们的文件系统以及该文件系统的所有子系统。
refquota则用来管理文件系统空间,不考虑子文件系统(如快照和克隆)占用的磁盘空间。
不能在卷和旧版ZFS系统上设置用户和组配额。
设定配额前应考虑以下几点:
在ZFS文件系统上设置配额
可使用zfs set quota设置配额,使用zfs get quota命令显示配额。
$ zfs set quota=10G tank/home/sueb
$ zfs get quota tank/home/sueb
NAME            PROPERTY  VALUE  SOURCE
tank/home/sueb  quota     10G    local		
配额也会影响到zfs listdf命令的输出:
$ zfs list -r tank/home
NAME                USED  AVAIL  REFER  MOUNTPOINT
tank/home          1.45M  66.9G    36K  /tank/home
tank/home/glori     547K  66.9G   547K  /tank/home/glori
tank/home/sueb      322K  10.0G   291K  /tank/home/sueb
tank/home/sueb/ws    31K  10.0G    31K  /tank/home/sueb/ws
tank/home/mork       31K  66.9G    31K  /tank/home/mork
$ df -h /tank/home/sueb
Filesystem            Size  Used Avail Use% Mounted on
tank/home/sueb         10G  306K   10G   1% /tank/home/sueb		
以上例子中,尽管tank/home有66.9GB的可用磁盘空间,但由于tank/home/sueb上有配额限制,所以tank/home/sueb和tank/home/sueb/ws各自只有10GB的可用磁盘空间。 可以在文件系统上设置refquota,以限制文件系统可以使用的磁盘空间量。此限制不包括子代占用的磁盘空间。例如,studentA的10GB配额不受快照占用的空间的影响。
$ zfs set refquota=10g students/studentA
$ zfs list -t all -r students
NAME                          USED  AVAIL  REFER  MOUNTPOINT
students                      150M  66.8G    32K  /students
students/studentA             150M  9.85G   150M  /students/studentA
students/studentA@yesterday      0      -   150M  -
$ zfs snapshot students/studentA@today
$ zfs list -t all -r students
students                      150M  66.8G    32K  /students
students/studentA             150M  9.90G   100M  /students/studentA
students/studentA@yesterday  50.0M      -   150M  -
students/studentA@today          0      -   100M  -		
为方便起见,可以在文件系统上设置另一个配额,以帮助管理快照占用的磁盘空间:
$ zfs set quota=20g students/studentA
$ zfs list -t all -r students
NAME                          USED  AVAIL  REFER  MOUNTPOINT
students                      150M  66.8G    32K  /students
students/studentA             150M  9.90G   100M  /students/studentA
students/studentA@yesterday  50.0M      -   150M  -
students/studentA@today          0      -   100M  -		
这种情况下,studentA可能会达到refquota(10GB)硬限制,但即使存在快照,studentA也可以删除要恢复的文件。
在前面的示例中,在zfs list输出中显示两个配额中较小的一个(10GB,而不是20GB)。要查看两个配额的值,请使用zfs get命令。例如:
$ zfs get refquota,quota students/studentA
NAME               PROPERTY  VALUE              SOURCE
students/studentA  refquota  10G                local
students/studentA  quota     20G                local		
强制执行文件系统配额可能会延迟几秒钟。此延迟意味着,用户可能会在系统注意到文件系统超出配额并拒绝额外写入(带有EDQUOTE错误消息)之前超过文件系统配额。
top
在ZFS文件系统上设置用户和组配额
使用zfs userquota@username命令设置用户配额;使用zfs groupquota@groupname命令设置组配额。
$ zfs create students/compsci
$ zfs set userquota@student1=10G students/compsci
$ zfs create students/labstaff
$ zfs set groupquota@labstaff=20GB students/labstaff		
如下显示现有的用户或组配额:
$ zfs get userquota@student1 students/compsci
NAME              PROPERTY            VALUE               SOURCE
students/compsci  userquota@student1  10G                 local
$ zfs get groupquota@labstaff students/labstaff
NAME               PROPERTY             VALUE                SOURCE
students/labstaff  groupquota@labstaff  20G                  local		
通过查询以下属性,可以显示一般用户和组磁盘空间使用情况:
$ zfs userspace students/compsci
TYPE        NAME      USED  QUOTA
POSIX User  root      350M   none
POSIX User  student1  426M    10G
$ zfs groupspace students/labstaff
TYPE         NAME      USED  QUOTA
POSIX Group  labstaff  250M    20G
POSIX Group  root      350M   none  		
要确定单个用户或组的磁盘空间使用情况,可查询以下属性:
$ zfs get userused@student1 students/compsci
NAME              PROPERTY           VALUE              SOURCE
students/compsci  userused@student1  550M               local
$ zfs get groupused@labstaff students/labstaff
NAME               PROPERTY            VALUE               SOURCE
students/labstaff  groupused@labstaff  250                 local		
使用zfs get all dataset命令不会显示用户和组的配额属性,该命令将显示所有其他文件系统属性的列表。
使用以下方法可以取消对用户或组的配额限制:
$ zfs set userquota@student1=none students/compsci
$ zfs set groupquota@labstaff=none students/labstaff		
ZFS文件系统上的用户和组配额提供以下功能: 用户和组配额的强制执行可能会延迟几秒钟。此延迟意味着用户可能会在系统注意到用户超出配额并拒绝使用EDQUOTE错误消息进行额外写入之前超过用户配额。
可以使用传统的quota命令查看NFS环境中的用户配额。如果没有任何选项,quota命令仅在超出用户配额时显示输出。例如:
$ zfs set userquota@student1=10m students/compsci
$ zfs userspace students/compsci
TYPE        NAME      USED  QUOTA
POSIX User  root      350M   none
POSIX User  student1  550M    10M
$ quota student1
Block limit reached on /students/compsci		
如果重置用户配额且不再超过配额限制,则可以使用quota –v命令查看用户配额:
$ zfs set userquota@student1=10GB students/compsci
$ zfs userspace students/compsci
TYPE        NAME      USED  QUOTA
POSIX User  root      350M   none
POSIX User  student1  550M    10G
$ quota student1
$ quota -v student1
Disk quotas for student1 (uid 102):
Filesystem     usage  quota  limit    timeleft  files  quota  limit    timeleft
/students/compsci
563287 10485760 10485760           -      -      -      -           -		
top
设置默认用户和组配额
从Oracle Solaris 11.3开始,可以设置默认的用户配额和默认的组配额,可以自动为那些未明确指定配额的用户或组设置配额。
默认用户和组配额不可继承到后代文件系统。
如果在顶级文件系统上设置了默认用户或组配额,则子文件系统中消耗的空间不会计入顶级文件系统的默认配额。
在大型共享文件系统上设置默认用户配额:
$ zfs set defaultuserquota=30gb students/labstaff/admindata
在大型共享文件系统上使用默认用户配额可以限制增长,而无需指定单个用户配额。
使用以下命令可以监视谁在使用顶级文件系统:
$ zfs userspace students/labstaff/admindata
TYPE        NAME     USED  QUOTA  SOURCE   
POSIX User  admin1  2.00G    30G  default  
POSIX User  admin2  4.00G    30G  default  
POSIX User  root       3K    30G  default 		
以上两个示例,在students/labstaff/admindata中,允许每个没有明确指定配额的用户使用30GB的磁盘空间。将此行为与在students/labstaff/admindata上设置30GB文件系统配额进行对比,意味着30GB的累积配额将应用于所有没有明确指定配额的用户。
同样的方法可以设置组配额:
$ zfs set defaultgroupquota=120g students/math
$ zfs groupspace students/math
TYPE         NAME       USED  QUOTA  SOURCE   
POSIX Group  root         6K   120G  default  
POSIX Group  students  40.0G   120G  default		
top

在ZFS文件系统上设置预留

ZFSreservation属性从池中分配磁盘空间,保证数据集可用。 例:
$ zfs set reservation=5G tank/home/bhall
$ zfs get reservation tank/home/bhall
NAME            PROPERTY     VALUE   SOURCE
tank/home/bhall  reservation  5G      local		
使用zfs list命令可以查看预留:
$ zfs list -r tank/home
NAME                USED  AVAIL  REFER  MOUNTPOINT
tank/home          5.00G  61.9G    37K  /tank/home
tank/home/bhall       31K  66.9G    31K  /tank/home/bhall
tank/home/sueb      337K  10.0G   306K  /tank/home/sueb
tank/home/glori     547K  61.9G   547K  /tank/home/glori
tank/home/mork       31K  61.9G    31K  /tank/home/mork		
以上例子中tank/home的预留是5GB,所以它显示使用了5GB,而它和它的子系统引用的空间总量远小于5GB。
$ zfs set quota=5G pool/filesystem
$ zfs set reservation=10G pool/filesystem/user1
cannot set reservation for 'pool/filesystem/user1': size is greater than
available space		
只要池中有可用的未保留空间,并且数据集的当前使用量低于其配额,则数据集可以使用比其保留空间更多的磁盘空间。数据集不能占用为另一个数据集保留的磁盘空间。
预留不能累积。如果多次对一个数据集设置预留,则以最后一次为准。例如:
$ zfs set reservation=10G tank/home/bhall
$ zfs set reservation=5G tank/home/bhall
$ zfs get reservation tank/home/bhall
NAME            PROPERTY     VALUE   SOURCE
tank/home/bhall  reservation  5G      local		
可以设置refreservation保留,以确保数据集的磁盘空间不包括快照和克隆占用的磁盘空间。此保留在父数据集的已用空间计算中进行说明,并根据父数据集的配额和保留进行计数。例如:
$ zfs set refreservation=10g profs/prof1
$ zfs list
NAME                      USED  AVAIL  REFER  MOUNTPOINT
profs                    10.0G  23.2G    19K  /profs
profs/prof1                10G  33.2G    18K  /profs/prof1		
还可以在同一数据集上设置保留,以保证数据集空间和快照空间:
$ zfs set reservation=20g profs/prof1
$ zfs list
NAME                      USED  AVAIL  REFER  MOUNTPOINT
profs                    20.0G  13.2G    19K  /profs
profs/prof1                10G  33.2G    18K  /profs/prof1		
在父对象的已用空间中考虑常规保留。
在前面示例中,在zfs list输出中显示两个配额较小的一个(10GB,而不是20GB)。要查看两个配额的值,可使用zfs get命令:
$ zfs get reservation,refreserv profs/prof1
NAME         PROPERTY        VALUE        SOURCE
profs/prof1  reservation     20G          local
profs/prof1  refreservation  10G          local
如果设置了refreservation,则仅当此保留之外存在足够的未保留池空间以容纳数据集中当前引用的字节数时,才允许快照。
top

设置I/O带宽限制(FreeBSD无此功能)

通过使用读写限制属性可以避免某写ZFS客户端垄断带宽。 使用writelimitreadlimit属性可以覆盖数据集后代的默认限制。可以设置为任何大于500K的值。子数据集上带宽不会超过父数据集。
$ zfs get -r writelimit,defaultwritelimit,effectivewritelimit users/home
NAME                  PROPERTY              VALUE     SOURCE
users/home            writelimit            default   default
users/home            defaultwritelimit     none      default
users/home            effectivewritelimit   none      local
users/home/kaydo      writelimit            default   default
users/home/kaydo      defaultwritelimit     none      default
users/home/kaydo      effectivewritelimit   none      local		
如果writelimitreadlimit属性设置为none,则从父数据集上继承限制。也可以将它们设置为默认值,已使用父数据集上设置的默认限制。
例33 带宽限制属性的默认设置
以下例子中父数据集没有设置带宽限制,则子数据集的带宽也没有限制:
$ zfs get -r writelimit,defaultwritelimit,effectivewritelimit users/home
NAME                 PROPERTY              VALUE     SOURCE
users/home           writelimit            default   default
users/home           defaultwritelimit     none      default
users/home           effectivewritelimit   none      local
users/home/nneke      writelimit            default   default
users/home/nneke      defaultwritelimit     none      default
users/home/nneke      effectivewritelimit   none      local		
而以下例子中父数据集的defaultwritelimit属性设置为500K,则这个写限制对子数据集也有效:
$ zfs get -r writelimit,defaultwritelimit,effectivewritelimit users/home
NAME                 PROPERTY              VALUE     SOURCE
users/home           writelimit            1M        local
users/home           defaultwritelimit     500K      local
users/home           effectivewritelimit   1M        local
users/home/nneke      writelimit            default   default
users/home/nneke      defaultwritelimit     500K      inherited from users/home
users/home/nneke      effectivewritelimit   500K      local		
例34 使用父数据集中的带宽限制
默认情况下,子数据集使用父级的defaultwritelimitdefaultreadlimit属性中设置的带宽限制值。
如果要使用与父数据集相同的写入值而不是默认设置,请将子数据集的writelimit属性设置为none
在这种情况下,有效写入限制将被报告为与父数据集的writelimit属性相同。
在本例中,子数据集的有效写入限制为1M,这是父数据集的有效写入限制,而不是500K,这是父数据集中设置的默认写入限制。
$ zfs set writelimit=none users/home/kaydo
$ zfs get -r writelimit,defaultwritelimit,effectivewritelimit users/home
NAME                  PROPERTY              VALUE    SOURCE
users/home            writelimit            1M       local
users/home            defaultwritelimit     500K     local
users/home            effectivewritelimit   1M       local
users/home/kaydo      writelimit            none     local
users/home/kaydo      defaultwritelimit     500K     inherited from users/home
users/home/kaydo      effectivewritelimit   1M       local		
在本例中,子数据集的属性受父数据集上设置的写入限制的限制。子数据集的带宽值不会高于父数据集的带宽值。
$ zfs create -o writelimit=2M users/home/mork
$ zfs get -r writelimit,defaultwritelimit,effectivewritelimit users/home
NAME                 PROPERTY              VALUE    SOURCE
users/home           writelimit            1M       local
users/home           defaultwritelimit     500K     local
users/home           effectivewritelimit   1M       local
users/home/mork      writelimit            2M       local
users/home/mork      defaultwritelimit     500K     inherited from users/home
users/home/mork      effectivewritelimit   1M       local
top

压缩ZFS文件系统

可以的压缩算法如下: 目前,根池上不支持lz4或gzip压缩。(FreeBSD支持) 以下命令设置压缩算法:
$ zfs set compress=lz4 pool/fs
top

加密ZFS文件系统

加密是一个过程,其中数据被编码为隐私,数据所有者需要一个密钥来访问编码数据。使用ZFS加密的好处如下: ZFS文件系统的加密策略是在创建文件系统时设置的,一旦设置便不能更改。
以下例子创建tank/home/megr文件系统时启用了加密属性。默认的加密策略是提示输入密码短语,密码短语的长度必须至少8个字符。
$ zfs create -o encryption=on tank/home/megr
Enter passphrase for 'tank/home/megr': xxxxxxx
Enter again: xxxxxxxx		
确认文件系统是否启用了加密,可以按以下操作:
$ zfs get encryption tank/home/megr
NAME              PROPERTY    VALUE        SOURCE
tank/home/megr  encryption  on           local		
当文件系统的加密值设置为on时,默认的加密算法是aes-128-ccmwrapping key(包装密钥)用于加密实际数据加密密钥。包装密钥从zfs命令传递到内核,如上面创建加密文件系统时的示例所示。
包装密钥的格式和位置在keysource属性中指定,例如:
keysource=format,location
如果keysource格式是密码短语,则包装密钥从密码短语派生。否则,keysource属性值将以原始字节或十六进制格式指向实际包装密钥。
可以指定密码短语存储在文件中或存储在提示输入的原始字节流中,这能仅适用于脚本编写。
当文件系统的keysource属性值定义为passphrase时,则使用PKCS#5 PBKD2和每个文件系统随机生成的salt从密码短语生成包装密钥。
这意味着,如果在子文件系统上使用相同的密码短语,则会生成不同的包装密钥。
文件系统的加密策略由子文件系统继承,不能删除。例如:
$ zfs snapshot tank/home/megr@now
$ zfs clone tank/home/megr@now tank/home/megr-new
Enter passphrase for 'tank/home/megr-new': xxxxxxx
Enter again: xxxxxxxx
$ zfs set encryption=off tank/home/megr-new
cannot set property for 'tank/home/megr-new': 'encryption' is readonly		
如果需要复制或迁移加密或未加密的ZFS文件系统,应考虑以下几点: 尽管ZFS加密文件系统可以限制对静态数据的访问,但在挂载文件系统时,这种保护将丢失。可以担任root角色或使用sudo命令的用户可以不受限制地访问这些文件。要添加一层安全性,可使用文件和进程标签来实现访问控制,尤其是对敏感文件地访问控制。
改变加密ZFS文件系统的密钥
可以使用zfs key -c命令更改加密文件系统地包装密钥。必须先加载现有的包装密钥,可以在启动时加载,也可以通过显式加载(zfs key -l)或挂载(zfs mount filesystem)加载。例如:
$ zfs key -c tank/home/megr
Enter new passphrase for 'tank/home/megr': xxxxxxxx
Enter again: xxxxxxxx		
下面例子中,更改包装密钥,keysource属性值变更为来自于指定文件的包装密钥:
$ zfs key -c -o keysource=raw,file:///media/stick/key tank/home/megr
可以使用zfs key -K命令更改加密文件系统的数据加密密钥,但新密钥仅用于新写入的数据。例如:
zfs key -K tank/home/megr
在上面的例子中,数据加密密钥不可见,也不是由管理员直接管理。此外,需要keychange委派来执行密钥更改操作。
以下加密算法可用: ZFS keysource属性定义文密钥的格式和位置。
$ zfs get keysource tank/home/megr
NAME              PROPERTY   VALUE              SOURCE
tank/home/megr  keysource  passphrase,prompt  local
ZFS rekeydate属性标识最后一次使用zfs key -K操作的日期:
$ zfs get rekeydate tank/home/megr
NAME              PROPERTY   VALUE                  SOURCE
tank/home/megr  rekeydate  Wed Jul 25 16:54 2012  local		
如果加密文件系统的creationrekeydate属性具有相同的值,则表示该文件系统从未被zfs key -K操作重新设置过密钥。
管理ZFS加密密钥
根据需要,ZFS加密密钥可以在本地系统或远程以不同的方法进行管理。
委托ZFS密钥操作权限
查看以下授权关键操作的权限描述: 考虑委托密钥使用(加载或卸载)和密钥更改的单独权限,这允许您拥有一个两人密钥操作模型。例如,确定哪些用户可以使用这些键,哪些用户可以更改这些键。或者,两个用户都需要在场进行关键更改。该模型还允许您构建密钥托管系统。
top
挂载一个加密的ZFS文件系统
尝试装载加密的ZFS文件系统时,请查看以下注意事项: top
升级一个加密的ZFS文件系统
在将Solaris11系统升级到Solaris11.1之前,应确保已挂载加密的文件系统。如果出现提示,应挂载加密的文件系统并提供密码短语。
$ zfs mount -a
Enter passphrase for 'pond/jaust': xxxxxxxx
Enter passphrase for 'pond/rori': xxxxxxxx
$ zfs mount | grep pond
pond                            /pond
pond/jaust                      /pond/jaust
pond/rori                       /pond/rori		
然后升级加密的文件系统。
$ zfs upgrade -a
如果试图升级已经卸载的加密ZFS文件系统,将显示类似以下内容:
$ zfs upgrade -a
cannot set property for 'pond/jaust': key not present		
另外,zpool status输出可能显式损坏的数据
$ zpool status -v pond
.
.
.
pond/jaust:<0x1>
pond/rori:<0x1>		
如果出现上述错误,请按照上面的指示重新挂载加密的文件系统,然后擦洗并清除池错误。
$ zpool scrub pond
$ zpool clear pond		
top
ZFS压缩、去重和加密属性之间的交互
使用ZFS压缩、去重和加密属性时,应注意以下事项: top
加密ZFS文件系统的示例
例35 使用一个Raw密钥加密ZFS文件系统
以下例子使用pktool命令生成一个aes-265-ccm加密密钥并写入文件/kaydokey.file。
$ pktool genkey keystore=file outkey=/kaydokey.file keytype=aes keylen=256
然后创建tank/home/kaydo文件系统时指定/kaydokey.file。
$ zfs create -o encryption=aes-256-ccm -o keysource=raw,file:///kaydokey.file tank/home/kaydo
例37 使用不同的加密算法加密ZFS文件系统
在创建ZFS存储池时,让池中所有文件系统继承加密算法。
在本例中,将创建users池,并使用密码短语创建和加密users/home文件系统。默认的加密算法是aes-128-ccm
然后,创建users/home/mork文件系统并使用aes-256-ccm算法加密。
$ zpool create -O encryption=on users mirror c0t1d0 c1t1d0 mirror c2t1d0 c3t1d0
Enter passphrase for 'users': xxxxxxxx
Enter again: xxxxxxxx
$ zfs create users/home
$ zfs get encryption users/home
NAME        PROPERTY    VALUE        SOURCE
users/home  encryption  on           inherited from users
$ zfs create -o encryption=aes-256-ccm users/home/mork
$ zfs get encryption users/home/mork
NAME               PROPERTY    VALUE        SOURCE
users/home/mork    encryption  aes-256-ccm  local		
例37 克隆一个加密的ZFS文件系统
如果克隆文件系统从与原始快照相同的的文件系统继承keysource属性,就不需要新的keysource,并且如果keysource=passphrase,prompt,也不会被提示输入新密码短语。可用使用相同的keysource
例如:默认情况下,克隆加密文件系统的后代时,不会提示输入密钥。
$ zfs create -o encryption=on tank/ws
Enter passphrase for 'tank/ws': xxxxxxxx
Enter again: xxxxxxxx
$ zfs create tank/ws/fs1
$ zfs snapshot tank/ws/fs1@snap1
$ zfs clone tank/ws/fs1@snap1 tank/ws/fs1clone		
如果要为克隆的文件系统创建新的密钥,可使用zfs clone -K命令。
如果克隆加密文件系统而不是后代加密文件系统,系统将要求提供新密钥。
$ zfs create -o encryption=on tank/ws
Enter passphrase for 'tank/ws': xxxxxxxx
Enter again: xxxxxxxx
$ zfs snapshot tank/ws@1
$ zfs clone tank/ws@1 tank/ws1clone
Enter passphrase for 'tank/ws1clone': xxxxxxxx
Enter again: xxxxxxxx		
例38 发送和接收加密的ZFS文件系统
下面例子中,tank/home/megr@snap1是从加密的/tank/home/megr文件系统中创建的。然后快照发送到bpool/snaps,加密属性已启用,所以接收到的数据是加密的。
然而,tank/home/megr@snap1在传输过程中是没有加密的。
$ zfs get encryption tank/home/megr
NAME              PROPERTY    VALUE        SOURCE
tank/home/megr  encryption  on           local
$ zfs snapshot tank/home/megr@snap1
$ zfs get encryption bpool/snaps
NAME         PROPERTY    VALUE        SOURCE
bpool/snaps  encryption  on           inherited from bpool
$ zfs send tank/home/megr@snap1 | zfs receive bpool/snaps/megr
$ zfs get encryption bpool/snaps/megr
NAME                    PROPERTY    VALUE        SOURCE
bpool/snaps/megr        encryption  on           inherited from bpool		
在这个情况下,将自动为接收到的加密文件系统生成新的密钥。
top
FreeBSD中加密操作
FreeBSD的zfs属性中没有keysource,而是拆成了两个:keyformat、keylocation。所以,FreeBSD是使用了三个参数来设置加密:
同样的,也只能在创建zfs数据集时指定是否加密,后续不能更改。
示例:创建一个加密的文件系统:
# zfs create -o encryption=on -o keyformat=passphrase -o keylocation=prompt zroot/test
Enter new passphrase:
Re-enter new passphrase:
若要使用密钥,可以使用以下方式:
# dd if=/dev/random of=/zroot/key.key bs=1 count=32
32+0 records in
32+0 records out
32 bytes transferred in 0.000146 secs (219178 bytes/sec)
# zfs create -o encryption=on -o keyformat=raw -o keylocation=file:///zroot/key.key zroot/test
# zfs get keylocation zroot/test
NAME        PROPERTY     VALUE                  SOURCE
zroot/test  keylocation  file:///zroot/key.key  local
FreeBSD对zfs加密默认使用aes-256-gcm算法。
使用以下命令可以查看当前被加密的文件系统:
# zfs get encryptionroot
系统重启后,加密的文件系统不会被自动挂载。需要先加载passphrase,然后挂载文件系统:
# zfs load-key zroot/test
Enter passphrase for 'zroot/test':
# zfs mount zroot/test
若要手动卸载加密的zfs文件系统,也需要两个步骤:
# zfs unmount zroot/test
# zfs unload-key zroot/test
注意:销毁一个加密的文件系统是不需要提供密码的。
top

迁移ZFS文件系统

要将本地或远程ZFS或UFS文件系统迁移到目标ZFS系统,请使用影子迁移(shadow migration)。目标文件系统也成为影子文件系统。
使用以下命令管理影子迁移: 注意,迁移文件系统应该注意以下规则:
如何迁移一个文件系统到一个ZFS文件系统
  1. 如果要从远程NFS服务器迁移数据,应确认可以在远程和本地系统上访问名称服务信息
  2. 对于使用NFS的大量迁移,可以考虑对数据子集进行测试迁移,以确保UID、GUID和ACL信息正确迁移。
  3. 如果有必要,应在目标系统上安装使用shadow-migration包
  4. $ pkg install shadow-migration
    FreeBSD上没有这个包
  5. 启用shedow服务
  6. $ svcadm enable shadowd
  7. 设置本地或远程准备迁移的文件系统为只读
  8. 创建目标文件系统,同时将影子文件系统设置为要迁移的文件系统
  9. 注意:新的目标ZFS文件系统必须完全为空,否则迁移会失败。
    指定要迁移的系统类型为shadow
  10. (可选)使用shadowstat命令检查迁移进度
通过NFS迁移文件系统会比较慢,取决于网络带宽。如果在迁移过程中系统重启了,在系统启动完成后迁移会继续。
例39 开始并监视文件系统迁移
本例中启动了多个迁移,shadowadm命令列出正在进行的迁移,shadowstat命令监视迁移的进度。
$ zfs create -o shadow=nfs://system2/rpool/data/jsmith/archive rpool/data/copyarchive
$ shadowadm list
PATH                                        STATE
/rpool/data/copyarchive                     ACTIVE

$ zfs create -o shadow=nfs://system2/rpool/data/jsmith/datalogs rpool/data/logcopy
$ shadowadm list
PATH                                        STATE
/rpool/data/copyarchive                     ACTIVE
/rpool/data/logcopy                         ACTIVE

$ shadowstat
                                        EST
                                BYTES   BYTES           ELAPSED
DATASET                         XFRD    LEFT    ERRORS  TIME
rpool/data/copyarchive          34.4M   3.37G   -       00:00:36
rpool/data/logcopy              1.12K   155K    1       (completed)Errors are detected.
rpool/data/copyarchive          34.5M   3.37G   -       00:00:37
rpool/data/logcopy              1.12K   155K    1       (completed)
rpool/data/copyarchive          35.0M   3.37G   -       00:00:38
rpool/data/logcopy              1.12K   155K    1       (completed)
rpool/data/copyarchive          35.2M   3.37G   -       00:00:39
rpool/data/logcopy              1.12K   155K    1       (completed)
^C		
上面shadowstat输出指示迁移到rpool/data/logcopy时出现错误。 shadowstat -E-e命令选项的以下输出显示,无法完成到rpool/data/logcopy的迁移,因为不支持套接字迁移。shadowadm命令取消迁移。
$ shadowstat -E
rpool/data/copyarchive:
No errors encountered.
rpool/data/logcopy:
PATH                                                   ERROR
errdir/cups-socket                                     Operation not supported

$ shadowstat -e /rpool/data/logcopy
rpool/data/logcopy:
PATH                                                   ERROR
errdir/cups-socket                                     Operation not supported

$ shadowadm cancel /rpool/data/logcopy		
以下输出显示了有关迁移到rpool/data/copyarchive的信息,该迁移将继续完成。
$ shadowadm list
PATH                                        STATE
/rpool/data/copyarchive                     ACTIVE$ shadowstat
                                        EST             
                                BYTES   BYTES           ELAPSED
DATASET                         XFRD    LEFT    ERRORS  TIME
rpool/data/copyarchive          251M    3.16G   -       00:01:27
rpool/data/copyarchive          251M    3.16G   -       00:01:28
rpool/data/copyarchive          252M    3.16G   -       00:01:29
^C

$ shadowstat
No migrations in progress.
$ shadowadm list
$ exit		
top
如何迁移SMB文件系统
开始之前,迁移SMB文件系统要先确认以下需求:
  1. 在目标系统生配置相同SMB用户账号,以便在源系统和目标系统之间处理身份验证。
  2. 确保密码在目标系统中保持不变:
  3. 迁移期间应保证SMB源文件系统保持只读权限。
  4. 创建目标文件系统,同时将影子文件系统设置为要迁移的文件系统
  5. $ zfs crate -o shadow=smb://user@host/path target
    注意,新的目标ZFS文件系统必须是完全空的,否则迁移会失败。
  6. (可选项)使用shadowstat监视迁移过程。
top

升级ZFS文件系统

如果ZFS文件系统来自以前版本的Solaris,可以使用zfs upgrade命令升级它以获得当前版本的功能。此外,当文件系统运行较旧版本时,此命令会发出通知。
$ zfs upgrade
This system is currently running ZFS filesystem version 5.

All filesystems are formatted with the current version.		
使用此命令可以标识每个文件系统版本的可用功能。
$ zfs upgrade -v
The following filesystem versions are supported:

VER  DESCRIPTION
---  --------------------------------------------------------
1   Initial ZFS filesystem version
2   Enhanced directory entries
3   Case insensitive and File system unique identifier (FUID)
4   userquota, groupquota properties
5   System attributes
6   Multilevel file system support

For more information about a particular version, including supported releases,
see the ZFS Administration Guide.		
top

2021/12/24