我在从 FreeBSD 11.0 服务器转移到 Ubuntu 16.04.2 LTS 服务器的两个磁盘上有一个 ZFS 池(镜像 RAID)。
导入池后,我看到:
NAME USED AVAIL REFER MOUNTPOINT
zroot 993G 790G 104K /mnt/zfs
zroot/ROOT 989G 790G 96K none
zroot/ROOT/default 989G 790G 989G none
zroot/tmp 140K 790G 140K none
zroot/usr 3.37G 790G 96K none
zroot/usr/home 2.15G 790G 2.15G none
zroot/usr/ports 640M 790G 640M none
zroot/usr/src 608M 790G 608M none
zroot/var 1.66M 790G 96K none
zroot/var/audit 96K 790G 96K none
zroot/var/crash 96K 790G 96K none
zroot/var/log 476K 790G 476K none
zroot/var/mail 840K 790G 840K none
zroot/var/tmp 96K 790G 96K none
Run Code Online (Sandbox Code Playgroud)
我希望看到的是/mnt/zfs
Ubuntu 系统下一个完全填充的目录树,其中包含 993GiB 的文件。我看到的是一个部分填充的目录树,其中没有文件:
$ tree /mnt/zfs
/mnt/zfs
??? tmp
??? usr
? ??? home
? ??? ports
? ??? src
??? var
??? audit
??? crash
??? log
??? mail
??? tmp
Run Code Online (Sandbox Code Playgroud)
我很确定我在这里遗漏了一些基本的东西。
尝试 #1:根据@Zoredache 的建议,为 ROOT 设置一个挂载点,只会导致一个空的 ROOT 目录:
$ sudo zfs set mountpoint=/mnt/zfs/ROOT zroot/ROOT
$ tree /mnt/zfs
/mnt/zfs
??? ROOT
Run Code Online (Sandbox Code Playgroud)
尝试 #2:根据@user121391 的建议,为 ROOT/default 设置一个挂载点,也会产生一个空目录:
$ sudo zfs set mountpoint=/mnt/zfs/ROOT zroot/ROOT/default
$ tree /mnt/zfs
/mnt/zfs
0 directories, 0 files
Run Code Online (Sandbox Code Playgroud)
尝试 #3:根据@user131391 的其他建议,挂载单个目录似乎有效:
$ sudo zfs set mountpoint=/mnt/zfs/usr/home zroot/usr/home
$ tree /mnt/zfs
/mnt/zfs
??? usr
??? home
??? duncan
??? tmp
? ??? code
...
??? usb
17978 directories, 67539 files
Run Code Online (Sandbox Code Playgroud)
这很好,但不幸的是这没有帮助。我要找的文件在 下/usr/local/
,它没有出现在zfs list
. 但是,如果您查看尺寸,则显然正在使用该空间:
zroot/ROOT/default 989G 790G 989G none
zroot/usr 3.37G 790G 96K none
Run Code Online (Sandbox Code Playgroud)
尝试#4:
Michael Kjörling 的更多信息:
$ sudo zfs set mountpoint=/mnt/zfs/ROOT zroot/ROOT/default
$ sudo zfs get mountpoint,mounted zroot -t filesystem -r
NAME PROPERTY VALUE SOURCE
zroot mountpoint none local
zroot mounted no -
zroot/ROOT mountpoint none local
zroot/ROOT mounted no -
zroot/ROOT/default mountpoint /mnt/zfs/ROOT local
zroot/ROOT/default mounted no -
zroot/tmp mountpoint none local
zroot/tmp mounted no -
zroot/usr mountpoint none local
zroot/usr mounted no -
zroot/usr/home mountpoint none local
zroot/usr/home mounted no -
zroot/usr/ports mountpoint none local
zroot/usr/ports mounted no -
zroot/usr/src mountpoint none local
zroot/usr/src mounted no -
zroot/var mountpoint none local
zroot/var mounted no -
zroot/var/audit mountpoint none local
zroot/var/audit mounted no -
zroot/var/crash mountpoint none local
zroot/var/crash mounted no -
zroot/var/log mountpoint none local
zroot/var/log mounted no -
zroot/var/mail mountpoint none local
zroot/var/mail mounted no -
zroot/var/tmp mountpoint none local
zroot/var/tmp mounted no -
$ tree /mnt/zfs
/mnt/zfs
0 directories, 0 files
Run Code Online (Sandbox Code Playgroud)
小智 6
zroot 和 zroot/ROOT 不包含任何文件,它们只是其他数据的容器。
您的大部分数据位于 zroot/ROOT/default 中。
其他 zfs 文件系统应该从 zroot 继承它们的挂载点(不确定在从 FreeBSD 到 Ubuntu 的转换过程中这些信息是如何丢失的):
zfs inherit mountpoint zroot/tmp
zfs inherit mountpoint zroot/usr
zfs inherit mountpoint zroot/usr/home
zfs inherit mountpoint zroot/usr/ports
Run Code Online (Sandbox Code Playgroud)
...等等(可能可以对此执行 -r 但我还没有检查)。
唯一应该具有挂载点的 zfs 文件系统none
是 zroot/ROOT:
zfs set mountpoint=none zroot/ROOT
Run Code Online (Sandbox Code Playgroud)
完成所有这些操作后,您需要导出并重新导入池,并以正确的顺序挂载文件系统:
zpool export zroot
Run Code Online (Sandbox Code Playgroud)
将池导入到新的安装点,但实际上不安装任何东西:
zpool import -a -N -r /mnt/zfs
Run Code Online (Sandbox Code Playgroud)
挂载根池:
zfs mount zroot/ROOT/default
Run Code Online (Sandbox Code Playgroud)
安装其他所有东西:
zfs mount -a
Run Code Online (Sandbox Code Playgroud)