ZFS 池未正确安装;找不到所有文件

Dun*_*yne 5 linux zfs

我在从 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/zfsUbuntu 系统下一个完全填充的目录树,其中包含 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)