.zfs 文件夹丢失,但快照仍然存在且可安装(inode 问题?)

.zfs 文件夹丢失,但快照仍然存在且可安装(inode 问题?)
$ sudo zfs list -t snapshot | grep childDataset3

一大堆都按预期列出(例如pool/dataset/childDataset3@today)

$ ls /pool/dataset/childDataset3/.zfs
ls: cannot access '/pool/dataset/childDataset3/.zfs': No such file or directory

我有其他子数据集,我可以看到 .zfs 中的快照目录;而且,我甚至可以从一个麻烦的数据集中挂载上述列表中的快照(因此它们存在,只是不像用户可以进入的正常位置的一个好列表):

$ sudo mkdir /mnt/tempShadow
$ sudo mount -t zfs pool/dataset/childDataset3@today /mnt/tempShadow

即我可以通过这种方式浏览文件的一个快照;同样值得注意的是,当我使用 show inodes 运行磁盘文件系统命令时,所有工作数据集和子数据集都会显示出来,除了我遇到问题的数据集(我称之为“childDataset3”):

$ df -i

pool                               232594013966       9 232594013957    1% /pool
pool/dataset                       232600679652 6665695 232594013957    1% /pool/dataset
pool/dataset/childDataset1         232596006126 1992169 232594013957    1% /pool/dataset/childDataset1
pool/dataset/childDataset2         232594839509  825552 232594013957    1% /pool/dataset/childDataset2
pool/dataset/childDataset4         230211379723 3040916 230208338807    1% /pool/dataset/childDataset4

那么有没有办法重新创建子数据集的 inode?(如果我说错了请原谅我)

如果有必要,请使用 zfs 版本 0.7.12-2+deb10u2

我的备份解决方案是将用户切换到复制的数据集(在另一台服务器上),然后销毁该数据集,然后发回快照(但我想避免这种情况,因为 32TB 不会突然出现)

答案1

.zfs目录很特殊:首先尝试 chdir 进入该目录,然后列出它。

换句话说:cd /pool/dataset/childDataset3/.zfs/ ; ls

答案2

因为似乎没有人有答案(或者他们有,但只是找不到我的帖子),所以我会回答我的问题:

请注意,尽管在这个出现故障的子数据集上正在制作新的快照,并且我至少可以挂载这些快照(尽管无法浏览 .zfs/snapshot)......当我查看所述挂载时,我现在看到新文件是不是那里,快照占用了 0B 的空间,而 zfs 列表没有显示使用的空间正在增长(就像“du -s /pool/dataset/childDataset3”会显示的那样)

并且,如果我“sudo zfs rename pool/dataset/childDataset3 pool/dataset/childDataset3-bad”,/pool/dataset/childDataset3 文件夹仍然存在包含所有数据,路径为 /pool/dataset/childDataset3-bad不存在,尽管 zfs 认为它​​存在并且占用空间;即我的问题是文件夹和数据集以某种方式共存(例如当您创建一个新的数据集并且文件夹已经存在时:您会收到一个非空错误并且可以轻松地重新创建我遇到的故障)

解决方案: 重命名虚假数据集,销毁虚假数据集,创建一个新的数据集(与之前虚假数据集使用的旧名称相同),然后将数据移回(使用 rsync 并删除源标志):

注意:如果您在移动(即重命名)文件夹时遇到错误,那么您遇到的问题与我遇到的问题不同(如果 mv 命令导致错误,请不要破坏您的数据集)

mv /pool/dataset/childDataset3 /pool/dataset/childDataset3-folder
sudo zfs destroy -r pool/dataset/childDataset3
sudo zfs create pool/dataset/childDataset
sudo chown yourUsername /pool/dataset/childDataset
rsync -auAXv --remove-source-files /pool/dataset/childDataset3-folder/ /pool/dataset/childDataset3/ > moveLogs.txt &
# I had to wait a couple weeks (I'm copying 50TB)
find /pool/dataset/childDataset3-folder -empty -type d -delete
# you can run the above find command whenever, and when rsync is done, the find command will remove childDataset3-folder (and if you rsync bails, you can re-run that too)

免责声明:请了解运行诸如 destroy 之类的命令时所做的事情,尤其是使用递归命令(或在 rsync 中使用 --remove-source-files);我还假设没有人使用坏数据集(也不涉及备份之类的操作)

相关内容