服务器重新启动在控制台上产生了以下输出:
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 启动主机并在 /tmp 下挂载 /etc 目录以启用 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 没有错误。
接下来,我使用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
了,但是即使我有任何东西可以获取,因为系统已经在 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 被占用,那么只有当托架 0 或托架 2 中的至少一个同样被占用时,系统才会启动。配置 0-,1A,2-,3B 不会启动。我不知道为什么会这样。
此错误(当服务器无法从 zfs 根池引导,但在另一台机器上导入时池似乎完全完好)通常表明引导块(内核部分和加载器正在搜索的其他文件,而不是实际的加载器块)迁移到推测的 1024 千兆字节以外的地方,已知引导加载程序可以到达它们,现在它们位于很远的地方,它不能。
这是一个广为人知的 FreeBSD gptzfsboot 加载程序问题。不幸的是,这些引导块在安装后被放置在分区的开头附近,它就像一个带电的定时炸弹,爆炸的时间未知。
因此建议(不幸的是,有经验的人 - 不是由手册和 bsdinstall 建议)具有小于 1 TB 的 zfs 根池。不知道这些小根池会受到影响。
另一个解决方案似乎是(至少有报道)切换到 UEFI 引导加载程序:在处理大磁盘时它更大,功能更强大;
gptzfsboot
非常小,缺乏所需的所有功能。