ZFS:i/o 錯誤 - 所有塊副本不可用 -zpool 不可用
伺服器重新啟動在控制台上產生了以下輸出:
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
,因為主機只是充當監獄的平台。但是,缺少根數據集對我來說很麻煩。A
zpool 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
非常小,缺乏所需的所有功能。