今天安装新硬件时,我不小心切断了其中一台服务器的电源。这台服务器运行的是 FreeBSD 10,安装程序提供了 Root-on-ZFS。它总共有 36 个磁盘,分布在两个 RAID-Z2 中,它们属于同一个池(称为zroot
)。
重新打开服务器后,服务器将无法启动。在启动菜单出现之前,会打印以下消息:
Loading /boot/defaults/loader.conf ZFS: i/o error - all block copies unavailable Warning: error reading file /boot/loader.conf
尽管有这些消息,系统仍继续引导内核,直到它在提示符处停止mountfrom>
,我无法让它从那里继续。如果我输入zfs:zroot/ROOT/default
,它只会显示unknown filesystem
。
但是我可以从 USB 启动,导入 zpool,并且可以读取/boot/defaults/loader.conf
和/boot/loader.conf
。事实上,zpool 看起来完全没问题。
然后我尝试重新安装引导代码:
gpart bootcode -b /tmp/zroot/boot/pmbr -p /boot/gptzfsboot -i 1 da0
我尝试重新创建 zpool 缓存文件:
zpool set cachefile=/tmp/zroot/boot/zfs/zpool.cache zroot
我曾尝试手动告诉引导加载程序加载 ZFS 模块。
所有这些尝试仍然导致相同的行为,现在我完全不知道该做什么才能让系统重新启动。
编辑:
输出zpool list
:
$ zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
zroot 97.8T 28.0T 69.7T 28% 1.33x ONLINE /tmp/zfs
目前系统是从 USB 启动的,因此我无法将池导入/
内容/boot/loader.conf
:
$ cat /boot/loader.conf
zfs_load="YES"
ipmi_load="YES"
编辑2:
$ zpool status
pool: zroot
state: ONLINE
scan:
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
gptid/f8c57b3a-083e-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/f97b7e8b-083e-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/fa3c41d9-083e-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/faf62101-083e-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/fbb19e1b-083e-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/fc6b75db-083e-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/fd26cd36-083e-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/fddb4b8e-083e-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/fe9a55f6-083e-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/ff582110-083e-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/001713d1-083f-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/00d90b6c-083f-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/0192be91-083f-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/023ea058-083f-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/02fb8ee4-083f-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/03ab78ec-083f-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/04632542-083f-11e4-b11b-002590e745f4 ONLINE 0 0 0
gptid/052144fd-083f-11e4-b11b-002590e745f4 ONLINE 0 0 0
raidz2-1 ONLINE 0 0 0
da18 ONLINE 0 0 0
da19 ONLINE 0 0 0
da20 ONLINE 0 0 0
da21 ONLINE 0 0 0
da22 ONLINE 0 0 0
da23 ONLINE 0 0 0
da24 ONLINE 0 0 0
da25 ONLINE 0 0 0
da26 ONLINE 0 0 0
da27 ONLINE 0 0 0
da28 ONLINE 0 0 0
da29 ONLINE 0 0 0
da30 ONLINE 0 0 0
da31 ONLINE 0 0 0
da32 ONLINE 0 0 0
da33 ONLINE 0 0 0
da34 ONLINE 0 0 0
da35 ONLINE 0 0 0
errors: No known data errors
答案1
好吧,别在意我在另一个回答中说了什么。无论如何,如果您遇到 ZFS 分区问题,您将无法启动单用户模式。有趣的是,在我发布答案后,我又遇到了电源问题,无法启动系统,就像您的问题一样。
所以我做了以下事情来恢复。
我使用了FreeBSD 10.0-RELEASE
Live CD(bootonly
我认为是为了最大限度地减少下载)
- 启动 CD 并从选项中选择“Live CD”。(以 身份登录
root
) 执行以下命令来使用附加分区
geli
;如果您有 root-on-ZFS 全盘加密设置,则必须输入密码mkdir /tmp/bootpool zpool import -f bootpool zfs set mountpoint=/tmp/bootpool bootpool zfs mount -a cp /tmp/bootpool/boot/encryption.key /tmp/ zfs umount -a zfs set mountpoint=/bootpool bootpool zpool export bootpool geli attach -k /tmp/encryption.key /dev/ada0p4 zpool import -f -R /mnt zroot
我必须zpool import
使用-f
标志,因为断电问题没有export
以正确的方式进行分区。
执行这些命令后,我重新启动了系统并且系统再次上线。
但是,我遇到了另一个问题,即bootpool
启动后无法正确加载。
该/boot
文件夹是空的,它也是指向目录的符号链接/bootpool/boot
。我还发现,在导入它创建的 zfs bootpool 分区时,/bootpool/boot/boot
问题出boot
在 下的 2 个文件夹中/bootpool
。
因此我之后执行了此操作reboot
以手动加载启动池。
zpool export bootpool
zpool import -f bootpool
(cd to root and remove the old symbolic link `boot`)
cd /
rm boot
(notice the double `boot` directory issue)
ln -sf bootpool/boot/boot/
就是这样,/boot 符号链接再次起作用,我可以加载丢失的内核模块kldload linux
或其他任何东西。
希望这会有所帮助,如果有人知道上述启动池问题的干净解决方法,请与我分享。
谢谢,
德拉科
参考:
答案2
您是否尝试过启动单用户模式并强制挂载 ZFS 分区?
# zfs mount -a
我的 FreeBSD 10(也是 Root-on-ZFS)遇到了电源故障,我设法使用上述命令让它启动。
让我知道事情的后续。