服务器重启后控制台上产生以下输出:
ZFS: i/o error - all block copies unavailable
ZFS: failed to read pool zroot directory object
qptzfsboot: failed to mount default pool zroot
FreeBSD/x86 boot
ZFS: i/o error - all block copies unavailable
ZFS: can't fild dataset 0
Default: zroot/<0x0>
boot:
我从 usb livecd 启动主机并将 /etc 目录挂载在 /tmp 下以启用 ssh 访问:
ifconf -a # get available i/f names
ifconf em0 inet 192.168.216.46
route add default 192.168.216.1
hostname vhost06.internal
mkdir /tmp/etc
mount_unionfs /tmp/etc /etc
echo 'PermitRootLogin yes' >> /etc/sshd_config
passwd
Changing local password for root
New Password:
Retype New Password:
service sshd onestart
没有可供导入的 zfs 池:
root@vhost06:~ # zpool status
no pools available
root@vhost06:~ # zpool list
no pools available
root@vhost06:~ # zfs list
no datasets available
gpart
显示此几何形状:
gpart 显示
=> 40 15628053088 ada0 GPT (7.3T)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 16777216 2 freebsd-swap (8.0G)
16779264 15611273216 3 freebsd-zfs (7.3T)
15628052480 648 - free - (324K)
=> 40 15628053088 ada1 GPT (7.3T)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 16777216 2 freebsd-swap (8.0G)
16779264 15611273216 3 freebsd-zfs (7.3T)
15628052480 648 - free - (324K)
=> 40 15628053088 ada2 GPT (7.3T)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 16777216 2 freebsd-swap (8.0G)
16779264 15611273216 3 freebsd-zfs (7.3T)
15628052480 648 - free - (324K)
=> 40 15628053088 ada3 GPT (7.3T)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 16777216 2 freebsd-swap (8.0G)
16779264 15611273216 3 freebsd-zfs (7.3T)
15628052480 648 - free - (324K)
=> 40 15628053088 diskid/DISK-VAGWJ6VL GPT (7.3T)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 16777216 2 freebsd-swap (8.0G)
16779264 15611273216 3 freebsd-zfs (7.3T)
15628052480 648 - free - (324K)
=> 40 15628053088 diskid/DISK-VAGWV89L GPT (7.3T)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 16777216 2 freebsd-swap (8.0G)
16779264 15611273216 3 freebsd-zfs (7.3T)
15628052480 648 - free - (324K)
=> 40 15628053088 diskid/DISK-VAHZAD2L GPT (7.3T)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 16777216 2 freebsd-swap (8.0G)
16779264 15611273216 3 freebsd-zfs (7.3T)
15628052480 648 - free - (324K)
=> 40 15628053088 diskid/DISK-VAH3PXYL GPT (7.3T)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 16777216 2 freebsd-swap (8.0G)
16779264 15611273216 3 freebsd-zfs (7.3T)
15628052480 648 - free - (324K)
=> 1 30240767 da0 MBR (14G)
1 1600 1 efi (800K)
1601 2012560 2 freebsd [active] (983M)
2014161 28226607 - free - (13G)
=> 0 2012560 da0s2 BSD (983M)
0 16 - free - (8.0K)
16 2012544 1 freebsd-ufs (983M)
=> 1 30240767 diskid/DISK-00241D8CE51BB011B9A694C1 MBR (14G)
1 1600 1 efi (800K)
1601 2012560 2 freebsd [active] (983M)
2014161 28226607 - free - (13G)
=> 0 2012560 diskid/DISK-00241D8CE51BB011B9A694C1s2 BSD (983M)
0 16 - free - (8.0K)
16 2012544 1 freebsd-ufs (983M)
我怎样才能从这里恢复过来?
<------ 原始问题结束
我取得了一些进展,并成功导入和挂载了一个根数据集 - iocage。这是一个在 zfs 系统上启动但是我找不到包含根文件系统的数据集,所以我无法访问 /var/log 来查看其中是否有任何内容:
mkdir /tmp/zroot # /tmp is a writable file system
zpool -f zroot # force the zpool import
zfs set mountpoint=/tmp/zroot zroot # mount the imported pool in a writable fs
zfs mount -a # find and mount all the datasets
ll /tmp/zroot
total 12
drwxr-xr-x 9 root wheel 11 Feb 27 13:09 iocage/
幸运的是,所有绝对关键的东西都已存在,/zroot/iocage
因为主机只是充当监狱的平台。然而,缺少根数据集对我来说很麻烦。
Azpool status
显示 zroot 没有错误。
接下来我使用将 iocage 数据集传输到另一个系统zfs send
。
zfs snapshot -r zroot/iocage@vh6iocsend1
zfs send -R zroot/iocage@vh6iocsend1 | ssh 192.168.216.45 zfs receive zroot/iocagev6
这花了一段时间但已成功完成。
现在我需要启动有问题的主机。昨天中午重新启动了该主机,没有任何问题。我不记得运行过freebsd-update fetch
,但即使我运行过,fetch 也没有任何内容可以传送,因为系统已经处于 12.1p2
我仍然需要帮助来启动主机。
<----------
补充笔记:
zpool
我能够使用altroot
以下选项挂载整个zpool import
:
- 启动进入 live cd shell。
- 导入 zfs 池但不允许
import
自动挂载任何数据集:zpool import -o altroot=/tmp/altroot -N -a
。 /
首先挂载根数据集:zfs mount zroot/ROOT/default
。- 现在安装剩余的数据集:
zfs mount -a
。
zroot
现在可以通过 访问整个池的文件系统/tmp/altroot
。
我曾用它将zfs send
的内容移至/var
另一台主机。实际上,我发送了整个池。
但原有系统仍然无法启动。
答案1
作为最后的手段,我从无法启动的主机上拔下了四个硬盘,并将它们放在配置相同的服务器上。该服务器从这些硬盘启动。显然是硬件问题。
新主机上仍存在异常:如果托架 1 被占用,则只有托架 0 或托架 2 中至少有一个被占用时,系统才会启动。配置 0-、1A、2-、3B 将无法启动。我不知道为什么会这样。
答案2
此错误(当服务器无法从 zfs 根池启动,但在另一台机器上导入时池似乎完好无损时)通常表示引导块(加载器正在搜索的内核部分和其他文件,而不是实际的加载器块)已经迁移到假定的 1024 千兆字节之外的某个地方,已知引导加载器能够到达它们,而现在它们位于某个很远的地方,引导加载器无法到达。
这是众所周知的 FreeBSD gptzfs 引导加载程序问题。不幸的是,这些引导块在安装后被放置在分区的开始处附近,因此它就像一颗定时炸弹,爆炸时间未知。
因此,建议(不幸的是,经验丰富的人建议 - 不是手册也不是 bsdinstall)将 zfs 根池设置为小于 1 TB。据了解,这些小根池不会受到影响。
另一个解决方案似乎是(至少据报道)切换到 UEFI 引导加载程序:在处理大磁盘时,它更大并且功能更强大;但gptzfsboot
它非常小并且缺乏所需的所有功能。