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

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

我在两个磁盘上有一个 ZFS 池(镜像 RAID),我已将它们从 FreeBSD 11.0 服务器转移到 Ubuntu 16.04.2 LTS 服务器。

导入池后,我看到:

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

我期望看到的是/mnt/zfsUbuntu 系统下的完全填充的目录树,包含 993GiB 的文件。但我看到的是部分填充的目录树,其中没有文件:

$ tree /mnt/zfs
/mnt/zfs
├── tmp
├── usr
│   ├── home
│   ├── ports
│   └── src
└── var
    ├── audit
    ├── crash
    ├── log
    ├── mail
    └── tmp

我很确定我在这里遗漏了一些基本的东西。

尝试#1:按照 @Zoredache 的建议为 ROOT 设置挂载点,只会导致 ROOT 目录为空:

$ sudo zfs set mountpoint=/mnt/zfs/ROOT zroot/ROOT
$ tree /mnt/zfs
/mnt/zfs
└── ROOT

尝试#2:按照@user121391的建议,为ROOT/default设置一个挂载点,也会产生一个空目录:

$ sudo zfs set mountpoint=/mnt/zfs/ROOT zroot/ROOT/default
$ tree /mnt/zfs
/mnt/zfs

0 directories, 0 files

尝试#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

这很好,但不幸的是这没有帮助。我所寻找的文件位于 下/usr/local/,它没有出现在 的结果中zfs list。但是,如果您查看大小,空间显然已被使用:

zroot/ROOT/default   989G   790G   989G  none
zroot/usr           3.37G   790G    96K  none

尝试#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

答案1

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

...等等(可能可以对此执行-r,但我还没有检查过)。

唯一应该具有挂载点的 zfs 文件系统none是 zroot/ROOT:

zfs set mountpoint=none zroot/ROOT

完成所有这些操作后,您需要导出并重新导入池,并按正确的顺序挂载文件系统:

zpool export zroot

将池导入到新的挂载点但实际上并不挂载任何内容:

zpool import -a -N -r /mnt/zfs

挂载根池:

zfs mount zroot/ROOT/default

安装其他所有东西:

zfs mount -a

答案2

检查该MOUNTPOINT列。看起来没有任何挂载点。您可能需要尝试为数据集设置挂载点。

例如我相信这将会zroot/ROOT达到/mnt/zfs/ROOT

zfs set mountpoint=/mnt/zfs/ROOT zroot/ROOT

我对 ZFS 了解不够,无法告诉您为什么这种情况不会自动发生,或者在导入 Linux 系统时是否应该发生。

答案3

您需要为 zpool 的根设置一个挂载点,然后zfs inherit -r mountpoint <zpool name>递归设置挂载点。之后zfs mount -a挂载所有数据集。

相关内容