我试图了解 ZFS 在执行快照等操作时的工作方式。当我在机器上使用 zfs list 时,我会得到一些挂载点和一些路径。例如,我得到了类似这样的信息:
rpool/ROOT/s10x_u10_wos_17b 5.3gb 58.2gb 5.3gb /
我获得了 root 作为挂载点/
。
我首先想到的是,这里有实际的文件,但当我导航到目录时,/rpool
却没有 ROOT 目录。经过一番思考,我发现它/rpool/ROOT
实际上安装在 Legacy 上,所以它一定是在其他地方。
有人可以解释一下当它安装在旧版上时文件在哪里,以及为什么使用这种旧模式吗?
答案1
我不明白传统挂载点的用途。
ZFS 在池内提供数据集的层次结构。在您的案例中,您有一个名为 的池rpool
,以及至少以下数据集:
rpool
rpool/ROOT
rpool/ROOT/s10x_u10_wos_17b
这些数据集中的每一个通常都是一个文件系统(尽管它可以是一个卷/块设备)。
正如每个数据集都可能是一个完整/独立的文件系统一样,每个数据集也可以独立安装或不独立安装。
默认情况下,ZFS 会将子数据集挂载在父级内的逻辑位置...如果rpool
数据集挂载在/rpool
(即:默认),那么您会发现rpool/ROOT
数据集挂载在/rpool/ROOT
,等等...
这是由mountpoint
属性控制的——运行zfs get -rt filesystem mountpoint
来查看每个数据集的当前值。
- 如果该值是路径,则在导入池时,ZFS 会自动将数据集挂载在该路径上。默认(如上所述)是将文件系统挂载在父级下。
- 如果值为
none
,则 ZFS 将不会挂载文件系统,并且文件系统不能可以使用其中任一种进行安装mount
。 - 如果值为
legacy
,则 ZFS 将不会挂载文件系统,但您可以使用mount
和umount
手动管理文件系统的挂载点。您也可以使用/etc/fstab
来引导自动挂载。
在您的情形下,rpool/ROOT/s10x_u10_wos_17b
数据集被挂载在/
(即:它是您的根文件系统)。要实现这一点,您可以设置mountpoint=/
并让 ZFS 处理事情,或者mountpoint=legacy
明确设置并挂载它。
由于这是您的根文件系统,让 ZFS 为您管理它实际上不是一个选择,您需要明确指定挂载点。
因此,rpool/ROOT/s10x_u10_wos_17b
有mountpoint=legacy
。
答案2
当使用 挂载文件系统时,通常使用传统挂载点fstab
。
来自 FreeBSD 手册页:
如果需要,ZFS 文件系统也可以使用传统工具(mount(8)、umount(8)、fstab(5))进行管理。如果文件系统的挂载点设置为传统,则 ZFS 不会尝试管理该文件系统,管理员负责挂载和卸载该文件系统。