重启后 zfs 数据集丢失

重启后 zfs 数据集丢失

我有一个压缩的加密 zfs 数据集,它似乎已经完全丢失了。谷歌搜索到了很多“zfs 丢失数据集”或类似的内容,它们几乎总是类似于数据集未自动挂载,但它实际上仍然存在。在我看来,这似乎不是问题所在。我看不到数据集的任何迹象,但历史记录中没有任何内容表明它被销毁了。

root@ryzen:~# zpool history epool
History for 'epool':
2020-06-05.18:15:43 zpool create -f -m /extra epool /dev/disk/by-id/ata-WDC_WD80EFAX-68KNBN0_VDJ8GVBD
2020-06-05.18:17:02 zfs create epool/USERDATA
2020-06-05.18:18:14 zfs set mountpoint=none epool
2020-06-05.18:20:20 zfs create -o mountpoint=/extra/ian epool/USERDATA/ian_i01gxn
2020-06-06.00:32:47 zpool import -c /etc/zfs/zpool.cache -aN
2020-06-06.00:44:55 zpool attach epool /dev/disk/by-id/ata-WDC_WD80EFAX-68KNBN0_VDJ8GVBD /dev/disk/by-id/ata-WDC_WD80EFAX-68KNBN0_VDJ63U4K
2020-06-07.23:24:31 zfs set compression=on epool
2020-06-07.23:29:21 zfs rename epool/USERDATA/ian_i01gxn epool/USERDATA/ian_i01gxn_old
2020-06-07.23:35:23 zfs create -o compression=on -o encryption=on -o keyformat=passphrase epool/USERDATA/ian_i01gxn
2020-06-07.23:35:45 zfs set mountpoint=/extra/ian2 epool/USERDATA/ian_i01gxn
2020-06-08.12:32:30 zfs set mountpoint=/extra/ian epool/USERDATA/ian_i01gxn
2020-06-08.12:34:18 zfs destroy epool/USERDATA/ian_i01gxn_old
2020-06-14.00:24:11 zpool scrub epool
2020-06-18.17:37:32 zpool import -c /etc/zfs/zpool.cache -aN
2020-06-18.17:40:31 zfs load-key epool/USERDATA/ian_i01gxn
2020-06-18.18:47:25 zpool import -c /etc/zfs/zpool.cache -aN
2020-06-18.18:50:09 zfs load-key epool/USERDATA/ian_i01gxn
2020-06-18.19:26:06 zpool set autoexpand=on epool
2020-06-27.01:18:08 zpool import -c /etc/zfs/zpool.cache -aN
2020-06-27.02:31:48 zpool import -c /etc/zfs/zpool.cache -aN
2020-06-27.02:49:49 zpool import -c /etc/zfs/zpool.cache -aN

这显示了在镜像池上创建数据集 epool/USERDATA/ian_i01gxn。然后我往里面填了一些东西。之后我认为我应该对它进行加密和压缩,所以我重命名了它,创建了另一个加密和压缩数据集,复制了文件,并销毁了原始数据集。此后一切都运行正常,您可以看到系统重新启动了几次,我重新加载了密钥。昨晚我又进行了一次内核升级,并对 BIOS 配置进行了一些小调整,这需要重新启动几次。现在数据集 epool/USERDATA/ian_i01gxn 已经消失了:

root@ryzen:~# zfs load-key epool/USERDATA/ian_i01gxn
cannot open 'epool/USERDATA/ian_i01gxn': dataset does not exist

root@ryzen:~# zfs list 
NAME                                               USED  AVAIL     REFER  MOUNTPOINT
bpool                                              750M  1.02G       96K  none
bpool/BOOT                                         746M  1.02G       96K  none
bpool/BOOT/ubuntu_xqma33                           746M  1.02G      196M  /boot
bpool/BOOT/ubuntu_xqma33/grub                     16.6M  1.02G     7.46M  /boot/grub
epool                                             29.1M  7.04T      104K  none
epool/USERDATA                                      96K  7.04T       96K  none
rpool                                              569G  1.19T      192K  none
rpool/ROOT                                         254G  1.19T      192K  none
rpool/ROOT/ubuntu_xqma33                           254G  1.19T     25.0G  /
....

root@ryzen:~# zpool list
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
bpool  1.88G   750M  1.14G        -         -     5%    39%  1.00x    ONLINE  -
epool  7.27T  29.8M  7.27T        -         -     0%     0%  1.00x    ONLINE  -
rpool  1.80T   569G  1.25T        -         -    13%    30%  1.00x    ONLINE  -

zpool 列表显示池中只分配了几 MB,而实际上应该有几 TB。我可以恢复大部分数据,因为这是最近的硬盘升级,我仍有旧硬盘,但我使用带有镜像磁盘的 ZFS,这样我就再也不用担心数据丢失了(合理的定义是“永不”。所以这很可怕,我似乎丢失了数据。有人知道发生了什么吗?

答案1

我刚刚在 Ubuntu 20.04 上遇到了同样的问题。但在我的例子中,由于系统锁定而强制关机后加密数据集消失了。

我发现当我运行“zpool history -i poolname”来获取更多详细信息时,其中“poolname”是包含加密数据集的池 - 加密数据集在某个时候被明确销毁!

所以也请检查一下你的。鉴于这是一个明确的破坏,我不认为这是一个 ZFS 错误,而是一个 Ubuntu 20.04 错误。我仍在调查,但我认为在这种情况下,某些启动时服务正在出于某些不正当的原因清理数据集。

编辑:似乎其他人在最近几个月也遇到了这个问题。怀疑是 Ubuntu 的 Zsys。有关更多信息,请参阅此答案和评论:为什么 ZFS 上的 Ubuntu 20.04 会在启动时 zpool.cache 的 zpool 导入时破坏自定义数据集?

再次编辑:以防万一,也许可以节省你一些时间 - 我们确实遇到了这个错误https://github.com/ubuntu/zsys/issues/103,出于某些原因,该网站已被关闭。在我们的两个案例中,并不是数据集被加密,而显然只是它在 USERDATA 数据集中。我必须阅读更多内容,但这对我来说似乎不合理。

相关内容